typedef struct node{ int data; struct node *ne

typedef struct node{
int data;
struct node *next
}NODE;
NODE *fun(*h)
{
NODE *P,*q,*r;
p=h;
if(p==NULL)
return NULL;
q=p->next;
p->next=NULL;
while(q)
{
r=q->next;
q->next=p;
p=q;
q=r;
}
return p;
}
让不带头结点的链表单向逆置(求具体解释下这个函数)⊙﹏⊙

typedef struct node{
int data;
struct node *next
}NODE;
NODE *fun(*h)
{
NODE *p,*q,*r;
p=h;
if(p==NULL) // 如果传入的指针指向空,返回空。实际上,把判断写在这个位置并不好
return NULL;
q=p->next; // 这两句是将q指向当前头结点的下一个结点,然后让当前头结点的下一个结点指针指向空,实现头结点的反转
p->next=NULL;
while(q) // 这个循环的意图是实现剩余其它结点的依次反转,即将当前结点指针q的next指向前一个(被处理的)结点p。q为空,意味着p是尾结点了,所以,作为p的next,它为空
{
r=q->next;
q->next=p;
p=q;
q=r;
}
return p; // p是最后一个结点的地址
}

说明:不带头结点的链表的说法不准确,h就是指向头结点嘛。追答

函数参数声明少了一个NODE。

r=q->next; // 临时变量 r指向当前结点的下一个
q->next=p; // 当前结点q的next指向上一个结点p
p=q; // 将上一个结点的指针移向当前结点q
q=r; // 将当前结点指针q指向原先保存的下一个结点

typedef struct node{
int data;
struct node *next
} NODE;

NODE *fun(NODE * h)
{
if(h==NULL)
return NULL;

NODE *cur=h, *lst=NULL, *nxt=NULL;
for(;cur!=NULL;){
nxt=cur->next;
cur->next=lst;
lst=cur;
cur=nxt;
}

return lst;
}

我修改了一下,估计效率高一些

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-08-26
简单说就是p指向null!返回p!感觉这代码怪怪的
相似回答