删除带头结点的链表中所有值为x的结点 发表于 2019-06-20 | 分类于 数据结构自学史 | 阅读次数: 题目描述 假设用带头结点的单链表作为线性表的存储结构,编写算法,删除线性表中所有值为x的结点 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263#include <stdio.h>#include <stdlib.h>//链表的结构体定义typedef struct Link{ int elem; struct Link *next;}link;//链表初始化函数link *initLink(){ //先搞个头结点粗来 link *p=(link*)malloc(sizeof(link)); //再弄个工作指针,初始指向头结点p link *temp=p; for(int i=1;i<5;++i){ //想初始化,得有原料,那就是一个一个的节点,现在还没有节点,那先搞一个粗来 link *a=(link*)malloc(sizeof(link)); //光有空壳不够,该赋值了(对link结构体中的elem赋值) a->elem=i; //有了原料节点,就用一根绳子把它们串起来(对link结构体中的next指针赋地址值) temp->next=a;//串起来啦 temp=a;//工作指针temp后移,准备迎接下一个节点的到来 }printf("\n");//为了颜值和正义而生//串完之后,原来的头结点p身后就有了一大堆节点return p;//return试试看}//打印初始化好的链表元素函数void display(link *p){ link *x=p;//x初始指向头结点 while(x->next){ x=x->next; printf("%d",x->elem); }printf("\n");}link *del(link *p,int x){ link *r=p->next;//r用来自遍历,初始指向第一个元素节点 link *q=p;//q是r的前驱 while(r!=NULL){ if(r->elem!=x){ q=r; r=r->next; }//if else{ q->next=r->next; r=r->next; }//else }//while return q;}int main(){ //初始化链表(1,2,3,4) printf("初始化链表为:\n"); link *p=initLink(); display(p); printf("删除链表中元素值为4的结点之后的链表为:\n"); del(p,4); display(p);} 运行结果 1234初始化链表为:1234删除链表中元素值为4的结点之后的链表为:123 喜欢所以热爱,坚持干货分享,欢迎订阅我的微信公众号 呐,请我吃辣条 打赏 微信支付 支付宝