您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 链表的C语言实现之删除结点
链表的C语言实现之删除结点假如我们已经知道了要删除的结点p的位置,那么要删除p结点时只要令p结点的前驱结点的链域由存储p结点的地址该为存储p的后继结点的地址,并回收p结点即可。以下便是应用删除算法的实例:#include<stdio.h>#include<malloc.h>#include<string.h>#defineN10typedefstructnode{charname[20];structnode*link;}stud;stud*creat(intn)/*建立新的链表的函数*/{stud*p,*h,*s;inti;if((h=(stud*)malloc(sizeof(stud)))==NULL){printf(不能分配内存空间!);exit(0);}h->name[0]=’\0’;h->link=NULL;p=h;for(i=0;i<n;i){if((s=(stud*)malloc(sizeof(stud)))==NULL){printf(不能分配内存空间!);exit(0);}p->link=s;printf(请输入第%d个人的姓名,i1);scanf(%s,s->name);s->link=NULL;p=s;}return(h);}stud*search(stud*h,char*x)/*查找函数*/{stud*p;char*y;p=h->link;while(p!=NULL){软件开发网y=p->name;if(strcmp(y,x)==0)return(p);elsep=p->link;}if(p==NULL)printf(没有查找到该数据!);}stud*search2(stud*h,char*x)/*另一个查找函数,返回的是上一个查找函数的直接前驱结点的指针,*//*h为表头指针,x为指向要查找的姓名的指针*//*其实此函数的算法与上面的查找算法是一样的,只是多了一个指针s,并且s总是指向指针p所指向的结点的直接前驱,*//*结果返回s即是要查找的结点的前一个结点*/{stud*p,*s;char*y;p=h->link;s=h;while(p!=NULL){y=p->name;if(strcmp(y,x)==0)return(s);else{p=p->link;s=s->link;}}if(p==NULL)printf(没有查找到该数据!);}voiddel(stud*x,stud*y)/*删除函数,其中y为要删除的结点的指针,x为要删除的结点的前一个结点的指针*/{stud*s;s=y;x->link=y->link;free(s);}main(){intnumber;charfullname[20];stud*head,*searchpoint,*forepoint;number=N;head=creat(number);printf(请输入你要删除的人的姓名:);scanf(%s,fullname);searchpoint=search(head,fullname);forepoint=search2(head,fullname);del(forepoint,searchpoint);}软件开发网
本文标题:链表的C语言实现之删除结点
链接地址:https://www.777doc.com/doc-1973686 .html