循环链表的插入,删除,修改,遍历,查找。
    strcmp()
    strcpy_s( A , sizeof( B ) , B )
    scanf(“%s”,char A, sizeof(A))
    fflush(stdin)

    1. #include <stdio.h>
    2. #include<string.h>
    3. #include<malloc.h>
    4. #include<stdlib.h>
    5. #include<stdbool.h>
    6. #define NO_LENGTH 20
    7. #define NAME_LENGTH 11
    8. /* 定义学生结构体的数据结构 */
    9. typedef struct Student {
    10. char studentNo[NO_LENGTH];
    11. char studentName[NAME_LENGTH];
    12. }st;
    13. /* 定义每条记录或节点的数据结构 */
    14. typedef struct node
    15. {
    16. struct Student data; //数据域
    17. struct node* next; //指针域
    18. }Node, * Link; //Node为node类型的别名,Link为node类型的指针别名
    19. //定义提示菜单
    20. void myMenu() {
    21. printf(" * * * * * * * * * 菜 单 * * * * * * * * * *\n");
    22. printf(" 1 增加学生记录 2 删除学生记录 \n");
    23. printf(" 3 查找学生记录 4 修改学生记录 \n");
    24. printf(" 5 统计学生人数 6 显示学生记录 \n");
    25. printf(" 7 退出系统 \n");
    26. printf(" * * * * * * * * * * * * * * * * * * * * * * * *\n");
    27. }
    28. void inputStudent(Link l) {
    29. printf("请输入学生学号:");
    30. scanf_s("%s", l->data.studentNo, sizeof(l->data.studentNo));
    31. printf("请输入学生的姓名:");
    32. scanf_s("%s", l->data.studentName, sizeof(l->data.studentName));
    33. //每个新创建的节点的next域都初始化为NULL
    34. l->next = NULL;
    35. }
    36. void displayNode(Link head) {
    37. // 填写代码,根据传入的链表head头指针,扫描链表显示所有节点的信息
    38. Link p;
    39. p = head->next;
    40. printf("有以下学生在管理系统中:\n");
    41. while (p != NULL) {
    42. printf("学生学号:%s\t学生的姓名:%s\n", p->data.studentNo, p->data.studentName);
    43. p = p->next;
    44. }
    45. }
    46. /* 增加学生记录 */
    47. bool addNode(Link head) {
    48. Link p, q; //p,q两个节点一前一后
    49. Link node; //node指针指向新创建的节点
    50. node = (Link)malloc(sizeof(Node));
    51. inputStudent(node);
    52. q = head;
    53. p = head->next; //q指向head后面的第一个有效节点
    54. if (head->next == NULL)
    55. head->next = node;
    56. else {
    57. //循环访问链表中的所有节点
    58. while (p != NULL) {
    59. if (strcmp(node->data.studentNo, p->data.studentNo) <= 0) {
    60. //如果node节点的学号比p节点的学号小,则插在p的前面,完成插入后,提前退出子程序
    61. node->next = p;
    62. q->next = node;
    63. return true;
    64. }
    65. else {
    66. //如果node节点的学号比p节点的学号大,继续向后移动指针(依然保持pq一前一后)
    67. q = p;
    68. p = q->next;
    69. }
    70. }
    71. //如果没能提前退出循环,则说明之前没有插入,那么当前node节点的学号是最大值,此时插在链表的最后面
    72. q->next = node;
    73. }
    74. return true;
    75. }
    76. bool deleteNode(Link head) {
    77. // 按照给定的学号删除学生记录,如果删除成功返回true,如果没找到学号返回false
    78. Link q = head;
    79. Link p = head->next;
    80. char de[NO_LENGTH];
    81. printf("请输入要删除的学生学号:");
    82. scanf_s("%s", de, sizeof(de));
    83. //输入要处理的学号
    84. while (p != NULL) {
    85. if (strcmp(p->data.studentNo,de) == 0) {
    86. printf("该学生的姓名:%s", p->data.studentName);
    87. q->next = p->next;
    88. free(p);
    89. return 1;
    90. }
    91. q = p;
    92. p = q->next;
    93. }
    94. return 0;
    95. }
    96. bool queryNode(Link head) {
    97. // 按照给定的学号查询学生记录,如果删除成功返回true,如果没找到学号返回false
    98. Link p = head->next;
    99. //输入要处理的学号
    100. char qu[NO_LENGTH];
    101. printf("请输入要查找的学生学号:");
    102. scanf_s("%s", qu, sizeof(qu));
    103. while (p != NULL) {
    104. if (strcmp(p->data.studentNo,qu) == 0) {
    105. printf("该学生的姓名为:%s", p->data.studentName);
    106. return 1;
    107. }
    108. p = p->next;
    109. }
    110. return 0;
    111. }
    112. bool modifyNode(Link head) {
    113. // 按照给定的学号找到学生记录节点,如果修改成功返回true,如果没找到学号返回false
    114. Link p = head->next;
    115. //输入要处理的学号
    116. char mo[NO_LENGTH];
    117. printf("请输入要修改的学生学号:");
    118. scanf_s("%s", mo, sizeof(mo));
    119. fflush(stdin);
    120. while (p != NULL) {
    121. if (strcmp(p->data.studentNo, mo) == 0) {
    122. int flag;
    123. flag = 1;
    124. fflush(stdin);
    125. while (flag) {
    126. int moSelect;
    127. printf("修改学号输入:1 修改姓名输入: 2");
    128. printf("\n");
    129. scanf_s("%d", &moSelect);
    130. if (moSelect == 1) {
    131. char moN[NO_LENGTH];
    132. printf("学号修改为:");
    133. scanf_s("%s", moN, sizeof(moN));
    134. fflush(stdin);
    135. strcpy_s((p->data.studentNo), sizeof(moN), moN);
    136. flag = 0;
    137. }
    138. else if (moSelect == 2) {
    139. char moNa[NAME_LENGTH];
    140. printf("名字修改为:");
    141. scanf_s("%s", moNa, sizeof(moNa));
    142. fflush(stdin);
    143. strcpy_s(p->data.studentName, sizeof(moNa), moNa);
    144. flag = 0;
    145. }
    146. else {
    147. printf("请输入正确数字范围(1-2)\n");
    148. continue;
    149. }
    150. return 1;
    151. }
    152. }
    153. p = p->next;
    154. }
    155. return false;
    156. }
    157. int countNode(Link head) {
    158. //统计学生人数,扫描链表统计节点个数,返回节点数
    159. Link p;
    160. p = head->next;
    161. int count = 0;
    162. //填充代码
    163. while (p) {
    164. ++count;
    165. p = p->next;
    166. }
    167. return count;
    168. }
    169. void clearLink(Link head) {
    170. Link q, p;
    171. q = head;
    172. p = head->next;
    173. //遍历链表,用free语句删除链表中用malloc建立起的所有的节点
    174. while (p) {
    175. q = p->next;
    176. free(p);
    177. p = q->next;
    178. }
    179. }
    180. int main() {
    181. int count;
    182. Link head; // 定义链表
    183. //建立head头结点,在这个程序中head指向头结点,头结点data部分没有内容,其后续节点才有真正的数据
    184. head = (Link)malloc(sizeof(Node));
    185. head->next = NULL;
    186. myMenu();
    187. while (1)
    188. {
    189. int select;
    190. printf("\n请输入你的选择(0-7):"); //显示提示信息
    191. scanf_s("%d", &select);
    192. fflush(stdin);
    193. switch (select)
    194. {
    195. case 1:
    196. //增加学生记录
    197. if (addNode(head))
    198. printf("成功插入一个学生记录。\n\n");
    199. break;
    200. case 2:
    201. //删除学生记录
    202. if (deleteNode(head))
    203. printf("(成功删除一个学生记录)。\n\n");
    204. else
    205. printf("没有找到删除的学生节点。\n\n");
    206. break;
    207. case 3:
    208. //查询学生记录
    209. if (queryNode(head))
    210. printf("(成功查询一个学生记录)。\n\n");
    211. else
    212. printf("没有找到要查询的学生节点。\n\n");
    213. break;
    214. case 4:
    215. //修改学生记录
    216. if (modifyNode(head))
    217. printf("成功修改一个学生记录。\n\n");
    218. else
    219. printf("没有找到要修改的学生节点。\n\n");
    220. break;
    221. case 5:
    222. //统计学生人数
    223. count = countNode(head);
    224. printf("学生人数为:%d\n\n", count);
    225. break;
    226. case 6:
    227. //显示学生记录
    228. displayNode(head);
    229. break;
    230. case 7:
    231. //退出前清除链表中的所有结点
    232. clearLink(head);
    233. return 0;
    234. default:
    235. printf("输入不正确,应该输入0-7之间的数。\n\n");
    236. break;
    237. }
    238. }
    239. return 0;
    240. }