循环链表的插入,删除,修改,遍历,查找。
strcmp()
strcpy_s( A , sizeof( B ) , B )
scanf(“%s”,char A, sizeof(A))
fflush(stdin)
#include <stdio.h>#include<string.h>#include<malloc.h>#include<stdlib.h>#include<stdbool.h>#define NO_LENGTH 20#define NAME_LENGTH 11/* 定义学生结构体的数据结构 */typedef struct Student {char studentNo[NO_LENGTH];char studentName[NAME_LENGTH];}st;/* 定义每条记录或节点的数据结构 */typedef struct node{struct Student data; //数据域struct node* next; //指针域}Node, * Link; //Node为node类型的别名,Link为node类型的指针别名//定义提示菜单void myMenu() {printf(" * * * * * * * * * 菜 单 * * * * * * * * * *\n");printf(" 1 增加学生记录 2 删除学生记录 \n");printf(" 3 查找学生记录 4 修改学生记录 \n");printf(" 5 统计学生人数 6 显示学生记录 \n");printf(" 7 退出系统 \n");printf(" * * * * * * * * * * * * * * * * * * * * * * * *\n");}void inputStudent(Link l) {printf("请输入学生学号:");scanf_s("%s", l->data.studentNo, sizeof(l->data.studentNo));printf("请输入学生的姓名:");scanf_s("%s", l->data.studentName, sizeof(l->data.studentName));//每个新创建的节点的next域都初始化为NULLl->next = NULL;}void displayNode(Link head) {// 填写代码,根据传入的链表head头指针,扫描链表显示所有节点的信息Link p;p = head->next;printf("有以下学生在管理系统中:\n");while (p != NULL) {printf("学生学号:%s\t学生的姓名:%s\n", p->data.studentNo, p->data.studentName);p = p->next;}}/* 增加学生记录 */bool addNode(Link head) {Link p, q; //p,q两个节点一前一后Link node; //node指针指向新创建的节点node = (Link)malloc(sizeof(Node));inputStudent(node);q = head;p = head->next; //q指向head后面的第一个有效节点if (head->next == NULL)head->next = node;else {//循环访问链表中的所有节点while (p != NULL) {if (strcmp(node->data.studentNo, p->data.studentNo) <= 0) {//如果node节点的学号比p节点的学号小,则插在p的前面,完成插入后,提前退出子程序node->next = p;q->next = node;return true;}else {//如果node节点的学号比p节点的学号大,继续向后移动指针(依然保持pq一前一后)q = p;p = q->next;}}//如果没能提前退出循环,则说明之前没有插入,那么当前node节点的学号是最大值,此时插在链表的最后面q->next = node;}return true;}bool deleteNode(Link head) {// 按照给定的学号删除学生记录,如果删除成功返回true,如果没找到学号返回falseLink q = head;Link p = head->next;char de[NO_LENGTH];printf("请输入要删除的学生学号:");scanf_s("%s", de, sizeof(de));//输入要处理的学号while (p != NULL) {if (strcmp(p->data.studentNo,de) == 0) {printf("该学生的姓名:%s", p->data.studentName);q->next = p->next;free(p);return 1;}q = p;p = q->next;}return 0;}bool queryNode(Link head) {// 按照给定的学号查询学生记录,如果删除成功返回true,如果没找到学号返回falseLink p = head->next;//输入要处理的学号char qu[NO_LENGTH];printf("请输入要查找的学生学号:");scanf_s("%s", qu, sizeof(qu));while (p != NULL) {if (strcmp(p->data.studentNo,qu) == 0) {printf("该学生的姓名为:%s", p->data.studentName);return 1;}p = p->next;}return 0;}bool modifyNode(Link head) {// 按照给定的学号找到学生记录节点,如果修改成功返回true,如果没找到学号返回falseLink p = head->next;//输入要处理的学号char mo[NO_LENGTH];printf("请输入要修改的学生学号:");scanf_s("%s", mo, sizeof(mo));fflush(stdin);while (p != NULL) {if (strcmp(p->data.studentNo, mo) == 0) {int flag;flag = 1;fflush(stdin);while (flag) {int moSelect;printf("修改学号输入:1 修改姓名输入: 2");printf("\n");scanf_s("%d", &moSelect);if (moSelect == 1) {char moN[NO_LENGTH];printf("学号修改为:");scanf_s("%s", moN, sizeof(moN));fflush(stdin);strcpy_s((p->data.studentNo), sizeof(moN), moN);flag = 0;}else if (moSelect == 2) {char moNa[NAME_LENGTH];printf("名字修改为:");scanf_s("%s", moNa, sizeof(moNa));fflush(stdin);strcpy_s(p->data.studentName, sizeof(moNa), moNa);flag = 0;}else {printf("请输入正确数字范围(1-2)\n");continue;}return 1;}}p = p->next;}return false;}int countNode(Link head) {//统计学生人数,扫描链表统计节点个数,返回节点数Link p;p = head->next;int count = 0;//填充代码while (p) {++count;p = p->next;}return count;}void clearLink(Link head) {Link q, p;q = head;p = head->next;//遍历链表,用free语句删除链表中用malloc建立起的所有的节点while (p) {q = p->next;free(p);p = q->next;}}int main() {int count;Link head; // 定义链表//建立head头结点,在这个程序中head指向头结点,头结点data部分没有内容,其后续节点才有真正的数据head = (Link)malloc(sizeof(Node));head->next = NULL;myMenu();while (1){int select;printf("\n请输入你的选择(0-7):"); //显示提示信息scanf_s("%d", &select);fflush(stdin);switch (select){case 1://增加学生记录if (addNode(head))printf("成功插入一个学生记录。\n\n");break;case 2://删除学生记录if (deleteNode(head))printf("(成功删除一个学生记录)。\n\n");elseprintf("没有找到删除的学生节点。\n\n");break;case 3://查询学生记录if (queryNode(head))printf("(成功查询一个学生记录)。\n\n");elseprintf("没有找到要查询的学生节点。\n\n");break;case 4://修改学生记录if (modifyNode(head))printf("成功修改一个学生记录。\n\n");elseprintf("没有找到要修改的学生节点。\n\n");break;case 5://统计学生人数count = countNode(head);printf("学生人数为:%d\n\n", count);break;case 6://显示学生记录displayNode(head);break;case 7://退出前清除链表中的所有结点clearLink(head);return 0;default:printf("输入不正确,应该输入0-7之间的数。\n\n");break;}}return 0;}
