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

对这个链表的迷惑

2013-01-23 
对这个链表的疑惑程序如下:#include stdio.h#include malloc.h#include stdlib.htypedef struct Nod

对这个链表的疑惑
程序如下:
#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是一直在后移的啊。

热点排行