单链表的查找和删除

xiaoxiao2021-02-28  23

单链表的删除操作需要注意的地方: 删除之前必须先找到要删结点的前驱结点,所以在查找判断条件要用p->next!=NULL任何要改变链表本身的操作(如增加,删除,),都不能乱动头结点的位置,而是需要额外定义一个指针指向头结点,然后用这个指针操作 #include <iostream> #include<stdlib.h> typedef struct LNode{ int data; struct LNode *next; }LNode; void createLink(LNode *&p,int arr[],int n){//尾插法创建单链表 int i; LNode *s,*r; p=(LNode *)malloc(sizeof(LNode)); p->next=NULL;//创建头结点 r=p;//坑点:头结点一定不能乱动 for(i=0;i<n;i++){ s=(LNode *)malloc(sizeof(LNode)); s->data=arr[i]; r->next=s; r=s; } r->next=NULL; } int del(LNode *&p,int key){//删除结点 LNode *r,*q; r=p;//坑点:要改变链表的操作中,一定不能乱动头结点,而是重新定义一个结点指向头结点 while(r->next!=NULL){//这里用p->next判断是为了找到要删除的前驱结点 if(r->next->data==key){//先找到要删除结点的前驱结点 q=r->next; r->next=q->next; free(q); return 1; } r=r->next; } return 0; } void print(LNode *p){ LNode *q; q=p->next; while(q!=NULL){ printf("%d ",q->data); q=q->next; } printf("\n"); } int main(int argc, char** argv) { LNode *p; int arr[]={12,5,89,47,22,36}; createLink(p,arr,6); printf("删除前: "); print(p); del(p,47); printf("删除后: "); print(p); return 0; }
转载请注明原文地址: https://www.6miu.com/read-2650269.html

最新回复(0)