首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

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

2013-04-21 
问一个关于指针和结构体,链表的问题typedef int ElemTypetypedef struct LNode/*定义结点结构体类型*/{ E

问一个关于指针和结构体,链表的问题
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;

热点排行