c语言课上作业——初学链表操作
http://www.cnblogs.com/maluning/p/7966875.html
根据上面的大佬的指导。今天完成了老师的作业。第一次完成了链表的创建、遍历、插入、删除(基本靠抄,不好意思)。
作为一个菜鸟,第一次完成100行以上的不用复制重复代码的代码。好兴奋呀。
//不过还是有一点不明白。不明白以下代码中的头指针或者说头节点是不是要在主调函数中最后一次遍历后也把它free掉。
1 // 操作环境 Win 10 2 // IDE Visual Studio 2017 3 // !!移植请将scanf_s换为scanf !! 4 5 #include "pch.h" 6 #include <stdio.h> 7 #include <stdlib.h> 8 9 //定义结构体 10 11 typedef struct node { 12 13 int data; //用于存放数据 14 node *next; //指向下一个节点 15 }Node, *PNode; 16 17 // 函数声明 (几种应用) 18 PNode CreateList(void); // 声明创建链表函数 19 void TraverseList(PNode List); // 声明遍历链表函数 20 void InsertList(PNode List, int pos, int val); // 声明链表插入函数 21 void DeleteTheList(PNode List); // 声明删除整个链表函数 22 void DeleteList(PNode List, int pos); // 声明删除链表元素函数 23 PNode FindList(PNode List); // 声明链表查询函数 24 25 //主调函数 26 int main() { 27 PNode List = CreateList();//创建一个指针指向创建的链表的头指针 28 TraverseList(List); //遍历链表 29 InsertList(List, 3, 999);//在3处插入新节点 30 TraverseList(List); //再次遍历链表 31 DeleteList(List, 3); //删除插入的节点 32 TraverseList(List); //遍历链表 33 FindList(List); //查询链表 34 DeleteTheList(List); //删除整个节点 35 TraverseList(List); //遍历链表
free(List);
36 return 0; 37 } 38 39 //创建链表 40 PNode CreateList(void) { 41 int len; //链表长度 42 int val; //存放链表节点的数据 43 PNode PHead = (PNode)malloc(sizeof(Node)); //创建头指针并分配空间 44 if (PHead == NULL) { 45 printf("申请头指针失败\n"); 46 exit(-1); 47 } 48 49 PNode PTail = PHead; //声明尾指针初始化指向头指针 50 PTail->next = NULL; //使尾指针(目前是头指针)指向空 51 52 printf("请输入要创建的链表长度:\n"); 53 //scanf("%d", &len); 移植用 54 scanf_s("%d", &len); //输入节点个数 55 for (int i = 0; i < len; i++) { 56 PNode PNew = (PNode)malloc(sizeof(Node)); //分配新节点 57 if (PNew == NULL) { 58 printf("申请新节点失败\n"); 59 exit(-1); 60 } 61 62 printf("请输入第%d个节点的数据:\n", i + 1); 63 //scanf("%d", &val); 64 scanf_s("%d", &val); 65 66 PNew->data = val; //输入数据 67 PTail->next = PNew; //使上一个Next指向新节点 68 PNew->next = NULL; //使节点指向空(作为尾指针) 69 PTail = PNew; //让尾指针指向新节点 70 } 71 printf("链表创建成功\n"); 72 return PHead; 73 } 74 75 76 // 声明遍历链表函数 77 void TraverseList(PNode List) { 78 PNode P = List->next; //将首节点赋值给临时变量P 79 printf("遍历链表的值为:"); 80 if (P == NULL) { 81 printf("链表为空\n"); 82 } 83 while (P != NULL) { 84 printf("%d ", P->data); 85 P = P->next; 86 } 87 printf("\n"); 88 } 89 90 // 声明链表插入函数 91 void InsertList(PNode List, int pos, int val) { 92 int position = 0; 93 PNode P = List; 94 //寻找插入节点的前驱节点 95 while (P != NULL && position < pos - 1) { 96 P = P->next; 97 position++; 98 } 99 100 PNode Temp = (PNode)malloc(sizeof(Node)); // 分配一个临时节点用来存储要插入的数据 101 if (Temp == NULL) 102 { 103 printf("内存分配失败!"); 104 exit(-1); 105 } 106 107 //插入节点 108 Temp->data = val; 109 Temp->next = P->next; 110 P->next = Temp; 111 } 112 113 // 声明删除链表元素函数 114 void DeleteList(PNode List, int pos) { 115 int position = 0; 116 PNode P = List; 117 //寻找要删除的节点的前驱节点 118 while (P != NULL && position < pos - 1) { 119 P = P->next; 120 position++; 121 } 122 123 //删除此节点 124 PNode Temp = P->next; // 定义临时指针Tmp指向要删除的节点 125 P->next = Temp->next; 126 free(Temp); 127 Temp = NULL; //避免产生野指针 128 } 129 130 // 声明链表查询函数 131 PNode FindList(PNode List) { 132 int position = 0; 133 PNode P = List->next; //创建临时节点用于查询节点 134 int num = 0; //记录查询的节点位置 135 int val; //存放要查询的数据 136 printf("请输入要查询的数值:\n"); 137 //scanf("%d", &val); 138 scanf_s("%d", &val); 139 140 while (P != NULL && P->data != val) { 141 P = P->next; 142 num++; 143 } 144 145 if (P != NULL) { 146 printf("查询的数值的位置为%d\n", num + 1); 147 } 148 else { 149 printf("查询数值不存在\n"); 150 } 151 return P; 152 } 153 154 // 声明删除整个链表函数 155 void DeleteTheList(PNode List) { 156 PNode P, Temp; 157 P = List->next; 158 List->next = NULL; //避免野指针 159 while (P != NULL) { 160 Temp = P->next; 161 free(P); 162 P = Temp; 163 } 164 printf("删除链表成功!\n"); 165 }