From 218ac640790343be51be3f990ee3865d2da2ec5d Mon Sep 17 00:00:00 2001 From: flykhan Date: Fri, 21 Jul 2023 11:16:42 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AD=A6=E7=94=9F=E7=AE=A1=E7=90=86=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=20makefile,=20=E5=86=85=E5=AE=B9=E6=8B=86=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- day15/d1-stuMangerSystem/Makefile | 37 ++ day15/d1-stuMangerSystem/data/stu.date | 10 + day15/d1-stuMangerSystem/data/stu.date.bak | 10 + day15/d1-stuMangerSystem/includes/color_e.h | 38 ++ day15/d1-stuMangerSystem/includes/link.h | 22 ++ day15/d1-stuMangerSystem/includes/stu_s.h | 15 + day15/d1-stuMangerSystem/link.c | 372 ++++++++++++++++++++ day15/d1-stuMangerSystem/main | Bin 0 -> 17736 bytes day15/d1-stuMangerSystem/main.c | 105 ++++++ day15/d1-stuMangerSystem/objs/link.o | Bin 0 -> 7984 bytes day15/d1-stuMangerSystem/objs/main.o | Bin 0 -> 4936 bytes day15/d1-stuMangerSystem/stuMangerSystem | Bin 0 -> 17736 bytes 12 files changed, 609 insertions(+) create mode 100644 day15/d1-stuMangerSystem/Makefile create mode 100644 day15/d1-stuMangerSystem/data/stu.date create mode 100644 day15/d1-stuMangerSystem/data/stu.date.bak create mode 100644 day15/d1-stuMangerSystem/includes/color_e.h create mode 100644 day15/d1-stuMangerSystem/includes/link.h create mode 100644 day15/d1-stuMangerSystem/includes/stu_s.h create mode 100644 day15/d1-stuMangerSystem/link.c create mode 100755 day15/d1-stuMangerSystem/main create mode 100644 day15/d1-stuMangerSystem/main.c create mode 100644 day15/d1-stuMangerSystem/objs/link.o create mode 100644 day15/d1-stuMangerSystem/objs/main.o create mode 100755 day15/d1-stuMangerSystem/stuMangerSystem diff --git a/day15/d1-stuMangerSystem/Makefile b/day15/d1-stuMangerSystem/Makefile new file mode 100644 index 0000000..fa45198 --- /dev/null +++ b/day15/d1-stuMangerSystem/Makefile @@ -0,0 +1,37 @@ +# 定义变量,用于存放目标文件和依赖文件的目录 +OBJ_DIR := ./objs + +# $@ 表示目标文件, +# $^ 表示依赖文件列表去重之后的所有依赖文件, +# $< 表示第一个依赖文件, +# $* 表示匹配目标文件名的部分, +# $% 表示静态模式中的百分号匹配 + +# CC 是编译器 +# CC = gcc +# TARGET 是目标文件 +TARGET = main +# OBJ 是目标文件依赖的文件 +# OBJ = link.o main.o +OBJ = $(OBJ_DIR)/link.o $(OBJ_DIR)/main.o + +# 所有的 .o 文件都依赖于 .c 文件 +$(OBJ_DIR)/%.o: %.c + $(CC) -c $< -o $@ + +# 意思是: 目标文件依赖于 OBJ, 执行命令是 $(CC) $(OBJ) -o $(TARGET) +$(TARGET): $(OBJ) + $(CC) $(OBJ) -o $(TARGET) + +# # link.o 依赖于 link.c, 执行命令是 $(CC) -c link.c -o link.o +# # 用于生成目标文件 link.o +# link.o: link.c +# $(CC) -c link.c -o $(OBJ_DIR)/link.o + +# # 用于生成目标文件 main.o +# main.o: main.c +# $(CC) -c main.c -o $(OBJ_DIR)/main.o + +# 用于清理目标文件和可执行文件 +clean: + rm -rf $(OBJ) $(TARGET) \ No newline at end of file diff --git a/day15/d1-stuMangerSystem/data/stu.date b/day15/d1-stuMangerSystem/data/stu.date new file mode 100644 index 0000000..e0c573f --- /dev/null +++ b/day15/d1-stuMangerSystem/data/stu.date @@ -0,0 +1,10 @@ +1,张三,25 +2,李四,30 +3,王五,28 +4,赵六,32 +5,刘七,27 +6,陈八,29 +7,周九,31 +8,吴十,26 +9,郑十一,33 +10,孙十二,24 diff --git a/day15/d1-stuMangerSystem/data/stu.date.bak b/day15/d1-stuMangerSystem/data/stu.date.bak new file mode 100644 index 0000000..e0c573f --- /dev/null +++ b/day15/d1-stuMangerSystem/data/stu.date.bak @@ -0,0 +1,10 @@ +1,张三,25 +2,李四,30 +3,王五,28 +4,赵六,32 +5,刘七,27 +6,陈八,29 +7,周九,31 +8,吴十,26 +9,郑十一,33 +10,孙十二,24 diff --git a/day15/d1-stuMangerSystem/includes/color_e.h b/day15/d1-stuMangerSystem/includes/color_e.h new file mode 100644 index 0000000..74f2e5c --- /dev/null +++ b/day15/d1-stuMangerSystem/includes/color_e.h @@ -0,0 +1,38 @@ +#ifndef __COLOR_E_H__ +#define __COLOR_E_H__ + +// 属性定义枚举头文件 +typedef enum front_color_e +{ + BLACK = 30, // 黑色 + RED, // 红色 + GREEN, // 绿色 + YELLOW, // 黄色 + BLUE, // 蓝色 + PURPLE, // 紫色 + CYAN, // 青色 + WHITE, // 白色 +} Front_Color; // 前景色 + +typedef enum back_color_e +{ + BLACK_B = 40, // 黑色 + RED_B, // 红色 + GREEN_B, // 绿色 + YELLOW_B, // 黄色 + BLUE_B, // 蓝色 + PURPLE_B, // 紫色 + CYAN_B, // 青色 + WHITE_B, // 白色 +} Back_Color; // 背景色 + +typedef enum attr_e +{ + BOLD = 1, // 加粗 + UNDERLINE = 4, // 下划线 + BLINK, // 闪烁 + REVERSE = 7, // 反显 + HIDE, // 隐藏 +} Attr; // 文本属性 + +#endif \ No newline at end of file diff --git a/day15/d1-stuMangerSystem/includes/link.h b/day15/d1-stuMangerSystem/includes/link.h new file mode 100644 index 0000000..f596be1 --- /dev/null +++ b/day15/d1-stuMangerSystem/includes/link.h @@ -0,0 +1,22 @@ +#ifndef __LINK_H__ +#define __LINK_H__ +#include +#include // malloc +#include // strcpy +#include "stu_s.h" +#include "color_e.h" + +// 函数声明头文件 +// 不需要添加 extern,因为在头文件中定义的函数默认是 extern +void swap(STU *a, STU *b); +STU *insert_stu(STU *head, STU *item); +STU *delete_stu(STU *head, char sid); +void shows(STU *head); +STU *find_stu(STU *head, char sid); +STU *update_stu(STU *head, char sid); +STU *sort_stu(STU *head); +STU *reverse_stu(STU *head); +void saveToFile(STU *head, const char *filename); +STU *readFromFile(const char *filename); + +#endif \ No newline at end of file diff --git a/day15/d1-stuMangerSystem/includes/stu_s.h b/day15/d1-stuMangerSystem/includes/stu_s.h new file mode 100644 index 0000000..ca9267a --- /dev/null +++ b/day15/d1-stuMangerSystem/includes/stu_s.h @@ -0,0 +1,15 @@ +#ifndef __STU_S_H__ +#define __STU_S_H__ + +// 学生信息结构体头文件 +// 定义学生信息结构体,链表的节点 +typedef struct stu_s +{ + int sid; + char name[32]; + int age; + + struct stu_s *next; +} STU; + +#endif \ No newline at end of file diff --git a/day15/d1-stuMangerSystem/link.c b/day15/d1-stuMangerSystem/link.c new file mode 100644 index 0000000..a7224fc --- /dev/null +++ b/day15/d1-stuMangerSystem/link.c @@ -0,0 +1,372 @@ +#include "./includes/link.h" + +// 节点交换 +void swap(STU *a, STU *b) +{ + // 方法一: 直接通过临时指针交换数据 + // STU *tp = (STU *)malloc(sizeof(STU)); + // tp->sid = a->sid; + // strcpy(tp->name, a->name); + // tp->age = a->age; + + // a->sid = b->sid; + // strcpy(a->name, b->name); + // a->age = b->age; + + // b->sid = tp->sid; + // strcpy(b->name, tp->name); + // b->age = tp->age; + // free(tp); // 释放临时指针 + + // 方法二: 通过结构体指针交换数据 + // 先换数据 + STU *tp = (STU *)malloc(sizeof(STU)); + *tp = *a; + *a = *b; + *b = *tp; + + // 再换指针的下一个节点指向 + tp->next = a->next; + a->next = b->next; + b->next = tp->next; + + free(tp); // 释放临时指针 +} + +// 添加学生 +STU *insert_stu(STU *head, STU *item) +{ + // 如果头指针为空,说明链表为空,直接将新建的节点作为头指针 + if (head == NULL) + { + head = item; + } + else + { + // 如果头指针不为空,说明链表不为空,需要找到链表的尾部,将新建的节点插入到尾部 + STU *p = head; // 创建一个临时指针,用来保存头指针,防止头指针丢失 + while (p->next != NULL) // 当 p 的下一个节点不为空时,说明 p 不是尾部 + { + p = p->next; // p 一直向后移动,直到找到尾部 + } + p->next = item; // 将 item 插入到尾部 + } + return head; // 返回头指针 +} + +// 删除学生 +STU *delete_stu(STU *head, char sid) +{ + if (NULL == head) + { + printf("\033[%dm无数据,无法删除\033[0m\n", RED); + return NULL; + } + if (head->sid == sid) + { + // *tp 为临时指针,用来保存头指针 + STU *tp = head; // 保存头指针 + head = head->next; // 头指针指向下一个节点 + free(tp); // 释放头指针 + } + else + { + STU *tp = head; // 保存头指针 + while (NULL != tp->next && sid != tp->next->sid) // 当 tp 的下一个节点不为空时,且下一个节点的学号不等于要删除的学号时,继续向后移动指针 tp + { + tp = tp->next; // tp 一直向后移动,直到找到尾部 + } + if (NULL == tp->next) // 到达了链表尾部还是没有找到要删除的内容 + { + printf("\033[%dm未找到 sid = %d 的学生,删除失败\033[0m\n", RED, sid); + } + else + { + STU *tpx = tp->next; // 保存要删除的节点 + tp->next = tpx->next; // 将链表位置指向要删除的节点的下一个节点 + free(tpx); // 释放要删除的节点 + printf("\033[%dm删除 sid = %d 的学生成功\033[0m\n", BLUE, sid); + } + } + return head; // 返回头指针 +} + +// 打印学生 +void shows(STU *head) +{ + // 如果头指针为空,说明链表为空,直接返回 + if (head == NULL) + { + printf("\033[%dm无数据,无法打印\033[0m\n", RED); + return; + } + else + { + // 如果头指针不为空,说明链表不为空,需要遍历链表,打印每一个节点的信息 + STU *p = head; // 创建一个临时指针,用来保存头指针,防止头指针丢失 + // 清屏 + // printf("\033[2J"); + printf("--------------------\n"); + printf("\033[%dm学号\t姓名\t年龄\033[0m\n", BLUE_B); + while (p != NULL) // 当 p 不为空时,说明 p 不是尾部,则打印 p 的信息 + { + printf("\033[%dm%d\t%s\t%d\033[0m\n", BLUE, p->sid, p->name, p->age); // 打印 p 的信息 + p = p->next; // p 一直向后移动,直到找到尾部 + } + } +} + +// 查询学生 +STU *find_stu(STU *head, char sid) +{ + if (NULL == head) + { + printf("\033[%dm无数据,无法查询\033[0m\n", RED); + return NULL; // 返回空指针,说明没有找到要查询的节点 + } + + STU *tp = head; // 保存头指针 + while (NULL != tp->next && sid != tp->sid) // 当 tp 的下一个节点不为空时,且下一个节点的学号不等于要查询的学号时,继续向后移动指针 tp + { + tp = tp->next; // tp 一直向后移动,直到找到尾部 + } + if (sid == tp->sid) + return tp; // 返回当前节点的指针,即为要查询的节点 + return NULL; // 返回空指针,说明没有找到要查询的节点 +} + +// 修改学生 +STU *update_stu(STU *head, char sid) +{ + if (NULL == head) + { + printf("\033[%dm无数据,无法修改\033[0m\n", RED); + return NULL; + } + + STU *tp = find_stu(head, sid); // 查找要修改的节点 + if (tp == NULL) + { + printf("\033[%dm未找到 sid = %d 的学生\033[0m\n", RED, sid); + } + else + { + // 临时变量,用来保存要修改的学生信息 + char msid; + char mname[32]; + int mage; + + // 输入要修改的内容 + printf("输入要修改的学生的 学号 姓名 年龄: "); + scanf("%hhd %s %d", &msid, mname, &mage); + tp->sid = msid; + strcpy(tp->name, mname); + tp->age = mage; + // 修改成功 + printf("\033[%dm修改 sid = %d 的学生成功\033[0m\n", BLUE, sid); + } + return head; // 返回头指针 +} + +// 排序学生(选择排序,也可以使用归并排序) +STU *sort_stu(STU *head) +{ + if (NULL == head) + { + printf("\033[%dm无数据,无法排序\033[0m\n", RED); + return NULL; + } + // 选择排序方式: 1) 按照sid 2)按照age + int choose; // 选择排序方式 + printf("选择排序方式: 1) 按照sid 2)按照age: "); + scanf("%d", &choose); + if (1 == choose) // 按照sid排序 + { + // 选择排序方式: 1) 升序 2)降序 + int choose2; // 选择排序方式 + printf("选择排序方式: 1) 升序 2)降序: "); + scanf("%d", &choose2); + if (1 == choose2) // 升序 + { + // 按照sid升序排序 + STU *p = head; // 创建一个临时指针,用来保存头指针,防止头指针丢失 + while (p != NULL) // 相当于 for (int i = 0; i < len; i++) + { + STU *q = p->next; // 创建一个临时指针,用来保存头指针,防止头指针丢失 + while (q != NULL) // 相当于 for (int j = i + 1; j < len; j++) + { + if (p->sid > q->sid) // 相当于 if (arr[i] > arr[j]) + { + swap(p, q); // 相当于 swap(arr[i], arr[j] + } + q = q->next; + } + p = p->next; + } + } + else if (2 == choose2) // 降序 + { + STU *p = head; // 创建一个临时指针,用来保存头指针,防止头指针丢失 + while (p != NULL) + { + STU *q = p->next; // 创建一个临时指针,用来保存头指针,防止头指针丢失 + while (q != NULL) + { + if (p->sid < q->sid) + { + swap(p, q); + } + q = q->next; + } + p = p->next; + } + } + else + { + // 选择错误 + printf("\033[%dm选择错误\033[0m\n", RED); + } + } + else if (2 == choose) // 按照age排序 + { + // 选择排序方式: 1) 升序 2)降序 + int choose2; // 选择排序方式 + printf("选择排序方式: 1) 升序 2)降序: "); + scanf("%d", &choose2); + if (1 == choose2) // 升序 + { + STU *p = head; // 创建一个临时指针,用来保存头指针,防止头指针丢失 + while (NULL != p) + { + STU *q = p->next; // 创建一个临时指针,用来保存头指针,防止头指针丢失 + while (NULL != q) + { + if (p->age > q->age) + { + swap(p, q); + } + q = q->next; + } + p = p->next; + } + } + else if (2 == choose2) // 降序 + { + STU *p = head; // 创建一个临时指针,用来保存头指针,防止头指针丢失 + while (NULL != p) + { + STU *q = p->next; // 创建一个临时指针,用来保存头指针,防止头指针丢失 + while (NULL != q) + { + if (p->age < q->age) + { + swap(p, q); + } + q = q->next; + } + p = p->next; + } + } + else + { + // 选择错误 + printf("\033[%dm选择错误\033[0m\n", RED); + } + } + else + { + // 选择错误 + printf("\033[%dm选择错误\033[0m\n", RED); + } + return head; // 返回头指针 +} + +// 反序学生(头变尾,尾变头) +STU *reverse_stu(STU *head) +{ + if (NULL == head) + { + printf("\033[%dm无数据,无法反序\033[0m\n", RED); + return NULL; + } + + STU *pi = head->next; // 当前节点的下一个节点地址 + head->next = NULL; // 把头节点的下一个节点置空,让头节点成为尾节点 + STU *tp = NULL; // 当前节点的下一个节点地址 pi 的下一个节点地址 + while (pi != NULL) // 当 pi 不为空时,说明 pi 不是尾部,则反序 pi 的信息 + { + tp = pi->next; // 首先 tp 保存 pi 的下一个节点地址 + pi->next = head; // 然后把 pi 的下一个节点地址指向 head + head = pi; // 然后让 hand 指向 pi + pi = tp; // 最后找到新的 pi,即 tp + } + + printf("\033[%dm反序成功\033[0m\n", BLUE); + return head; // 返回头指针 +} + +// 保存数据到文件 +void saveToFile(STU *head, const char *filename) +{ + FILE *file = fopen(filename, "w"); + if (file == NULL) + { + printf("\033[%dm无法打开文件, 保存数据失败\033[0m", RED); + return; + } + + STU *current = head; // 定义临时指针,用来保存头指针,防止头指针丢失 + while (current != NULL) // 当 p 不为空时,说明 p 不是尾部,则打印 p 的信息 + { + // 格式化存储数据,每个字段之间用逗号分隔 + fprintf(file, "%d,%s,%d\n", current->sid, current->name, current->age); + current = current->next; // p 一直向后移动,直到找到尾部 + } + printf("保存数据成功\n"); + fclose(file); +} + +// 从文件中读取数据 +STU *readFromFile(const char *filename) +{ + FILE *file = fopen(filename, "r"); + if (file == NULL) + { + printf("\033[%dm无法打开文件, 加载数据失败\033[0m", RED); + return NULL; + } + + STU *head = NULL; // 定义头指针 + STU *prev = NULL; // 定义尾指针 + char line[100]; // 100 个字符的数组,用来保存每一行的数据 + + while (fgets(line, sizeof(line), file) != NULL) // 逐行读取文件内容 + { + STU *node = (STU *)malloc(sizeof(STU)); // 申请一个节点的内存, 用来保存学生信息 + /* + %d :表示读取一个整数,并将其存储在 &(node->sid)的地址中,即学生的学号。 + , :表示读取一个逗号,用于分隔学号和姓名之间的字段。 + %[^,] :表示读取一个字符串,直到遇到逗号为止,并将其存储在 node -> name 中,即学生的姓名。[^,] 表示匹配除逗号以外的任意字符。 + , :表示读取一个逗号,用于分隔姓名和年龄之间的字段。 + %d :表示读取一个整数,并将其存储在 &(node->age)的地址中,即学生的年龄。 + */ + sscanf(line, "%d,%[^,],%d\n", &(node->sid), node->name, &(node->age)); // 将每一行的数据保存到节点中 + // fscanf() 每次执行后会丢失数据,所以需要使用 sscanf() 函数,原因是 fscanf() 函数会在每次执行后将文件指针向后移动,而 sscanf() 函数不会移动文件指针。 + // fscanf(file, "%d,%[^,],%d", &(node->sid), node->name, &(node->age)); // 将每一行的数据保存到节点中 + node->next = NULL; // 新建的节点的下一个节点指向空,因为是尾部插入 + + if (head == NULL) // 当头指针为空时,说明链表为空,直接将新建的节点作为头指针 + { + head = node; + } + else // 否则,说明链表不为空,需要找到链表的尾部,将新建的节点插入到尾部 + { + prev->next = node; // 将新建的节点插入到尾部 + } + prev = node; // 将尾指针指向新建的节点 + } + + fclose(file); + printf("加载数据成功\n"); + return head; +} diff --git a/day15/d1-stuMangerSystem/main b/day15/d1-stuMangerSystem/main new file mode 100755 index 0000000000000000000000000000000000000000..dad0c8456afb1a8122077b897e0deef430aad5f5 GIT binary patch literal 17736 zcmeHPdvH`$nm>5}NrX;7zzD9~Rk9T*XaYibIINwJh8remM563C&}q^gk}3MZRZ`jCGQv8iI5gY`r-1-O7B@RUcHpak&eUGZIK&mV~}C3H_EN^zS60??^(gO+w$4 zgzip4ZvkDy$6CGzLZbHOCZUsTBKiCzbcTMeqHZl@K7Vsn(_U8H*yL?sE?2Fuv1;{d zm(N$_Zm2fl9Bm5teW3aL?y5UnRW*0Gs@=79ta_&xz{mOmsE3iMPr`H?MyV6Wu)jbrYRpQl;EPS8EmVwwmZ@uu&>a zbecn|)R^c~6%nw>L`Pzcvd2WX8C1sf)(j0{Fm^1eqnr93jg@y&!&sv~_I-$*#6IC7NZ#e`F8BV8O{LpY^0 z(#i2#<8uh7lts!pK7()?8W9J_vk0fuMG82cN;st~ zqH(-AUt`sszeojtFF zvF^u^*b04dCxG5MX48X1yXJP2DN5(`ZN0>Z4nlYzx4-Q)WwF|>@E+n<==XiZ4V=1^ z1_OFrynT2c2Vjh&~lz zJ(Q&fFM04rF0us>p)_ty4Kcy{#{B zK`_u%+3an?V(SM5Na(rXXuIzy2y3AdLtxw4n8P`z{;4DenW*$6vf>i?vp!EZyp&x?SN>tDxVlZieu ziQ6*Vmt&B0ll$WyJ(Ql8PrV8cOZyN_w=rf4jA+h&p~lR=K@|3n!)kZ%S2QjbVlqRy zAFBO~_w8}jw_6PZ?JzJB=xs3wyFt)9Hod8LR1D}H&eMAEt=?k>m;7a)aGuWY8Gxhy zAZ9!qP}Vz~0}$1N?}b16V>BA7c$4$X=VLgKTiy+QhMno;1(E8ZO=BMYx~aUSxZ*^h zYb2u*$#`yj9-cGuFlyL41wAo$_TzHXo13e;>p3tG+fi!927{Uk_aW!e*0GfAwmG<7 z^_Cl~-9q7byu#a{hMdQt5U57n&mphfBjut6e46#~#i2Vy3F)Jmb@bW0x#{JY6Ux9H^OBfSWTdrLLE^>c6iQh9)T>*wAE$lKlIjdzJIycG&>AaQR4 zFg+l=DI0QJJRi9k-oz;1Yh>Z?$FQcX;$a|5so8D0@mabVe5BQqrGEugW~m14qAZ;o z*^C<2Djvq*$Wp>W5%jq12Mi;E8~5484UU8G9~Z`a#mCcbR=+7Dmk#1a@T{Gbl@^h1yqlRgrom7lMd za>X7ntQ3Jg;wC%fYGe&+qoF41Y3zQ>A!qdn|OZj;Z~@JiudH9>~i+nWWU z@N1v(;P~~q2Xz_beIImD3W9IcV2QIX5TQ1r_WYG_5}qOgZ$aQK#=@b2DcrZis#rLF zPA1Q^(Tyc)RNW)1BYVU>(Bl+M(Akc5wCf$bb%4~m3P5LPDcV+UZrfcV{C1<$THoO2 z1Jk&PAa^#Bt%tZPZbo!myB<`e7P8#q;q5&W{^Lc2(AJmT_5;KQBQ4Z7he7P!M)`Vx z*dcD#y0RVs%jo0E;N36a-mc4_*rFhkChtz#M4`|GeY2eJO8|7>tBb`Lbb`g$A?rAFL?+plhN85el= zzFVObDWgTb+%WpfPtnYdP2KVu^$NM%ZE*A8Qgqk|$>9o!E7mK2>WZ}va-j-bjBrKc zOH;qmW1)(E3RA8XzY`;%FLHvG!*;`EF%QVe19`!qJ`QTkb)Q&nK2j!pFd~AYt`R=_)Wv?#F!|3g8Tk@9?#)04guf3|+)@<) z?WPV4?;)>r3F9|Zee#A1SG4#Ws+$aj4P^6KvRPx$t|KGkLhk@|TsqQa=p#FOLljg0 zC&E7siO&@8yS+~k?*$X@1YO_Iw&;f|LUQSI2HL+xFWLx<JV~||71AW zGt_=m^VNE^wOXD>yYNr@hF*N;!Xr;C5=ujdUk)FCI;P6?1S^5kaC_&_15d=Hlf*L| ze0Zqis1RG6ps02rlA!~yWDY(1@K9$*=FqFhBR%_s77ruOlbPqs%=7$te@{FeKJqVS zvBY^g-}}<=Bd;cq`xAMR(&3(mhuWSFKXae3VWbfiO*BIj&Co()G`Y}<~<3KmC)zegUBk>P0awMV1X8CX&Ku8 zTE00Q3$nsTUJ)Y|Jr;TL)oam$f_mz8`x1}a?_T2b2kfYLnUIq0`i5hey3UvfqH*SV zAf|yF__CX0@}j*7dOT@BH*pFQtKqXU37BhhFV;Pwxq(J{bnA4a3JXFCE&`?#KuqS38@6(2{V zdjQ`7JP7!ET*kVIkNb*qfVbi1X$}OHXk&S?}|jDgMiGIv)-1wG5fOJ z87=IFIoB_|ZvHhyCYcg^wxg~59=*txbARf(X_HgGfM>y{wQntQuo;jU{7nX*^417` zHriDH~YjY)z zM<%??kuX>C={X1$#sBP5w2|TC)BM#4e~*GqV-gw+!6lF;gR z!@6~AwET)4fd+p-TVY>rFIZd{;Mmf8mKNFzmfM%&2{>nH%L|m!HBC^>Z3VzZxI$@|jGHvv_)z zF&^XTml^Xio<5az$$pEcPh%|!`Xi0mjB_CI^4Uzy^LTm=W3wG*60fJR>Bjj5Gcyfu zq92v#8sh1f8|y|qeI`@uMLc~L)8sl5PoIr*8{0*aQgUs-YM;<>i|$*?#Fiu8{aQagPy2eFC?KS%fm5le+C=8+JRcEoI*8G zen=vb-(PUm%g2qA-*P+S$HN6FudY)Z#n%_SGJf3BGxn4Oh%-yTqV2=pA-w~pIGN$f1<^zrlk z#U%2x5r3ldC1;b!hm+91Fu}S;toZdod>nEU-ytRK%NO?LxK!yJn1Nge6XHIhvnepF<0N<4K zyJfrhZ%?5ALeht`9KaZRjDIusOHP-F2@Hd-nQ&G8B8mJ=+?Y}Rt?_H1C$h5!beebf z%k@w#us2BhaJGZHJR}_lxZm;D$L~t{HaTDTZ+WCs)$GTQ+ttStVo9euNugAV} z#p>mWgZW6`G4b&xV~_!%saa5m57)Lp`wUb30FHk92|TvX<| zY5n?JoLgL5ii*peD^Hch z%hTzxc#6kM3B)n50CRcijRSd#EMCfb;4H?atXs~P#h4T#KbjU#YWBK4>zfn_$IL+u#cLydD;4qSq!w!(w@) z&X5P>;+PX@@(&-og0l8!Qlq2=KfUrpm~oWG+3d@)VlK^u3uHp}6> zuFmcA@v*E<_|b{Jm^^tx531osU8`n7e8=u~H?d~#E^o6>w6C_o=amsLyKis3-@OCS z-z;E_s^K)Cx4DVg8yfvydr@)eV!wN*#CA3W>^lOrICNTzH%|zwar)fOuYfW{2X6Na)qiWyT2-NT0gKwIU5NhP3&F-y{Q?SMZBMK9$ zVlD~|RsTU1#NftVUt5J38vSG*6dJmAbQH5=Rj9{Im+R7B3h2HNmrUcnL+y9yJqjvn ze=RT}tLg-=#fSE^Qry@Vsq@Pkc;=$6e~Pvg6|=tDKl!D>`ASeit9}XScm<$Q`9GNI z;F1R|@lWE^*mDAjvKvvMJ-^ad`>}3G;3ovZr{@NgC+mLwR?u(>F!a^FO_PBh0nc2> zhPiA9LVJ4UU+wP(r2f@XSjDg86ubj`dPbmdwGSMX`VOgYjbD-(-M5pd(pUS%0_hMt z8(x%uYy0{Vu8B zB@GUmg;B?y7%vJw0?e$h_OmTCC{a|r0vnJ27!0$%y07Y#`a7`YG8g4n(VjxZtgrUR z7v+N|^*l()TigG<)K~qd?lakJp^>i=D-BrN^Rh)>{l5V9e+2ePJq4`(doB8EUw%|B z9LtTsgaxbrvmjH7Xbw?P`ziH*1+4N`{9Wi|M|K0nt^*2edjRsZ*pq5La-^*liP zhWf+Mr4%cD_1r-H-v{;o9aJ|c|7si@wD?!&#K)F^fuiIE7Q+?&V=&C|8_yvMghq=} zlu+p@I0m{|U+s@tq`rz%nNfNQzk~|WRQuKacc;|1%9Ag1NdtjsQruuE{S^j9RFuAg z(?M3g&7!-$Be1DTP%sid = 1; + // strcpy(stu1->name, "张三"); + // stu1->age = 18; + // STU *stu2 = (STU *)malloc(sizeof(STU)); + // stu2->sid = 2; + // strcpy(stu2->name, "李四"); + // stu2->age = 21; + // STU *stu3 = (STU *)malloc(sizeof(STU)); + // stu3->sid = 3; + // strcpy(stu3->name, "王五"); + // stu3->age = 15; + // STU *stu4 = (STU *)malloc(sizeof(STU)); + // stu4->sid = 4; + // strcpy(stu4->name, "赵六"); + // stu4->age = 13; + // head = insert_stu(head, stu1); + // head = insert_stu(head, stu2); + // head = insert_stu(head, stu3); + // head = insert_stu(head, stu4); + + while (1) + { + // printf("\033[2J"); + // printf("--------------------\n"); + printf("\t\t \033[%d;%dm学生管理系统\033[0m\n\n", BOLD, CYAN_B); + printf("\033[%d;%dm1) 添加学生 \t2) 删除学生 \t3) 打印 \n4) 查询 \t5) 修改 \t6) 排序 \n7) 反序 \t8) 加载数据 \t0) 退出(保存数据)\n请输入选项# \033[0m", BOLD, GREEN); + int cmd = 0; + scanf("%d", &cmd); + switch (cmd) + { + case 0: + // store_data(head); // 存储数据 + saveToFile(head, "./data/stu.date"); + return 1; + case 1: + printf("输入学生的 学号 姓名 年龄: "); + // 键盘收集数据并动态插入链表 + scanf("%hhd %s %d", &tsid, tname, &tage); // 键盘收集数据 + STU *item = (STU *)malloc(sizeof(STU)); // 申请一个节点的内存, 用来保存学生信息 + item->sid = tsid; // 保存学生学号到新建的节点 + strcpy(item->name, tname); // 保存学生姓名到新建的节点 + item->age = tage; // 保存学生年龄到新建的节点 + item->next = NULL; // 新建的节点的下一个节点指向空,因为是尾部插入 + head = insert_stu(head, item); // 将新建的节点插入到链表中 + break; + case 2: + printf("输入要删除的学生的学号: "); + scanf("%hhd", &tsid); + head = delete_stu(head, tsid); + break; + case 3: + shows(head); + break; + case 4: + printf("输入要查询的学生的学号: "); + scanf("%hhd", &tsid); + head = find_stu(head, tsid); + if (head == NULL) + { + printf("\033[%dm未找到 sid = %d 的学生\033[0m\n", RED, tsid); + } + else + { + printf("查询到的学生信息如下: \n"); + printf("\033[%dm学号\t姓名\t年龄\033[0m\n", BLUE_B); + printf("\033[%dm%d\t%s\t%d\033[0m\n", BLUE, head->sid, head->name, head->age); + } + break; + case 5: + printf("输入要修改的学生的学号:"); + scanf("%hhd", &tsid); + head = update_stu(head, tsid); + break; + case 6: + printf("排序学生信息:\n"); + head = sort_stu(head); + break; + case 7: + printf("反序学生信息:\n"); + head = reverse_stu(head); + break; + case 8: + printf("加载数据......\n"); + head = readFromFile("./data/stu.date"); + break; + default: + printf("\033[%dm选择错误\033[0m\n", RED); + break; + } + } + return 0; +} diff --git a/day15/d1-stuMangerSystem/objs/link.o b/day15/d1-stuMangerSystem/objs/link.o new file mode 100644 index 0000000000000000000000000000000000000000..184aa15aa159f336b6d965bb1f48191fac7f09c2 GIT binary patch literal 7984 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