读书人

问一个关于指针和结构体链表的有关问

发布时间: 2013-04-21 21:18:07 作者: rapoo

问一个关于指针和结构体,链表的问题
typedef int ElemType;

typedef struct LNode /*定义结点结构体类型*/
{
ElemType data;/*数据域*/
struct LNode *next; /*指针域*/
} LNode;
然后有一个逆置的函数:

LNode *reverlist(LNode *head) /*逆置链式基本线性表*/
{

LNode *p,*q,*r;
p=head;
q=p->next;
while(q!=NULL)
{
r=q->next;
q->next=p;
p=q;
q=r;
}
head->next=NULL;
head=p;

return(head);
}
我想问的是这个逆置函数中的红色部分语句的含义。是什么。
既然下面要将head赋值为p那么上一句在对head的成员做修改还有什么意义。但是我试过去掉这一行。却又出现死循环
[解决办法]
之前你的Head->next指向的是逆置之前的第二个节点,逆置之后Head变成了尾节点,这时你就需要将尾节点的next指向null,要不然程序会在最后两个节点那死循环
[解决办法]
我说楼主的 p q 指针操作 写的有问题 ....
p -> head ;
却没有对p 有后续操作, 接着就进循环了 先是把 p 赋值给q -> next. 接着又是 把 q 给p 死循环了吧 好像....
[解决办法]

引用:
引用:之前你的Head->next指向的是逆置之前的第二个节点,逆置之后Head变成了尾节点,这时你就需要将尾节点的next指向null,要不然程序会在最后两个节点那死循环
不好意思,刚才我回复的有问题,3楼喂狗。
请问绿色部分head赋值为p了。那么不是默认head—>next=p->next?

你说的是没错的,head指向p之后他的next是指向p的next的,但是逆置之前的头结点的next,如果你去掉红色部分的话,你就没有对这个特殊情况做处理,所以红色那个很重要
[解决办法]
我的观点是:红色的那句是必须的。当你去掉时,就失去了表尾的位置,而且由于原表头保存了原来第二个节点的地址,所以这里就建立了一个循环关系 所以出现死循环。
[解决办法]
很简单 原来的 head->next = q; 后来你逆转 使得q->next = head;
这样就形成一个死循环 所以最后的时候需要断开head与q之间的链接 置head->next = NULL;

读书人网 >C语言

热点推荐