说明(2018-3-15 20:34:49):
1. 开始将pNew挂到pHead后面,会有问题,每个新生成的节点都挂到了pHead后面。
2. 然后改为,新建一个pTail尾节点,让它等于pHead,然后每次生成一个新节点,就让这个pTail等于这个新节点,以便下一个新节点能够挂到这个pTail尾节点上,也就是上一个旧节点。
1 #include<stdio.h> 2 #include<malloc.h> 3 #include<stdlib.h> 4 #pragma warning(disable:4996) 5 6 7 typedef struct Node 8 { 9 int data;//数据域 10 struct Node * pNext;//指针域 11 }NODE, *pNODE; 12 pNODE CreateList(); 13 void TraverseList(pNODE pHead); 14 void main() 15 { 16 pNODE pHead = CreateList();//生成一个链表,把链表中第一个节点的地址赋给pHead 17 TraverseList(pHead);//遍历链表,输出每个节点数据 18 system("pause"); 19 } 20 21 pNODE CreateList() 22 { 23 int len; 24 printf("请输入链表的长度: "); 25 scanf("%d", &len); 26 int val;//临时存放每个节点的数据 27 pNODE pHead = (pNODE)malloc(sizeof(NODE)); 28 pNODE pTail = pHead;//pTail,pHead两个都指向了头结点 29 pTail->pNext = NULL;//这一句要加上,把头结点的指针域清空,以便节点为0时,遍历的参数pHead->pNext为NULL。这样的话就保证了pTail永远指向了尾节点 30 if (pHead == NULL) 31 { 32 printf("内存分配失败!"); 33 exit(-1); 34 } 35 for (int i = 0; i < len; i++) 36 { 37 pNODE pNew = (pNODE)malloc(sizeof(NODE));//为新的节点分配内存,是一个临时节点,避免每一个节点重新起名 38 //pNODE pTail = (pNODE)malloc(sizeof(NODE));//设置一个尾指针,存放最后一个节点的地址 39 if (pNew == NULL) 40 { 41 printf("内存分配失败!"); 42 exit(-1); 43 } 44 printf("请输入第%d个节点的数据: ", i + 1); 45 scanf("%d", &val); 46 pNew->data = val;//新节点的数据域赋值 47 //下面三句最重要!!! 48 pTail->pNext = pNew;//尾节点指针域指向了新节点的指针pNew 49 pNew->pNext = NULL;//新节点的指针域清空,因为最后一个节点的指针域应该是空的 50 pTail = pNew;//尾节点的指针等于这个新节点的指针,方便下一个新节点挂在旧节点之后 51 } 52 return pHead; 53 } 54 55 void TraverseList(pNODE pHead) 56 { 57 pNODE p = pHead->pNext; 58 while (p != NULL) 59 { 60 printf("%d ", p->data); 61 p = p->pNext; 62 } 63 return; 64 }