读书人

不理解的链表!解决办法

发布时间: 2012-02-15 12:09:44 作者: rapoo

不理解的链表!!!
struct stu *turnback(struct stu *head)
{
struct stu *ne,*newhead,*temp;
p2=head;
p1=head-> next; \\大家对这个有什么理解吗?我的理解就是P指向了这块内存区。
head-> next=NULL; \\??但这里让我很迷糊,给它赋值为空,那么下面的循环不要成死循环吗??可能是我的理解有错吧,望高手指教!
while(p1!=NULL)
{

temp=p1-> next;
p1-> next=p2;
p2=p1;
p1=temp;
}
newhead=p2;
return(newhead);
}

[解决办法]
struct stu *turnback(struct stu *head)
{
struct stu *ne,*newhead,*temp;
p2=head; //首先将外面传进来的链表头存储起来
p1=head-> next; //找到下一个元素并传给P1保存
head-> next=NULL; //释放head-> next指针,其后的内存并没有释放,只是相当于第一个元素从这个链表脱离开了
while(p1!=NULL) //注意此时,P1里面保存的是原来链表的第二个元素
{

temp=p1-> next;
p1-> next=p2;
p2=p1; //这段代码循环完成查找新头,分析后可发现,返回的新头是原链表中的最后一个元素
p1=temp;
}
newhead=p2;
return(newhead);
}
综上所述,本段程序返回原链表的最后一个元素 ,做为新链表的头
[解决办法]
打个比方,A牵着B的手,B牵着C的手(head相当于A)

p1=head-> next(p1就是A牵着的那个人,就是B)

head-> next=NULL(这个时候A(head)不再牵任何人的手,松开了牵着B的手)

此时,B仍然牵着C的手,即p1-> next!=NULL成立,执行循环语句。

不难理解,循环语句的作用是把链表倒置。
[解决办法]
赋值和指向没有什么可比性。=就是赋值符号嘛,指向嘛是因为赋值才发生的,比如说head-

> next=NULLSH是一个赋值语句,结果是使得head的指针域指向NULL。

不要想的那么复杂,分析程序要一步一步来,分析执行完每一个语句后各个变量的值。

再次重复我前面的帖子:


打个比方,A牵着B的手,B牵着C的手(head相当于A)

p1=head-> next(p1就是A牵着的那个人,就是B)

head-> next=NULL(这个时候A(head)不再牵任何人的手,松开了牵着B的手)

此时,B仍然牵着C的手,即p1-> next!=NULL成立,执行循环语句。

不难理解,循环语句的作用是把链表倒置。
[解决办法]
就是链表转置,建议搂主找本基础点的教材仔细看一下指针的部分!

p1=head-> next;使p1指向head-> next指向的内存地址,比如0x12345678
head-> next=NULL;head-> next指向0地址,而p1仍然指向0x12345678

这样说明白了吗?

读书人网 >C语言

热点推荐