在建立链表的时候一定要构造一个尾指针吗?
今天看了一段郝斌的C视频,里面在介绍链表的时候大致是这样说的(最简单的单链表):先构造两个指针,一个头指针 ,一个尾指针,都指向一个节点1。再用malloc动态构造一个节点2,用一个pnew指向它,然后把节点1的指针域里填充为pnew,节点1就指向了节点2,再把节点2的数据域填充一个数据,接着把节点2的指针域赋为NULL,最后把pnew赋值给尾指针。链表就造好了。可是,一开始为什么要用两个指针(一个头指针,一个尾指针),只用一个头指针不可以吗?
头指针指向节点1,pnew指向节点2,让节点1的指针域里存pnew,节点1就指向了节点2,然后在节点2的数据域填充数据,最后把节点2的指针域赋为NULL。这样不也是可以的吗?
为什么还要一个尾指针呢?
下面是郝斌的代码。大家看看,是不是那个 pTail有点多余呢?
程序代码:
# include <stdio.h> # include <malloc.h> # include <stdlib.h> struct Node { int data; //数据域 struct Node * pNext; //指针域 }; //函数声明 struct Node * create_list(void); void traverse_list(struct Node *); int main(void) { struct Node * pHead = NULL; pHead = create_list(); //create_list()功能:创建一个非循环单链表,并将该链表的头结点的地址付给pHead traverse_list(pHead); return 0; } struct Node * create_list(void) { int len; //用来存放有效节点的个数 int i; int val; //用来临时存放用户输入的结点的值 //分配了一个不存放有效数据的头结点 struct Node * pHead = (struct Node *)malloc(sizeof(struct Node)); if (NULL == pHead) { printf("分配失败, 程序终止!\n"); exit(-1); } struct Node * pTail = pHead; //这里的pTail是不是有点多余 pTail->pNext = NULL; printf("请输入您需要生成的链表节点的个数: len = "); scanf("%d", &len); for (i=0; i<len; ++i) { printf("请输入第%d个节点的值: ", i+1); scanf("%d", &val); struct Node * pNew = (struct Node *)malloc(sizeof(struct Node)); if (NULL == pNew) { printf("分配失败, 程序终止!\n"); exit(-1); //终止程序 } pNew->data = val; pTail->pNext = pNew; pNew->pNext = NULL; pTail = pNew; } return pHead; } void traverse_list(struct Node * pHead) { struct Node * p = pHead->pNext; while (NULL != p) { printf("%d ", p->data); p = p->pNext; } printf("\n"); return; }