读书人

对这个链表的迷惑

发布时间: 2013-01-23 10:44:49 作者: rapoo

对这个链表的疑惑
程序如下:
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>

typedef struct Node
{
int data;//链表有数据域
struct Node * pNext;//以及指针域
}NODE,*PNODE;

//函数声明
PNODE create_list(void);
void traverse_list(PNODE pHead);
int main()
{
PNODE pHead=NULL; //等价于struct Node *pHead=NULL,先清空数值
pHead=create_list();/*create_lisr()函数 功能:,创建一个非循环单链表 ,并且将头结点的地址复制给pHead*/
traverse_list(pHead);//对链表进行遍历,也就是输出
return 0;
}
PNODE create_list(void)//函数有返回值,但是没有形参,因此定义成一直的类型
{
int len; //用来存放生成有效节点的元素个数
int i; //循环制使用
int val;//用来临时存放节点个数的值


PNODE pHead=(PNODE)malloc(sizeof(NODE)); //分配了一个不存放有效数据的头结点
if(NULL==pHead)
{
printf("程序分配失败,终止怎个程序");
exit(-1);
}


PNODE pTail=pHead; //头结点赋值给了pTail
pTail->pNext==NULL; //清空头节点的指针域
printf("请输入需要生成的节点个数:len=");
scanf("%d",&len);//生成有效节点的元素个数
for(i=0;i<len;++i)
{
printf("请输入第%d节点的个数",i+1);
scanf("%d",&val);

PNODE pNew=(PNODE)malloc(sizeof(NODE));
if(NULL==pNew)
{
printf("程序分配失败,终止怎个程序");
exit(-1);
}

pNew->data=val;
pTail->pNext=pNew;
pNew->pNext=NULL;//清空指针域
//pNew->pNext==NULL刚才一直这样写才会导致是循环,必须注意下了;
pTail=pNew; //pTail指向尾指针

}
return pHead; //就是这里,我发送pTail就不能遍历输出
}

void traverse_list(PNODE pHead)//对链表进行遍历一定要知道形参,不然的话对谁进行遍历都不知道了,但是不需要返回值,因此用void
{
PNODE p=pHead->pNext;
while(NULL!=p)
{
printf("%d ",p->data);
p=p->pNext;
}
printf("\n");
return;
}

为什么我发送pHead就可以遍历,pTail不可以呢,头结点不是也赋值给了pTail了吗?
有点疑惑
[解决办法]
因为这是单向链表,您的 pTail已经移动到最后一个位置了。怎么能用它来遍历呢
[解决办法]
pTail=pNew; //pTail指向尾指针
你不懂说的很清楚了吗?最初的pHead与pTail是同时指向头结点的,可是随着结点的不断增多,pTail是一直在后移的啊。

读书人网 >C语言

热点推荐