From 44331f7bba94752af95b4ef2fd6c095b94690d48 Mon Sep 17 00:00:00 2001 From: flykhan Date: Thu, 20 Jul 2023 14:27:03 +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=20=E4=BC=98=E5=8C=96=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- day14/a.out | Bin 0 -> 13288 bytes day14/d1.c | 449 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 449 insertions(+) create mode 100755 day14/a.out create mode 100644 day14/d1.c diff --git a/day14/a.out b/day14/a.out new file mode 100755 index 0000000000000000000000000000000000000000..a245c7d745bc5678e6f6dac5df0d96e968891983 GIT binary patch literal 13288 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 +#include // malloc +#include // strcpy + +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; // 文本属性 + +// 定义学生信息结构体,链表的节点 +typedef struct stu_s +{ + int sid; + char name[32]; + int age; + + struct stu_s *next; +} STU; + +// 节点交换 +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 = 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; // 返回头指针 +} + +int main(int argc, char const *argv[]) +{ + STU *head = NULL; // 定义全局的头指针 + + // 声明临时变量,用来保存学生信息 + char tsid; + char tname[32]; + int tage; + + // 创建几个学生信息,用于测试 + STU *stu1 = (STU *)malloc(sizeof(STU)); + stu1->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) 打印 \t4) 查询 \n5) 修改 \t6) 排序 \t7) 反序 \t0) 退出\n请输入选项# \033[0m", BOLD, GREEN); + int cmd = 0; + scanf("%d", &cmd); + switch (cmd) + { + case 0: + 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; + default: + printf("\033[%dm选择错误\033[0m\n", RED); + break; + } + } + return 0; +}