c语言单链表程序,有段程序意思不明白,求解读

c语言单链表程序,有段程序意思不明白,求解读,第1张

创建单链表与main程序省略

程序功能:一个链表从i开虚举此始到len删除,

HeadLink *delinsert(HeadLink *head,int i,int len){

HeadLink *p,*q,*u

int k=1

if(i<1||len<1){ /*如果i and len 都小于1,提示错误结束函数*/

printf("error")

exit(0)

}

p=head /*p保存链表头指针*/

while(p&&k<i){/*让p指向将要删除结点的前一个结点*/

k++

p=p->next

}

if(k<i){ /*本来上面就已经给出了判断k<i 这段程序什么意思?*/

//如果上面的循环是因为p==NULL结束掉的,那么说明给定的i超出链表长度了

printf("error")

exit(0)

}

q=p->next /*q指向了将要删除的结点*/

k=1

while(q&&k<len){

k++

u=q /*这段程序我没读懂,u只是在这行和下面一行出现过*/

//这儿必须要这样,这是记录要删除的结点的地址,不然你下面直接指向到下一个结点,你就找不到要删除的答喊结点了,也就删除不差迅了了

q=q->next /*q最后将移位到要删除的末尾位置*/

free(u) /*第二次出现是直接被释放了*/

//因为是要删除结点,这儿当然要释放,动态申请的内存就是要这样释放掉

}

if(k<len){

printf("%d too big \n",len)

exit(0)

}

p->next=q /*删除了结点*/

}

算法的核心就是reverse函数,其它的都是辅助建立链表和输出链表的。

从数据结构的定义来看这是一个带头节点的链表。要弄的十分明白你要耐心点画图看看。我简单的说下思路:

【head是指向头结点的】

p=head //p最开始指向头结点

s=p->next//s最开始指向第一个节点

while(s->next!=NULL)//只要没有到最后一个元素就继续。最后一个元素的next肯定为NULL

{ //进入核心了楼主

t=s->next //用t指向s后面的那个元素

s->next=p//把s指向她前面那个,这个时候就实现了逆向了。而且是就地逆向。元素都没有动的

p=s//然后p向后移动s

s=t//s向后移动到p

这样到下一轮的时候又可神胡肆以讲下下个再指向刚才那个下一个。一次内推

}

s->next=p //当最后一个的时候,还是要指向她的前一个。

head->next->next=NULL/游轿/头指针的下一个是指向原来的第一个。逆向后肯定是最后的那个了。所以最后的一个的next=NULL就明了了。

head->next=s//做烂s是逆序前的最后一个,逆序后是第一个,所以用头指向他

画个图好好体会下,楼主!


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8206555.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-14
下一篇2023-04-14

发表评论

登录后才能评论

评论列表(0条)

    保存