拓冰建站拓冰建站
首页 / 资讯中心 / 正文

链表所犯错误笔记

链表错题精简笔记1. 结构体自引用指针报错错误代码typedefstructNode{intdata;Node*next;// 结构体内部不能用Node别名}Node,*LinkList;修改方案typedefstructNode{intdata;structNode*next;// 内部自引用必须写struct Node*}Node,*LinkList;说明typedef别名定义完成前结构体内部识别不到Node。2. ListDelete 删除逻辑错误错误代码intListDelete(LinkList head,inti,int*e){// ...if(pre-nextNULL){// 赋值而非判断return0;}Node*del(Node*)malloc(sizeof(Node));// 新建节点没指向待删节点*edel-data;pre-nextdel-next;free(del);return1;}修改方案intListDelete(LinkList head,inti,int*e){// ...if(preNULL||pre-nextNULL){// 使用判断空return0;}Node*delpre-next;// del指向原有待删节点*edel-data;pre-nextdel-next;free(del);return1;}说明混淆赋值与判断错误新建节点造成内存泄漏、数据读取错误。3. DeleteNode 循环内提前释放节点错误代码while(pp-data!e){prep;pp-next;free(p);// 循环内直接释放、return无法完整遍历return1;}修改方案while(pp-data!e){prep;pp-next;}if(p){pre-nextp-next;free(p);return1;}return0;说明删除操作要遍历完成后执行所有分支必须有return。4. ShowList 死循环错误代码while(p){printf(%d ,p-data);// 无pp-next指针不移动}修改方案while(p){printf(%d ,p-data);pp-next;// 指针后移}说明遍历链表必须更新指针否则卡死循环。5. main打印变量误用错误代码printf(99的元素位置%d\n,val);// val存删除的值不是下标修改方案printf(99的元素位置%d\n,LocateElem(L,99));说明需要调用查找函数获取元素位置。#includestdio.h#includestdlib.htypedefstructNode{intdata;structNode*next;}Node,*LinkList;LinkListCreateList(){LinkList head(LinkList)malloc(sizeof(Node));head-nextNULL;returnhead;}voidHeadInsert(LinkList head,inte){Node*p(Node*)malloc(sizeof(Node));p-datae;p-nexthead-next;head-nextp;}voidTailInsert(LinkList head,inte){Node*p(Node*)malloc(sizeof(Node));p-datae;p-nextNULL;Node*qhead;while(q-next){qq-next;}q-nextp;}intListInsert(LinkList head,inti,inte){Node*prehead;intj;for(j1;jipre!NULL;j){prepre-next;}if(preNULL){return0;}Node*newp(Node*)malloc(sizeof(Node));newp-datae;newp-nextpre-next;pre-nextnewp;return1;}intListDelete(LinkList head,inti,int*e){Node*prehead;intj;for(j1;jipre!NULL;j){prepre-next;}if(pre-nextNULL){return0;}Node*delpre-next;*edel-data;pre-nextdel-next;free(del);return1;}intDeleteNode(LinkList head,inte){Node*prehead;Node*phead-next;while(pp-data!e){prep;pp-next;}if(!p)return0;pre-next-p-next;free(p);return1;}//功能3 查找值为e的节点返回位置查不到返回0intLocateElem(LinkList head,inte){Node*phead-next;intpos1;while(p){if(p-datae){returnpos;}pp-next;pos;}return0;}//获取第i个位置的数据intGetElem(LinkList head,inti,int*e){Node*phead-next;intj;for(j1;ji;j){pp-next;}if(!p)return0;*ep-data;return1;}//功能5计算链表有效长度intGetLength(LinkList head){Node*phead-next;intlen0;while(p){len;pp-next;}returnlen;}//清空所有数据节点voidClearList(LinkList head){Node*p,*temp;phead-next;while(p){tempp-next;free(p);ptemp;}head-nextNULL;}//遍历并打印所有元素voidShowList(LinkList head){Node*phead-next;while(p){printf(%d ,p-data);pp-next;}printf(\n);}//销毁整条链表释放全部申请的堆内存voidDestroyList(LinkList head){ClearList(head);free(head);}intmain(){LinkList LCreateList();TailInsert(L,10);TailInsert(L,20);TailInsert(L,30);printf(原始链表);ShowList(L);ListInsert(L,2,99);printf(在第2位插入99: );ShowList(L);intval;ListDelete(L,3,val);printf(删除第三个元素%d,链表,val);ShowList(L);//查找元素位置printf(99的元素位置%d\n,LocateElem(L,99));//获取指定位置值GetElem(L,2,val);printf(第二位的值%d\n,val);//获取链表长度printf(链表当前长度%d\n,GetLength(L));DeleteNode(L,20);printf(删除20之后);ShowList(L);DestroyList(L);return0;}
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门