数据结构学习笔记(2)——链表创建和链表遍历

说明(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 }
原文地址:https://www.cnblogs.com/Jacklovely/p/8576151.html