
程序功能:一个链表从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是逆序前的最后一个,逆序后是第一个,所以用头指向他
画个图好好体会下,楼主!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)