From d184821b007edc6fbd48323d77a45de28f778798 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E9=9D=96=E9=9B=AF?= <16223438+shirley-wong@user.noreply.gitee.com> Date: Mon, 20 Oct 2025 13:17:58 +0000 Subject: [PATCH 01/33] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20da?= =?UTF-8?q?ikuan.cpp?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- daikuan.cpp | 125 ---------------------------------------------------- 1 file changed, 125 deletions(-) delete mode 100644 daikuan.cpp diff --git a/daikuan.cpp b/daikuan.cpp deleted file mode 100644 index 065d075..0000000 --- a/daikuan.cpp +++ /dev/null @@ -1,125 +0,0 @@ -#include -#include - -// 函数声明 -void calculateLoan(double principal, double annualRate, int years); -void displayAmortizationSchedule(double principal, double annualRate, int years, double monthlyPayment); -void displayResults(double monthlyPayment, double totalPayment, double principal); - -int main() { - double principal; - double annualRate; - int years; - char showSchedule; - - printf("=== 高级贷款计算系统 ===\n\n"); - - // 输入贷款信息 - printf("请输入贷款总额(元): "); - scanf("%lf", &principal); - - printf("请输入年利率(%%): "); - scanf("%lf", &annualRate); - - printf("请输入贷款年限: "); - scanf("%d", &years); - - // 验证输入 - if (principal <= 0 || annualRate <= 0 || years <= 0) { - printf("\n错误:输入值必须大于零!\n"); - return 1; - } - - printf("\n是否显示详细还款计划表?(y/n): "); - scanf(" %c", &showSchedule); - - printf("\n=== 计算结果 ===\n"); - calculateLoan(principal, annualRate, years); - - if (showSchedule == 'y' || showSchedule == 'Y') { - double monthlyRate = annualRate / 100 / 12; - int totalMonths = years * 12; - double monthlyPayment = (principal * monthlyRate * pow(1 + monthlyRate, totalMonths)) - / (pow(1 + monthlyRate, totalMonths) - 1); - displayAmortizationSchedule(principal, annualRate, years, monthlyPayment); - } - - return 0; -} - -void calculateLoan(double principal, double annualRate, int years) { - double monthlyRate = annualRate / 100 / 12; - int totalMonths = years * 12; - double monthlyPayment = (principal * monthlyRate * pow(1 + monthlyRate, totalMonths)) - / (pow(1 + monthlyRate, totalMonths) - 1); - double totalPayment = monthlyPayment * totalMonths; - - displayResults(monthlyPayment, totalPayment, principal); -} - -void displayResults(double monthlyPayment, double totalPayment, double principal) { - double totalInterest = totalPayment - principal; - - printf("\n贷款摘要:\n"); - printf("═══════════════════════════════\n"); - printf("?? 贷款总额: ¥%12.2f 元\n", principal); - printf("?? 月均还款: ¥%12.2f 元\n", monthlyPayment); - printf("?? 总还款额: ¥%12.2f 元\n", totalPayment); - printf("?? 支付利息: ¥%12.2f 元\n", totalInterest); - printf("?? 还款期限: %12d 个月\n", (int)(totalPayment / monthlyPayment)); - printf("═══════════════════════════════\n"); - - printf("\n财务分析:\n"); - printf("利息占比: %6.2f%%\n", (totalInterest / totalPayment) * 100); - printf("本金占比: %6.2f%%\n", (principal / totalPayment) * 100); - printf("年均还款: ¥%.2f 元\n", monthlyPayment * 12); -} - -void displayAmortizationSchedule(double principal, double annualRate, int years, double monthlyPayment) { - double monthlyRate = annualRate / 100 / 12; - int totalMonths = years * 12; - double balance = principal; - double totalInterest = 0; - - printf("\n\n=== 还款计划表(前12个月) ===\n"); - printf("┌───────┬────────────┬────────────┬────────────┬────────────┐\n"); - printf("│ 期数 │ 月供 │ 本金 │ 利息 │ 余额 │\n"); - printf("├───────┼────────────┼────────────┼────────────┼────────────┤\n"); - - for (int month = 1; month <= totalMonths && month <= 12; month++) { - double interest = balance * monthlyRate; - double principalPaid = monthlyPayment - interest; - balance -= principalPaid; - totalInterest += interest; - - printf("│ %5d │ %10.2f │ %10.2f │ %10.2f │ %10.2f │\n", - month, monthlyPayment, principalPaid, interest, balance); - } - printf("└───────┴────────────┴────────────┴────────────┴────────────┘\n"); - - // 显示最后12个月的还款情况(如果贷款期限超过24个月) - if (totalMonths > 24) { - printf("\n=== 还款计划表(最后12个月) ===\n"); - printf("┌───────┬────────────┬────────────┬────────────┬────────────┐\n"); - printf("│ 期数 │ 月供 │ 本金 │ 利息 │ 余额 │\n"); - printf("├───────┼────────────┼────────────┼────────────┼────────────┤\n"); - - // 重置余额重新计算到最后12个月 - balance = principal; - for (int month = 1; month <= totalMonths - 12; month++) { - double interest = balance * monthlyRate; - double principalPaid = monthlyPayment - interest; - balance -= principalPaid; - } - - for (int month = totalMonths - 11; month <= totalMonths; month++) { - double interest = balance * monthlyRate; - double principalPaid = monthlyPayment - interest; - balance -= principalPaid; - - printf("│ %5d │ %10.2f │ %10.2f │ %10.2f │ %10.2f │\n", - month, monthlyPayment, principalPaid, interest, balance); - } - printf("└───────┴────────────┴────────────┴────────────┴────────────┘\n"); - } -} -- Gitee From 10e1d0061468546290e1db82d2cc8128fcc9ecf2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E9=9D=96=E9=9B=AF?= <16223438+shirley-wong@user.noreply.gitee.com> Date: Mon, 20 Oct 2025 13:18:04 +0000 Subject: [PATCH 02/33] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20?= =?UTF-8?q?=E5=AD=A6=E7=94=9F=E8=80=83=E5=8B=A4=E7=B3=BB=E7=BB=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../.keep" | 0 .../attendance.c" | 155 ------------------ .../attendance.h" | 45 ----- .../main.c" | 82 --------- 4 files changed, 282 deletions(-) delete mode 100644 "\345\255\246\347\224\237\350\200\203\345\213\244\347\263\273\347\273\237/.keep" delete mode 100644 "\345\255\246\347\224\237\350\200\203\345\213\244\347\263\273\347\273\237/attendance.c" delete mode 100644 "\345\255\246\347\224\237\350\200\203\345\213\244\347\263\273\347\273\237/attendance.h" delete mode 100644 "\345\255\246\347\224\237\350\200\203\345\213\244\347\263\273\347\273\237/main.c" diff --git "a/\345\255\246\347\224\237\350\200\203\345\213\244\347\263\273\347\273\237/.keep" "b/\345\255\246\347\224\237\350\200\203\345\213\244\347\263\273\347\273\237/.keep" deleted file mode 100644 index e69de29..0000000 diff --git "a/\345\255\246\347\224\237\350\200\203\345\213\244\347\263\273\347\273\237/attendance.c" "b/\345\255\246\347\224\237\350\200\203\345\213\244\347\263\273\347\273\237/attendance.c" deleted file mode 100644 index 44095a1..0000000 --- "a/\345\255\246\347\224\237\350\200\203\345\213\244\347\263\273\347\273\237/attendance.c" +++ /dev/null @@ -1,155 +0,0 @@ -#include //用于printf,scanf等函数 -#include //用于malloc等内存分配函数 -#include //用于字符串操作函数 -#include // 用于控制台颜色 - -#include "attendance.h" - -// ========== 全局变量 ========== -Student *studentHead = NULL; //定义学生链表头指针,用于管理学生信息链表 -ClassRecord *recordHead = NULL; //定义考勤记录链表头指针,用于管理考勤记录链表 - -// ========== 控制台颜色 ========== -void setColor(int color) { //定义设置台颜色的参数 - SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color); //调用Windows API函数,设置控制台输出文本颜色 -} - -// ========== 学生管理 ========== -void addStudent() { - Student *p = (Student*)malloc(sizeof(Student)); //创造新学生节点 - printf("请输入 学号 姓名 班级:"); //提示用户输入学生的学号,姓名,班级信息 - scanf("%s %s %s", p->id, p->name, p->className); //读取用户输入的学号、姓名、班级信息,存入新学生节点 - p->next = studentHead; //将新节点的next指针指向原链表头,实现头插法 - studentHead = p; //将链表头指针指向新节点,完成新节点插入 - setColor(10); - printf(" 学生添加成功!\n"); //打印学生添加成功的提示信息 - setColor(7); -} - -void showStudents() { - Student *p = studentHead; //定义学生指针,并让其指向学生链表头 - setColor(11); - printf("\n%-10s %-10s %-10s\n", "学号", "姓名", "班级"); //打印学生信息表头,按指定格式对齐 - setColor(7); - while (p) { - printf("%-10s %-10s %-10s\n", p->id, p->name, p->className); //打印当前学生的学号、姓名、班级信息,按格式对齐 - p = p->next; //指针指向下一个学生节点 - } //循环结束 -} //函数结束 - -//删除学生信息 -void deleteStudent(char *id) { - Student *p = studentHead, *pre = NULL; //遍历查找要删除的学生 - while (p) { - if (strcmp(p->id, id) == 0) { //找到匹配学号 - if (pre) pre->next = p->next; //前驱节点指向当前节点的后继 - else studentHead = p->next; - free(p); //释放内存 - setColor(12); - printf(" 已删除学号 %s\n", id); - setColor(7); - return; - } - pre = p; //更新前驱节点 - p = p->next; //移动到下一个节点 - } - printf("未找到该学生!\n"); -} - -//开始考勤记录 -// ========== 考勤管理 ========== -void startAttendance(int lessonNo) { - ClassRecord *cr = (ClassRecord*)malloc(sizeof(ClassRecord)); //分配课程记录内存 - cr->lessonNo = lessonNo; - cr->attList = NULL; //初始化考勤链表为空 - cr->next = recordHead; //新记录插入链表头部 - recordHead = cr; //更新记录链表头 - - Student *p = studentHead; //遍历所有学生进行考勤 - printf("\n 第%d节课考勤:\n", lessonNo); - while (p) { - int st; - printf("学号:%s 姓名:%s 出勤输入1 缺勤输入0: ", p->id, p->name); - scanf("%d", &st); - Attendance *a = (Attendance*)malloc(sizeof(Attendance)); //分配考勤记录内存 - strcpy(a->studentId, p->id); //复制学号 - a->status = st; //设置考勤状态 - a->next = cr->attList; //插入考勤链表头部 - cr->attList = a; //更新考勤链表头 - p = p->next; - } - setColor(10);//设置颜色为绿色,输出考勤完成提示 - printf(" 考勤记录完成!\n"); - setColor(7); -} -//显示某次课程考勤情况的函数,参数lessonNo是课程编号 -void showLessonAttendance(int lessonNo) {//定义指针cr指向考勤记录链表头,用于查找目标课程 - ClassRecord *cr = recordHead;//遍历考勤记录链表,查找指定课程编号的记录//当cr不为NULL且课程编号不匹配时继续查找 - while (cr && cr->lessonNo != lessonNo) cr = cr->next;// 移动到下一个课程记录 - if (!cr) {// 检查是否找到目标课程记录 - printf(" 未找到第%d节课记录!\n", lessonNo); // 如果没有找到,输出提示信息 - return; // 退出函数 - } - Attendance *a = cr->attList; // 定义指针a指向当前课程的考勤链表头 - setColor(14); // 设置颜色为黄色(14代表黄色),输出表头 - printf("\n第%d节课考勤情况:\n", lessonNo); - printf("%-10s %-10s %-10s\n", "学号", "姓名", "状态"); - setColor(7); - while (a) { // 遍历当前课程的所有考勤记录 - Student *p = studentHead; // 定义指针p指向学生链表头,用于查找对应学号的学生信息 - while (p && strcmp(p->id, a->studentId) != 0) p = p->next; // 在学生链表中查找与当前考勤记录学号匹配的学生 - if (p) { // 移动到下一个学生 // 如果找到对应的学生信息 - printf("%-10s %-10s ", p->id, p->name); // 打印学生的学号和姓名 - if (a->status) { setColor(10); printf("出勤\n"); setColor(7); } // 根据考勤状态显示不同的颜色和信息 - else { setColor(12); printf("缺勤\n"); setColor(7); } // 如果状态为1(出勤),设置绿色并显示"出勤" - }// 如果状态为0(缺勤),设置红色并显示"缺勤" - a = a->next; // 移动到下一个考勤记录 - } -} -// 显示指定学生所有考勤记录的函数,参数id是学生学号 -void showStudentAttendance(char *id) { - ClassRecord *cr = recordHead; // 定义指针cr指向考勤记录链表头 - printf("\n学号 %s 的考勤情况:\n", id); // 输出查询提示 - while (cr) {//遍历所有课程记录 - Attendance *a = cr->attList; // 定义指针a指向当前课程的考勤链表头 - while (a) { // 遍历当前课程的所有考勤记录 - if (strcmp(a->studentId, id) == 0) { // 检查当前考勤记录是否与指定学号匹配 - printf("第%d节课: %s\n", cr->lessonNo, a->status ? "出勤" : "缺勤"); // 如果匹配,输出该课程的考勤情况 - } // 使用三元运算符根据status显示"出勤"或"缺勤" - a = a->next; // 移动到下一个考勤记录 - } - cr = cr->next; // 移动到下一个课程记录 - } -} - -// ========== 统计 ========== -void countLessonRate(int lessonNo) { - ClassRecord *cr = recordHead;//从课次记录链表头部开始查找 - while (cr && cr->lessonNo != lessonNo) cr = cr->next;//不匹配就移动到下一个课次记录 - if (!cr) {//cr为NULL表示遍历整个链表都没有找到匹配的课次 - printf("未找到该课次!\n"); - return;//提前结束函数执行 - } - int total = 0, present = 0;//总学生人数计数器;出勤学生人数计数器 - Attendance *a = cr->attList; - while (a) { - total++;//每有一条考勤记录,总人数加1 - if (a->status) present++;//检查考勤状态,a->status为真(非0)表示出勤;出勤人数加1 - a = a->next;//移动到下一个考勤记录 - } - printf("第%d节课出勤率: %.2f%%\n", lessonNo, (double)present / total * 100); -} - -void countStudentAbsence(char *id) { - ClassRecord *cr = recordHead;//获取课次记录链表头部 - int cnt = 0;//初始化缺勤次数计数器 - while (cr) {//这个循环检查该学生在每一节课的考勤情况 - Attendance *a = cr->attList;//获取当前课次的考勤记录链表头部 - while (a) { - if (strcmp(a->studentId, id) == 0 && a->status == 0) cnt++;//满足条件,缺勤次数加1 - a = a->next;//移动到当前课次的下一个考勤记录 - } - cr = cr->next;//移动到下一个课次记录 - } - printf("学号 %s 缺勤次数: %d\n", id, cnt); -} diff --git "a/\345\255\246\347\224\237\350\200\203\345\213\244\347\263\273\347\273\237/attendance.h" "b/\345\255\246\347\224\237\350\200\203\345\213\244\347\263\273\347\273\237/attendance.h" deleted file mode 100644 index 6a32f49..0000000 --- "a/\345\255\246\347\224\237\350\200\203\345\213\244\347\263\273\347\273\237/attendance.h" +++ /dev/null @@ -1,45 +0,0 @@ -#ifndef ATTENDANCE_H -#define ATTENDANCE_H - -// 学生信息结构体 -typedef struct Student { - char id[20]; - char name[20]; - char className[20];//学生所在班级 - struct Student *next;//指向下一个学生节点的指针,用于链表连接 -} Student; - -// 考勤记录结构体:用于存储单次考勤的信息,采用链表结构 -typedef struct Attendance { - char studentId[20];//学生学号 - int status; // 考勤状态,1=出勤, 0=缺勤 - struct Attendance *next;//指向下一条考勤记录的指针,用于链表连接 -} Attendance; - -// 课程记录结构体:用于存储某一次课程的考勤集合,采用链表结构 -typedef struct ClassRecord { - int lessonNo;//课程编号 - Attendance *attList;//指向该次课程考勤记录链表的头指针 - struct ClassRecord *next;//指向下一次课程记录的指针,用于链表连接 -} ClassRecord; - -// ========== 函数声明 ========== - -// 学生管理 -void addStudent(); //添加学生信息 -void showStudents();//显示所有学生信息 -void deleteStudent(char *id);//根据学号删除学生信息 - -// 考勤管理 -void startAttendance(int lessonNo);// 开始某一次课程的考勤 -void showLessonAttendance(int lessonNo);// 显示某一次课程的考勤记录 -void showStudentAttendance(char *id);// 显示某个学生的所有考勤记录 - -// 统计 -void countLessonRate(int lessonNo);// 统计某一次课程的出勤率 -void countStudentAbsence(char *id);// 统计某个学生的缺勤次数 - -// 工具 -void setColor(int color);// 设置控制台输出颜色(color为颜色代码) - -#endif diff --git "a/\345\255\246\347\224\237\350\200\203\345\213\244\347\263\273\347\273\237/main.c" "b/\345\255\246\347\224\237\350\200\203\345\213\244\347\263\273\347\273\237/main.c" deleted file mode 100644 index 835577e..0000000 --- "a/\345\255\246\347\224\237\350\200\203\345\213\244\347\263\273\347\273\237/main.c" +++ /dev/null @@ -1,82 +0,0 @@ -#include -#include -#include "attendance.h" - -int main() { - int choice; // 用户选择 - - // 主循环 - while (1) { - // 显示系统菜单 - setColor(11); // 青色标题 - printf("\n========= 学生考勤系统 =========\n"); - setColor(7); // 恢复默认颜色 - - // 菜单选项 - printf("1. 添加学生\n"); - printf("2. 删除学生\n"); - printf("3. 显示学生列表\n"); - printf("4. 开始考勤\n"); - printf("5. 查看某节课考勤\n"); - printf("6. 查看某个学生考勤\n"); - printf("7. 统计某节课出勤率\n"); - printf("8. 统计某学生缺勤次数\n"); - printf("0. 退出系统\n"); - printf("请输入选项:"); - - // 获取用户输入 - scanf("%d", &choice); - if (choice == 0) break; // 退出系统 - - char id[20]; // 学号缓冲区 - int lesson; // 课次变量 - - // 根据用户选择执行相应功能 - switch(choice) { - case 1: - addStudent(); // 添加学生 - break; - case 2: - printf("输入学号: "); - scanf("%s", id); - deleteStudent(id); // 删除学生 - break; - case 3: - showStudents(); // 显示学生列表 - break; - case 4: - printf("输入课次: "); - scanf("%d", &lesson); - startAttendance(lesson); // 开始考勤 - break; - case 5: - printf("输入课次: "); - scanf("%d", &lesson); - showLessonAttendance(lesson); // 查看课次考勤 - break; - case 6: - printf("输入学号: "); - scanf("%s", id); - showStudentAttendance(id); // 查看学生考勤 - break; - case 7: - printf("输入课次: "); - scanf("%d", &lesson); - countLessonRate(lesson); // 统计出勤率 - break; - case 8: - printf("输入学号: "); - scanf("%s", id); - countStudentAbsence(id); // 统计缺勤次数 - break; - default: - printf("无效输入!\n"); // 错误输入处理 - } - } - - // 退出系统 - setColor(10); // 绿色退出信息 - printf(" 感谢使用,再见!\n"); - setColor(7); // 恢复默认颜色 - return 0; -} -- Gitee From 0804bb6a06e6b9ec7fa64a49d8f109f11c876f1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=93=8D?= <16216866+xiang-zi-li@user.noreply.gitee.com> Date: Thu, 23 Oct 2025 05:32:21 +0000 Subject: [PATCH 03/33] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20=E6=A0=A1=E5=9B=AD?= =?UTF-8?q?=E5=AF=BC=E6=B8=B8=E7=B3=BB=E7=BB=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../.keep" | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 "\346\240\241\345\233\255\345\257\274\346\270\270\347\263\273\347\273\237/.keep" diff --git "a/\346\240\241\345\233\255\345\257\274\346\270\270\347\263\273\347\273\237/.keep" "b/\346\240\241\345\233\255\345\257\274\346\270\270\347\263\273\347\273\237/.keep" new file mode 100644 index 0000000..e69de29 -- Gitee From 9b50178ef12226a9b1d969331224405f47db6a34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=93=8D?= <16216866+xiang-zi-li@user.noreply.gitee.com> Date: Thu, 23 Oct 2025 07:28:13 +0000 Subject: [PATCH 04/33] =?UTF-8?q?add=20=E9=A1=B9=E7=9B=AE=E4=B9=A6.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 鏉庡搷 <16216866+xiang-zi-li@user.noreply.gitee.com> --- "\351\241\271\347\233\256\344\271\246" | 86 ++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 "\351\241\271\347\233\256\344\271\246" diff --git "a/\351\241\271\347\233\256\344\271\246" "b/\351\241\271\347\233\256\344\271\246" new file mode 100644 index 0000000..2000485 --- /dev/null +++ "b/\351\241\271\347\233\256\344\271\246" @@ -0,0 +1,86 @@ +棣欐ⅷ: 10-23 13:34:51 +鏍″洯瀵兼父绯荤粺椤圭洰涔 + +涓銆侀」鐩儗鏅笌鐩爣 + +椤圭洰鑳屾櫙 + +褰撳墠鏍″洯闈㈢Н鎵╁ぇ銆佸缓绛戝垎甯冨鏉傦紝鏂扮敓鎶ュ埌銆佽瀹㈡潵璁挎椂鏄撹糠澶辨柟鍚戯紝浼犵粺绾歌川鍦板浘鏇存柊鎱€佹寚寮曚笉鐩磋銆傛湰绯荤粺缁撳悎鏁版嵁缁撴瀯鐭ヨ瘑锛屽紑鍙戣交閲忓寲鏍″洯瀵兼父宸ュ叿锛岃В鍐虫牎鍥鑸棝鐐广 + +椤圭洰鐩爣 + +1.聽瀹炵幇鏍″洯鏍稿績鍦扮偣锛堟暀瀛︽ゼ銆侀鍫傘佸浘涔﹂绛夛級淇℃伅鐨勫瓨鍌ㄤ笌鏌ヨ銆 +2.聽鏀寔鐢ㄦ埛杈撳叆璧风偣鍜岀粓鐐癸紝蹇熺敓鎴愭渶浼樻琛岃矾绾裤 +3.聽鏍稿績杩愮敤绾挎ц〃涓庢爤涓ょ鏁版嵁缁撴瀯锛屼繚闅滃姛鑳借惤鍦颁笌杩愯鏁堢巼銆 + +浜屻佹牳蹇冨姛鑳借璁 + +1.聽鍦扮偣淇℃伅绠$悊锛氬瓨鍌ㄥ湴鐐瑰悕绉般佷綅缃潗鏍囥佸姛鑳戒粙缁嶃佸紑鏀炬椂闂寸瓑淇℃伅锛屾敮鎸佹柊澧炪佷慨鏀广佹煡璇㈡搷浣溿 +2.聽璺緞瀵艰埅锛氱敤鎴烽夋嫨璧风偣鍜岀粓鐐瑰悗锛岀郴缁熻绠楀苟灞曠ず鏈鐭矾寰勶紝鏍囨敞閫旂粡鍦扮偣鍙婇浼版琛屾椂闂淬 +3.聽鍘嗗彶璁板綍绠$悊锛氫繚瀛樼敤鎴疯繎10娆℃煡璇㈢殑璺嚎璁板綍锛屾敮鎸佹煡鐪嬩笌鍐嶆瀵艰埅銆 +4.聽鎿嶄綔鎾ら攢锛氱敤鎴疯閫夊湴鐐规垨鍙戣捣閿欒鏌ヨ鏃讹紝鍙挙閿涓婁竴姝ユ搷浣滐紝鍥炲綊涔嬪墠鐘舵併 + +涓夈佹暟鎹粨鏋勫簲鐢ㄨ璁 + +1. 绾挎ц〃锛堥『搴忚〃锛 + +- 搴旂敤鍦烘櫙锛氭牎鍥湴鐐逛俊鎭簱瀛樺偍銆佺敤鎴峰鑸巻鍙茶褰曞瓨鍌ㄣ +- 璁捐閫昏緫锛 +- 瀹氫箟鈥滃湴鐐光濇暟鎹厓绱狅紝鍖呭惈聽鍦扮偣ID銆佸悕绉般佸潗鏍嘪銆佸潗鏍嘫銆佸姛鑳芥弿杩奥5涓睘鎬э紝鐢ㄩ『搴忚〃瀛樺偍鎵鏈夊湴鐐逛俊鎭傞『搴忚〃鏀寔闅忔満璁块棶锛岀敤鎴锋煡璇⑩滃浘涔﹂鈥濇椂锛屽彲閫氳繃閬嶅巻椤哄簭琛ㄥ揩閫熷尮閰嶅搴斿厓绱狅紝鑾峰彇璇︾粏淇℃伅銆 +- 鐢ㄩ『搴忚〃瀛樺偍鐢ㄦ埛鍘嗗彶璁板綍锛屾瘡涓褰曞寘鍚犳煡璇㈡椂闂淬佽捣鐐广佺粓鐐广佽矾寰劼狅紝鎸夋煡璇㈡椂闂村掑簭鎺掑垪锛岀敤鎴风偣鍑烩滃巻鍙茶褰曗濆嵆鍙洿鎺ヨ皟鍙栵紝鏃犻渶閲嶅璁$畻璺緞銆 + +2. 鏍堬紙椤哄簭鏍堬級 + +- 搴旂敤鍦烘櫙锛氳矾寰勬悳绱㈢殑娣卞害浼樺厛閬嶅巻锛圖FS锛夈佺敤鎴锋搷浣滄挙閿銆 +- 璁捐閫昏緫锛 +- 璺緞鎼滅储锛氬皢鏍″洯鍦板浘鎶借薄涓衡滃湴鐐癸紙椤剁偣锛-璺緞锛堣竟锛夆濈殑鍥剧粨鏋勶紝鐢―FS閬嶅巻鎵炬渶鐭矾寰勩傛瘡璁块棶涓涓湴鐐癸紙濡備粠鈥滄牎闂ㄢ濆埌鈥滄暀瀛︽ゼA鈥濓級锛屽氨灏嗚鍦扮偣鍘嬪叆鏍堬紱鑻ュ悗缁矾绾夸笉閫氾紙濡傗滄暀瀛︽ゼA鈥濆埌鈥滃浘涔﹂鈥濇棤鐩磋揪璺級锛屽垯浠庢爤椤跺脊鍑衡滄暀瀛︽ゼA鈥濓紝鍥炴函鍒颁笂涓鍦扮偣鈥滄牎闂ㄢ濓紝閲嶆柊鎺㈢储鍏朵粬璺嚎锛岀洿鑷虫壘鍒扮粓鐐广 +- 鎿嶄綔鎾ら攢锛氱敤鏍堝瓨鍌ㄧ敤鎴锋瘡涓姝ユ搷浣滐紙濡傗滈夋嫨璧风偣锛氭牎闂ㄢ濃滈夋嫨缁堢偣锛氬浘涔﹂鈥濓級銆傜敤鎴风偣鍑烩滄挙閿鈥濇椂锛屽脊鍑烘爤椤舵搷浣滆褰曪紝绯荤粺鎭㈠鍒颁笂涓姝ョ姸鎬侊紙濡傛挙閿鈥滈夋嫨缁堢偣鈥濓紝鍥炲埌鈥滃緟閫夌粓鐐光濈晫闈級銆 + +鍥涖侀鏈熸垚鏋 + +1.聽鍙繍琛岀殑鏍″洯瀵兼父绯荤粺锛堟敮鎸佸湴鐐规煡璇€佽矾寰勫鑸佸巻鍙茶褰曘佹搷浣滄挙閿4澶у姛鑳斤級銆 +2.聽瀹屾暣鏂囨。锛氬惈闇姹傚垎鏋愩佹暟鎹粨鏋勮璁″浘銆佹牳蹇冧唬鐮侊紙闄勬敞閲婏級銆佹祴璇曟姤鍛娿 +3.聽婕旂ずDemo锛氳兘鐩磋灞曠ず鈥滅嚎鎬ц〃鏌ュ湴鐐光濃滄爤瀹炵幇DFS璺緞鈥濈殑杩囩▼锛岀鍚堟暟鎹粨鏋勮绋嬭姹傘 + +棣欐ⅷ: 10-23 14:19:41 +#include +#include + +// 鍒ゆ柇瀛楃涓叉槸鍚︿负鍥炴枃 +int HuiWen(char s[]) { + int len = strlen(s); + for (int i = 0; i < len / 2; i++) { + if (s[i] != s[len - 1 - i]) { + return 0; // 涓嶆槸鍥炴枃 + } + } + return 1; // 鏄洖鏂 +} + +int main() { + char s1[100], s2[100]; + int n1, n2; + + // 杈撳叆涓や釜瀛楃涓 + gets(s1); + gets(s2); + + // 璁$畻瀛楃涓查暱搴︼紙杩欓噷涔熷彲浠ョ敤strlen锛屼唬鐮佷腑鍐欐硶鍙紭鍖栵紝姝ゅ鎸夐昏緫瀹炵幇锛 + n1 = strlen(s1); + n2 = strlen(s2); + + // 鍒ゆ柇骞惰緭鍑虹粨鏋 + if (HuiWen(s1)) { + printf("%s鏄洖鏂囷紒\n", s1); + } else { + printf("%s涓嶆槸鍥炴枃锛乗n", s1); + } + + if (HuiWen(s2)) { + printf("%s鏄洖鏂囷紒\n", s2); + } else { + printf("%s涓嶆槸鍥炴枃锛乗n", s2); + } + + return 0; +} -- Gitee From 9abd0acd9451affbbcb6efbab4c8d4e77e438b97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=93=8D?= <16216866+xiang-zi-li@user.noreply.gitee.com> Date: Thu, 23 Oct 2025 07:38:11 +0000 Subject: [PATCH 05/33] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "\351\241\271\347\233\256\346\226\207\346\241\243/.keep" | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 "\351\241\271\347\233\256\346\226\207\346\241\243/.keep" diff --git "a/\351\241\271\347\233\256\346\226\207\346\241\243/.keep" "b/\351\241\271\347\233\256\346\226\207\346\241\243/.keep" new file mode 100644 index 0000000..e69de29 -- Gitee From 08380e091997a0068679c1f59e8b33c9443e3017 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=93=8D?= <16216866+xiang-zi-li@user.noreply.gitee.com> Date: Thu, 23 Oct 2025 13:14:14 +0000 Subject: [PATCH 06/33] =?UTF-8?q?=E6=88=90=E5=91=98=E5=88=86=E5=B7=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 鏉庡搷 <16216866+xiang-zi-li@user.noreply.gitee.com> --- ...20\345\221\230\350\247\222\350\211\262.docx" | Bin 0 -> 14679 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 "\351\241\271\347\233\256\346\226\207\346\241\243/24\350\256\241\347\256\227\346\234\272\346\210\220\345\221\230\350\247\222\350\211\262.docx" diff --git "a/\351\241\271\347\233\256\346\226\207\346\241\243/24\350\256\241\347\256\227\346\234\272\346\210\220\345\221\230\350\247\222\350\211\262.docx" "b/\351\241\271\347\233\256\346\226\207\346\241\243/24\350\256\241\347\256\227\346\234\272\346\210\220\345\221\230\350\247\222\350\211\262.docx" new file mode 100644 index 0000000000000000000000000000000000000000..e84a0d8c2835a2d1af6a2099cb749120a62b21da GIT binary patch literal 14679 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 Date: Sun, 26 Oct 2025 14:19:15 +0000 Subject: [PATCH 07/33] =?UTF-8?q?add=20=E6=BA=90=E4=BB=A3=E7=A0=81.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 鏉庡搷 <16216866+xiang-zi-li@user.noreply.gitee.com> --- "\346\272\220\344\273\243\347\240\201" | 429 +++++++++++++++++++++++++ 1 file changed, 429 insertions(+) create mode 100644 "\346\272\220\344\273\243\347\240\201" diff --git "a/\346\272\220\344\273\243\347\240\201" "b/\346\272\220\344\273\243\347\240\201" new file mode 100644 index 0000000..6733ac2 --- /dev/null +++ "b/\346\272\220\344\273\243\347\240\201" @@ -0,0 +1,429 @@ +#include +#include +#include +#include + +// 甯搁噺瀹氫箟 +#define MAX_PLACE 50 // 鏈澶у湴鐐规暟閲 +#define MAX_HISTORY 10 // 鏈澶у巻鍙茶褰曟暟 +#define MAX_OPERATE 20 // 鏈澶ф搷浣滆褰曟暟 +#define MAX_PATH 30 // 鏈澶ц矾寰勯暱搴 +#define WALK_SPEED 50 // 姝ヨ閫熷害锛50绫/鍒嗛挓锛堢敤浜庝及绠楁椂闂达級 + +// 1. 鏁版嵁缁撴瀯瀹氫箟 +// 鍦扮偣缁撴瀯浣擄紙椤剁偣锛 +typedef struct { + int id; // 鍦扮偣ID + char name[50]; // 鍦扮偣鍚嶇О + int x; // X鍧愭爣 + int y; // Y鍧愭爣 + char desc[200]; // 鍔熻兘鎻忚堪 + char openTime[50]; // 寮鏀炬椂闂 +} Place; + +// 椤哄簭琛紙瀛樺偍鍦扮偣搴撱佸巻鍙茶褰曪級 +// 鍦扮偣椤哄簭琛 +typedef struct { + Place data[MAX_PLACE]; + int length; +} PlaceList; + +// 瀵艰埅璁板綍缁撴瀯浣 +typedef struct { + char time[20]; // 鏌ヨ鏃堕棿 + char start[50]; // 璧风偣 + char end[50]; // 缁堢偣 + char path[MAX_PATH*50];// 璺緞淇℃伅 +} NavHistory; + +// 鍘嗗彶璁板綍椤哄簭琛 +typedef struct { + NavHistory data[MAX_HISTORY]; + int length; +} HistoryList; + +// 椤哄簭鏍堬紙鐢ㄤ簬DFS璺緞鎼滅储銆佹搷浣滄挙閿锛 +// 璺緞鏍堬紙瀛樺偍鍦扮偣ID锛 +typedef struct { + int data[MAX_PATH]; + int top; +} PathStack; + +// 鎿嶄綔鏍堬紙瀛樺偍鐢ㄦ埛鎿嶄綔鎻忚堪锛 +typedef struct { + char data[MAX_OPERATE][100]; + int top; +} OperateStack; + +// 鍥剧殑閭绘帴鐭╅樀锛堝瓨鍌ㄥ湴鐐归棿璺緞锛岃竟鏉冮噸涓鸿窛绂伙級 +int graph[MAX_PLACE][MAX_PLACE]; +int graphSize; // 鍥句腑椤剁偣鏁伴噺锛堝嵆鍦扮偣鏁伴噺锛 + +// 鍏ㄥ眬鍙橀噺锛堢畝鍖栬皟鐢紝瀹為檯椤圭洰鍙皝瑁呬负缁撴瀯浣擄級 +PlaceList placeList; // 鏍″洯鍦扮偣搴 +HistoryList historyList; // 瀵艰埅鍘嗗彶璁板綍 +PathStack pathStack; // DFS璺緞鏍 +OperateStack operateStack;// 鎿嶄綔鎾ら攢鏍 +char bestPath[MAX_PATH*50];// 鏈浼樿矾寰勫瓨鍌 +int minDistance = 0x7fffffff; // 鏈鐭窛绂伙紝鍒濆涓烘瀬澶у + +// 2. 鍒濆鍖栧嚱鏁 +// 鍒濆鍖栧湴鐐归『搴忚〃 +void initPlaceList() { + placeList.length = 0; + memset(placeList.data, 0, sizeof(placeList.data)); +} + +// 鍒濆鍖栧巻鍙茶褰曢『搴忚〃 +void initHistoryList() { + historyList.length = 0; + memset(historyList.data, 0, sizeof(historyList.data)); +} + +// 鍒濆鍖栬矾寰勬爤 +void initPathStack() { + pathStack.top = -1; +} + +// 鍒濆鍖栨搷浣滄爤 +void initOperateStack() { + operateStack.top = -1; +} + +// 鍒濆鍖栭偦鎺ョ煩闃 +void initGraph() { + graphSize = 0; + for (int i = 0; i < MAX_PLACE; i++) { + for (int j = 0; j < MAX_PLACE; j++) { + graph[i][j] = (i == j) ? 0 : 0x7fffffff; // 鍒濆鏃犺繛鎺ヤ负鏋佸ぇ鍊 + } + } +} + +// 3. 绾挎ц〃鐩稿叧鎿嶄綔锛堝湴鐐圭鐞嗐佸巻鍙茶褰曪級 +// 娣诲姞鍦扮偣鍒伴『搴忚〃 +void addPlace(Place p) { + if (placeList.length >= MAX_PLACE) { + printf("鍦扮偣搴撳凡婊★紝鏃犳硶娣诲姞锛乗n"); + return; + } + placeList.data[placeList.length++] = p; + graphSize++; // 鍥鹃《鐐规暟澧炲姞 + printf("娣诲姞鍦扮偣銆%s銆戞垚鍔燂紒\n", p.name); + // 璁板綍鎿嶄綔 + char op[100]; + sprintf(op, "娣诲姞鍦扮偣锛%s", p.name); + operateStack.top++; + strcpy(operateStack.data[operateStack.top], op); +} + +// 鏌ヨ鍦扮偣锛堟寜鍚嶇О锛 +Place* queryPlaceByName(char* name) { + for (int i = 0; i < placeList.length; i++) { + if (strcmp(placeList.data[i].name, name) == 0) { + return &placeList.data[i]; + } + } + return NULL; // 鏈壘鍒 +} + +// 娣诲姞瀵艰埅璁板綍鍒板巻鍙茶〃锛堟寜鏃堕棿鍊掑簭锛 +void addHistory(char* start, char* end, char* path) { + NavHistory h; + // 鑾峰彇褰撳墠鏃堕棿 + time_t now = time(NULL); + strftime(h.time, sizeof(h.time), "%Y-%m-%d %H:%M", localtime(&now)); + strcpy(h.start, start); + strcpy(h.end, end); + strcpy(h.path, path); + + // 鍘嗗彶璁板綍婊″垯绉婚櫎鏈鏃х殑锛堟渶鍚庝竴涓級 + if (historyList.length >= MAX_HISTORY) { + for (int i = MAX_HISTORY-1; i > 0; i--) { + historyList.data[i] = historyList.data[i-1]; + } + historyList.data[0] = h; + } else { + // 鏂拌褰曟彃鍏ュご閮紙鍊掑簭锛 + for (int i = historyList.length; i > 0; i--) { + historyList.data[i] = historyList.data[i-1]; + } + historyList.data[0] = h; + historyList.length++; + } + printf("鍘嗗彶璁板綍宸蹭繚瀛橈紒\n"); +} + +// 鏄剧ず鎵鏈夊巻鍙茶褰 +void showHistory() { + if (historyList.length == 0) { + printf("鏆傛棤瀵艰埅鍘嗗彶璁板綍锛乗n"); + return; + } + printf("\n===== 瀵艰埅鍘嗗彶璁板綍 =====\n"); + for (int i = 0; i < historyList.length; i++) { + printf("%d. 鏃堕棿锛%s\n 璧风偣锛%s -> 缁堢偣锛%s\n 璺緞锛%s\n", + i+1, historyList.data[i].time, + historyList.data[i].start, + historyList.data[i].end, + historyList.data[i].path); + } + printf("========================\n"); +} + +// 4. 鏍堢浉鍏虫搷浣滐紙DFS璺緞銆佹搷浣滄挙閿锛 +// 璺緞鏍堝帇鏍 +void pushPath(int placeId) { + if (pathStack.top >= MAX_PATH-1) { + printf("璺緞杩囬暱锛屾棤娉曠户缁帰绱紒\n"); + return; + } + pathStack.data[++pathStack.top] = placeId; +} + +// 璺緞鏍堝嚭鏍 +int popPath() { + if (pathStack.top == -1) { + printf("璺緞鏍堜负绌猴紒\n"); + return -1; + } + return pathStack.data[pathStack.top--]; +} + +// 鎿嶄綔鏍堝帇鏍 +void pushOperate(char* op) { + if (operateStack.top >= MAX_OPERATE-1) { + printf("鎿嶄綔璁板綍宸叉弧锛屾棤娉曡褰曪紒\n"); + return; + } + operateStack.top++; + strcpy(operateStack.data[operateStack.top], op); +} + +// 鎿嶄綔鎾ら攢锛堝嚭鏍堝苟鎭㈠鐘舵侊級 +void undoOperate() { + if (operateStack.top == -1) { + printf("鏃犳搷浣滃彲鎾ら攢锛乗n"); + return; + } + printf("鎾ら攢鎿嶄綔锛%s\n", operateStack.data[operateStack.top]); + operateStack.top--; + // 姝ゅ绠鍖栫姸鎬佹仮澶嶏紝瀹為檯闇鏍规嵁鎿嶄綔绫诲瀷澶勭悊锛堝鎾ら攢娣诲姞鍦扮偣鍒欏垹闄ゆ渶鍚庝竴涓級 + if (strstr(operateStack.data[operateStack.top+1], "娣诲姞鍦扮偣") != NULL) { + placeList.length--; + graphSize--; + } +} + +// 5. DFS璺緞鎼滅储锛堥掑綊瀹炵幇锛 +// 鍙傛暟锛氬綋鍓嶅湴鐐笽D銆佺粓鐐笽D銆佸凡璧拌窛绂汇佽闂爣璁 +void dfs(int currentId, int endId, int distance, int visited[]) { + // 鏍囪褰撳墠鍦扮偣宸茶闂 + visited[currentId] = 1; + // 灏嗗綋鍓嶅湴鐐瑰帇鏍 + pushPath(currentId); + + // 鍒拌揪缁堢偣锛屾洿鏂版渶鐭矾寰 + if (currentId == endId) { + if (distance < minDistance) { + minDistance = distance; + // 娓呯┖鏈浼樿矾寰 + memset(bestPath, 0, sizeof(bestPath)); + // 灏嗘爤涓矾寰勮浆涓哄瓧绗︿覆 + for (int i = 0; i <= pathStack.top; i++) { + strcat(bestPath, placeList.data[pathStack.data[i]].name); + if (i != pathStack.top) { + strcat(bestPath, " -> "); + } + } + } + // 鍥炴函锛氬嚭鏍堝苟鍙栨秷鏍囪 + popPath(); + visited[currentId] = 0; + return; + } + + // 閬嶅巻鎵鏈夌浉閭诲湴鐐 + for (int i = 0; i < graphSize; i++) { + // 鑻ユ湭璁块棶涓旀湁璺緞锛堣窛绂讳笉涓烘瀬澶у硷級 + if (visited[i] == 0 && graph[currentId][i] != 0x7fffffff) { + dfs(i, endId, distance + graph[currentId][i], visited); + } + } + + // 鍥炴函锛氬嚭鏍堝苟鍙栨秷鏍囪 + popPath(); + visited[currentId] = 0; +} + +// 璁$畻涓ょ偣闂寸洿绾胯窛绂伙紙浣滀负杈规潈閲嶅垵濮嬪寲绀轰緥锛 +int calcDistance(Place p1, Place p2) { + // 绠鍖栦负鏁存暟璺濈锛堝疄闄呭彲鎸夊嬀鑲″畾鐞嗚绠楃簿纭硷級 + return abs(p1.x - p2.x) + abs(p1.y - p2.y); +} + +// 鍒濆鍖栧浘鐨勮竟锛堟牴鎹湴鐐瑰潗鏍囪绠楄窛绂伙級 +void initGraphEdges() { + for (int i = 0; i < placeList.length; i++) { + for (int j = 0; j < placeList.length; j++) { + if (i != j) { + graph[i][j] = calcDistance(placeList.data[i], placeList.data[j]); + } + } + } +} + +// 瀵艰埅鍔熻兘锛氳緭鍏ヨ捣鐐圭粓鐐癸紝鐢熸垚鏈鐭矾寰 +void navigate(char* startName, char* endName) { + // 鏌ユ壘璧风偣鍜岀粓鐐 + Place* start = queryPlaceByName(startName); + Place* end = queryPlaceByName(endName); + if (start == NULL || end == NULL) { + printf("璧风偣鎴栫粓鐐逛笉瀛樺湪锛乗n"); + return; + } + if (start == end) { + printf("璧风偣鍜岀粓鐐圭浉鍚岋紝鏃犻渶瀵艰埅锛乗n"); + return; + } + + // 鍒濆鍖朌FS鐩稿叧鍙傛暟 + initPathStack(); + minDistance = 0x7fffffff; + memset(bestPath, 0, sizeof(bestPath)); + int visited[MAX_PLACE] = {0}; + + // 鎵цDFS鎼滅储鏈鐭矾寰 + dfs(start->id, end->id, 0, visited); + + if (minDistance == 0x7fffffff) { + printf("鏃犳硶鎵惧埌浠庛%s銆戝埌銆%s銆戠殑璺緞锛乗n", startName, endName); + return; + } + + // 璁$畻棰勪及鏃堕棿 + int time = minDistance / WALK_SPEED; + if (minDistance % WALK_SPEED != 0) time++; + + // 鏄剧ず缁撴灉 + printf("\n===== 瀵艰埅缁撴灉 =====\n"); + printf("璧风偣锛%s\n缁堢偣锛%s\n", startName, endName); + printf("鏈鐭矾寰勶細%s\n", bestPath); + printf("鎬昏窛绂伙細%d绫砛n", minDistance); + printf("棰勪及姝ヨ鏃堕棿锛%d鍒嗛挓\n", time); + printf("=====================\n"); + + // 淇濆瓨鍒板巻鍙茶褰 + addHistory(startName, endName, bestPath); + + // 璁板綍鎿嶄綔 + char op[100]; + sprintf(op, "瀵艰埅锛%s -> %s", startName, endName); + pushOperate(op); +} + +// 6. 娴嬭瘯鏁版嵁涓庝富鍑芥暟 +// 鍔犺浇娴嬭瘯鍦扮偣鏁版嵁 +void loadTestData() { + // 鍒濆鍖栧湴鐐 + Place p1 = {0, "鏍¢棬", 0, 0, "鏍″洯涓诲叆鍙", "00:00-24:00"}; + Place p2 = {1, "鏁欏妤糀", 100, 200, "涓昏鏁欏鍖", "08:00-22:00"}; + Place p3 = {2, "鍥句功棣", 300, 200, "鍥句功鍊熼槄涓庤嚜涔", "08:30-21:30"}; + Place p4 = {3, "绗竴椋熷爞", 200, 400, "鎻愪緵涓夐", "06:30-21:00"}; + Place p5 = {4, "鎿嶅満", 100, 500, "浣撹偛娲诲姩鍦哄湴", "06:00-23:00"}; + + // 娣诲姞鍒板湴鐐瑰簱 + addPlace(p1); + addPlace(p2); + addPlace(p3); + addPlace(p4); + addPlace(p5); + + // 鍒濆鍖栧浘杈癸紙璺濈锛 + initGraphEdges(); +} + +// 涓昏彍鍗 +void showMenu() { + printf("\n===== 鏍″洯瀵兼父绯荤粺 =====\n"); + printf("1. 鏌ョ湅鍦扮偣淇℃伅\n"); + printf("2. 瀵艰埅璺嚎鏌ヨ\n"); + printf("3. 鏌ョ湅鍘嗗彶璁板綍\n"); + printf("4. 鎾ら攢涓婁竴姝ユ搷浣淺n"); + printf("5. 閫鍑虹郴缁焅n"); + printf("========================\n"); + printf("璇疯緭鍏ユ搷浣滅紪鍙凤細"); +} + +int main() { + // 鍒濆鍖栨墍鏈夋暟鎹粨鏋 + initPlaceList(); + initHistoryList(); + initPathStack(); + initOperateStack(); + initGraph(); + + // 鍔犺浇娴嬭瘯鏁版嵁锛堝疄闄呭彲鎵嬪姩娣诲姞锛 + loadTestData(); + printf("绯荤粺鍒濆鍖栧畬鎴愶紝娆㈣繋浣跨敤鏍″洯瀵兼父绯荤粺锛乗n"); + + int choice; + char name[50], start[50], end[50]; + Place* p; + + while (1) { + showMenu(); + scanf("%d", &choice); + getchar(); // 鍚告敹鎹㈣绗 + + switch (choice) { + case 1: + // 鏌ョ湅鍦扮偣淇℃伅 + printf("璇疯緭鍏ヨ鏌ヨ鐨勫湴鐐瑰悕绉帮細"); + fgets(name, sizeof(name), stdin); + name[strlen(name)-1] = '\0'; // 鍘婚櫎鎹㈣绗 + p = queryPlaceByName(name); + if (p != NULL) { + printf("\n===== 鍦扮偣璇︽儏 =====\n"); + printf("ID锛%d\n鍚嶇О锛%s\n鍧愭爣锛(%d,%d)\n鍔熻兘锛%s\n寮鏀炬椂闂达細%s\n", + p->id, p->name, p->x, p->y, p->desc, p->openTime); + printf("=====================\n"); + } else { + printf("鏈壘鍒拌鍦扮偣锛乗n"); + } + break; + + case 2: + // 瀵艰埅璺嚎鏌ヨ + printf("璇疯緭鍏ヨ捣鐐癸細"); + fgets(start, sizeof(start), stdin); + start[strlen(start)-1] = '\0'; + printf("璇疯緭鍏ョ粓鐐癸細"); + fgets(end, sizeof(end), stdin); + end[strlen(end)-1] = '\0'; + navigate(start, end); + break; + + case 3: + // 鏌ョ湅鍘嗗彶璁板綍 + showHistory(); + break; + + case 4: + // 鎾ら攢涓婁竴姝ユ搷浣 + undoOperate(); + break; + + case 5: + // 閫鍑虹郴缁 + printf("鎰熻阿浣跨敤锛屽啀瑙侊紒\n"); + exit(0); + + default: + printf("杈撳叆閿欒锛岃閲嶆柊閫夋嫨锛乗n"); + break; + } + } + + return 0; +} \ No newline at end of file -- Gitee From 1d77aa0a0cdaafb2efddde109a8fd866bac8ee41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=81=92?= <16212856+butter_01@user.noreply.gitee.com> Date: Fri, 14 Nov 2025 14:00:40 +0000 Subject: [PATCH 08/33] =?UTF-8?q?add=20=E9=A1=B9=E7=9B=AE=E6=96=87?= =?UTF-8?q?=E6=A1=A3/=E6=A0=91=E7=BB=93=E6=9E=84=20main.c.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 寮犳亽 <16212856+butter_01@user.noreply.gitee.com> --- ...46\240\221\347\273\223\346\236\204 main.c" | 278 ++++++++++++++++++ 1 file changed, 278 insertions(+) create mode 100644 "\351\241\271\347\233\256\346\226\207\346\241\243/\346\240\221\347\273\223\346\236\204 main.c" diff --git "a/\351\241\271\347\233\256\346\226\207\346\241\243/\346\240\221\347\273\223\346\236\204 main.c" "b/\351\241\271\347\233\256\346\226\207\346\241\243/\346\240\221\347\273\223\346\236\204 main.c" new file mode 100644 index 0000000..9b240cc --- /dev/null +++ "b/\351\241\271\347\233\256\346\226\207\346\241\243/\346\240\221\347\273\223\346\236\204 main.c" @@ -0,0 +1,278 @@ +#include "campus_tree.h" + +// -------------------------- 鍓嶅簭閬嶅巻 -------------------------- +void PreOrder_Traverse(TreeNode* node, int depth) { + if (!node) return; + for (int i = 0; i < depth; i++) printf(" "); + printf("|-%s锛圛D锛%d锛岀埗鑺傜偣锛%s锛塡n", + node->data.name, node->data.id, + node->parent ? node->parent->data.name : "鏃"); + PreOrder_Traverse(node->child, depth + 1); + PreOrder_Traverse(node->sibling, depth); +} + +// -------------------------- 娓呯悊杈撳叆缂撳啿鍖 -------------------------- +void clearInputBuffer() { + while (getchar() != '\n'); // 娓呯┖缂撳啿鍖烘畫鐣欑殑瀛楃 +} + +// -------------------------- 浜や簰鍑芥暟 -------------------------- +void PrintMenu() { + printf("\n 鏍″洯瀵兼父绯荤粺 "); + printf("\n======================================"); + printf("\n1. 鏌ョ湅鏍戠粨鏋勶紙鍓嶅簭閬嶅巻锛"); + printf("\n2. 鏌ョ湅鎵鏈夊湴鐐癸紙灞傛閬嶅巻锛"); + printf("\n3. 鎸夊悕绉版煡璇㈠湴鐐"); + printf("\n4. 鎸夌被鍨嬫煡璇㈠湴鐐"); + printf("\n5. 瀵艰埅璺緞瑙勫垝锛堟爲DFS瀹炵幇锛"); + printf("\n6. 鎾ら攢涓婁竴姝ユ搷浣"); + printf("\n7. 閫鍑虹郴缁"); + printf("\n======================================"); + printf("\n璇疯緭鍏ュ姛鑳界紪鍙凤紙1-7锛夛細"); +} + +void InteractiveSearchByName(Tree tree, Stack* opStack) { + char name[50], op[100]; + printf("\n璇疯緭鍏ュ湴鐐瑰悕绉帮細"); + fgets(name, 50, stdin); + name[strcspn(name, "\n")] = '\0'; + + sprintf(op, "鏌ヨ鍦扮偣锛%s", name); + PushStack(opStack, op); + + TreeNode* node = SearchNodeByName(tree, name); + if (node) { + printf("\n銆愭煡璇㈢粨鏋溿慭n"); + printf("鍚嶇О锛%s | ID锛%d\n", node->data.name, node->data.id); + printf("鍧愭爣锛(%.1f, %.1f)\n", node->data.x, node->data.y); + printf("绫诲瀷锛%s\n", node->data.desc); + printf("寮鏀炬椂闂达細%s\n", node->data.openTime); + printf("鐖惰妭鐐癸細%s\n", node->parent->data.name); + } else { + printf("\n鏈壘鍒板湴鐐癸細%s\n", name); + } +} + +void InteractiveSearchByType(Tree tree, Stack* opStack) { + char type[20], op[50]; + printf("\n璇疯緭鍏ュ湴鐐圭被鍨嬶紙濡傛暀瀛︽ゼ銆侀鍫傦級锛"); + fgets(type, 20, stdin); + type[strcspn(type, "\n")] = '\0'; + + sprintf(op, "鏌ヨ绫诲瀷锛%s", type); + PushStack(opStack, op); + + Place result[10]; + int count = 0; + SearchNodesByType(tree, type, result, &count); + if (count > 0) { + printf("\n銆愭煡璇㈢粨鏋溿戝叡%d涓%s锛歕n", count, type); + for (int i = 0; i < count; i++) { + printf("%d. %s | 寮鏀炬椂闂达細%s\n", + i+1, result[i].name, result[i].openTime); + } + } else { + printf("\n鏈壘鍒拌绫诲瀷鍦扮偣\n"); + } +} + +// 鏍慏FS璺緞鎼滅储锛堟敮鎸佹牴鑺傜偣涓浆锛屼换鎰忓湴鐐逛簰閫氾級 +int TreeDFS_PathSearch(TreeNode* start, TreeNode* end, Stack* pathStack, VisitedNode* visited, int maxNodes) { + if (!start || !end) return -1; + + // 妫鏌ュ凡璁块棶 + for (int i = 0; i < maxNodes; i++) { + if (visited[i].node == start && visited[i].visited) return 0; + } + + // 鏍囪璁块棶 + for (int i = 0; i < maxNodes; i++) { + if (visited[i].node == NULL) { + visited[i].node = start; + visited[i].visited = 1; + break; + } + } + + PushStack(pathStack, start); + + // 鎵惧埌缁堢偣 + if (start == end) return 1; + + // 1. 閬嶅巻瀛愯妭鐐 + TreeNode* child = start->child; + while (child) { + if (TreeDFS_PathSearch(child, end, pathStack, visited, maxNodes) == 1) return 1; + child = child->sibling; + } + + // 2. 閬嶅巻鍏勫紵鑺傜偣 + TreeNode* sibling = start->sibling; + while (sibling) { + if (TreeDFS_PathSearch(sibling, end, pathStack, visited, maxNodes) == 1) return 1; + sibling = sibling->sibling; + } + + // 3. 鍥炴函鍒扮埗鑺傜偣锛堝叧閿細閫氳繃鏍硅妭鐐逛腑杞級 + if (start->parent != NULL) { + if (TreeDFS_PathSearch(start->parent, end, pathStack, visited, maxNodes) == 1) return 1; + } + + // 鍥炴函 + PopStack(pathStack, &start); + for (int i = 0; i < maxNodes; i++) { + if (visited[i].node == start) visited[i].visited = 0; + } + return 0; +} + +void InteractiveNavigation(Tree tree, Stack* nodeStack, Stack* opStack) { + char startName[50], endName[50], op[200]; + printf("\n璇疯緭鍏ヨ捣鐐癸細"); + fgets(startName, 50, stdin); + startName[strcspn(startName, "\n")] = '\0'; + + printf("璇疯緭鍏ョ粓鐐癸細"); + fgets(endName, 50, stdin); + endName[strcspn(endName, "\n")] = '\0'; + + snprintf(op, sizeof(op), "瀵艰埅锛%s -> %s", startName, endName); + PushStack(opStack, op); + + TreeNode* start = SearchNodeByName(tree, startName); + TreeNode* end = SearchNodeByName(tree, endName); + if (!start || !end) { + printf("\n璧风偣鎴栫粓鐐逛笉瀛樺湪锛乗n"); + return; + } + + Stack pathStack; + InitStack(&pathStack, 0); + Stack tempStack; + InitStack(&tempStack, 0); + VisitedNode visited[20] = {0}; + + // 璋冪敤鏍慏FS鎼滅储 + if (TreeDFS_PathSearch(start, end, &pathStack, visited, 20) == 1) { + printf("\n鏈浼樿矾寰勶紙绾爲DFS鐢熸垚锛夛細\n"); + float totalDist = 0.0f; + TreeNode* prev = NULL; + TreeNode* node; + int idx = 1; + + // 鍙嶈浆璺緞骞惰繃婊ゆ牴鑺傜偣 + while (PopStack(&pathStack, &node) == 0) { + if (strcmp(node->data.name, "鏍″洯鎬昏") != 0) { + PushStack(&tempStack, node); + } + } + + // 杈撳嚭璺緞 + while (PopStack(&tempStack, &node) == 0) { + printf("%d. %s", idx++, node->data.name); + if (prev != NULL) { + float dist = CalculateDistance(prev, node); + totalDist += dist; + printf("锛堣窛绂诲墠涓绔欙細%.1f绫筹級", dist); + } + printf("\n"); + prev = node; + } + + // 姝ヨ鏃堕棿淇濆簳1鍒嗛挓 + float walkTime = totalDist / 80.0f; + walkTime = walkTime < 1.0f ? 1.0f : walkTime; + printf("\n鎬昏窛绂伙細%.1f绫 | 棰勪及姝ヨ鏃堕棿锛%.0f鍒嗛挓\n", totalDist, walkTime); + } else { + printf("\n鏈壘鍒板彲琛岃矾寰勶紒\n"); + } + + DestroyStack(&pathStack); + DestroyStack(&tempStack); +} + +// 鎾ら攢鍔熻兘瀹炵幇 +void InteractiveUndo(Stack* opStack) { + if (opStack->top == -1) { + printf("\n鏆傛棤鎿嶄綔鍙挙閿\n"); + return; + } + char* lastOp; + if (PopStack(opStack, &lastOp) == 0) { + printf("\n宸叉挙閿鎿嶄綔锛%s\n", lastOp); + free(lastOp); + } else { + printf("\n鎾ら攢澶辫触\n"); + } +} + +// -------------------------- 4. main鍑芥暟 -------------------------- +int main() { + Tree campusTree = InitTree(); + Stack opStack; + InitStack(&opStack, 1); + Stack nodeStack; + InitStack(&nodeStack, 0); + + // 鏍″洯鍦扮偣鏁版嵁锛坉esc瀛楁瀛樺偍绫诲瀷锛 + Place places[] = { + {1, "澶ф垚妤糄", 10.0f, 20.0f, "鏁欏妤", "6:00-23:00"}, + {2, "闀块妤糃", 15.0f, 25.0f, "鏁欏妤", "6:00-23:00"}, + {3, "涓椋熷爞", 5.0f, 30.0f, "椋熷爞", "5:00-21:00"}, + {4, "浜旈鍫", 20.0f, 10.0f, "椋熷爞", "5:00-21:00"}, + {5, "鍥句功棣", 12.0f, 15.0f, "鍥句功棣", "6:00-23:00"}, + {6, "鏍¢棬", 0.0f, 0.0f, "鍏朵粬", "鍏ㄥぉ"}, + {7, "鎿嶅満", 18.0f, 35.0f, "鍏朵粬", "6:00-22:00"}, + {8, "鏌氬瓙鏋", 4.0f, 32.0f, "椋熷爞", "5:00-21:00"}, + {9, "灏忓悆琛", 3.0f, 5.0f, "鍏朵粬", "鍏ㄥぉ"}, + {10, "瀹胯垗1鍖", 65.0f, 35.0f, "鍏朵粬", "6:00-23:00"} + }; + + // 鏍戠粨鏋勶細鎵鏈夊湴鐐逛綔涓烘牴鑺傜偣鐨勫瓙鑺傜偣锛堝厔寮熷叧绯伙級 + int placeCount = sizeof(places) / sizeof(Place); + for (int i = 0; i < placeCount; i++) { + AddChildNode(campusTree, places[i]); + } + + // 涓诲惊鐜 + int choice; + while (1) { + PrintMenu(); + while (scanf("%d", &choice) != 1) { + clearInputBuffer(); + printf("\n璇疯緭鍏ユ湁鏁堢殑鏁板瓧缂栧彿锛1-7锛夛細"); + } + clearInputBuffer(); + + switch (choice) { + case 1: + printf("\n銆愭爲缁撴瀯锛堝墠搴忛亶鍘嗭級銆慭n"); + PreOrder_Traverse(campusTree, 0); + break; + case 2: + printf("\n銆愭墍鏈夊湴鐐癸紙灞傛閬嶅巻锛夈慭n"); + Level_Traverse(campusTree); + break; + case 3: + InteractiveSearchByName(campusTree, &opStack); + break; + case 4: + InteractiveSearchByType(campusTree, &opStack); + break; + case 5: + InteractiveNavigation(campusTree, &nodeStack, &opStack); + break; + case 6: + InteractiveUndo(&opStack); + break; + case 7: + printf("\n鎰熻阿浣跨敤锛屽啀瑙侊紒\n"); + DestroyTree(&campusTree); + DestroyStack(&opStack); + DestroyStack(&nodeStack); + return 0; + default: + printf("\n杈撳叆閿欒锛岃閲嶆柊閫夋嫨锛乗n"); + } + } +} \ No newline at end of file -- Gitee From d8019d1ec09e3372f34e98ac2a2ad8ba3434cf7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=81=92?= <16212856+butter_01@user.noreply.gitee.com> Date: Fri, 14 Nov 2025 14:01:50 +0000 Subject: [PATCH 09/33] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20?= =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E6=96=87=E6=A1=A3/=E6=A0=91=E7=BB=93?= =?UTF-8?q?=E6=9E=84=20main.c?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...46\240\221\347\273\223\346\236\204 main.c" | 278 ------------------ 1 file changed, 278 deletions(-) delete mode 100644 "\351\241\271\347\233\256\346\226\207\346\241\243/\346\240\221\347\273\223\346\236\204 main.c" diff --git "a/\351\241\271\347\233\256\346\226\207\346\241\243/\346\240\221\347\273\223\346\236\204 main.c" "b/\351\241\271\347\233\256\346\226\207\346\241\243/\346\240\221\347\273\223\346\236\204 main.c" deleted file mode 100644 index 9b240cc..0000000 --- "a/\351\241\271\347\233\256\346\226\207\346\241\243/\346\240\221\347\273\223\346\236\204 main.c" +++ /dev/null @@ -1,278 +0,0 @@ -#include "campus_tree.h" - -// -------------------------- 鍓嶅簭閬嶅巻 -------------------------- -void PreOrder_Traverse(TreeNode* node, int depth) { - if (!node) return; - for (int i = 0; i < depth; i++) printf(" "); - printf("|-%s锛圛D锛%d锛岀埗鑺傜偣锛%s锛塡n", - node->data.name, node->data.id, - node->parent ? node->parent->data.name : "鏃"); - PreOrder_Traverse(node->child, depth + 1); - PreOrder_Traverse(node->sibling, depth); -} - -// -------------------------- 娓呯悊杈撳叆缂撳啿鍖 -------------------------- -void clearInputBuffer() { - while (getchar() != '\n'); // 娓呯┖缂撳啿鍖烘畫鐣欑殑瀛楃 -} - -// -------------------------- 浜や簰鍑芥暟 -------------------------- -void PrintMenu() { - printf("\n 鏍″洯瀵兼父绯荤粺 "); - printf("\n======================================"); - printf("\n1. 鏌ョ湅鏍戠粨鏋勶紙鍓嶅簭閬嶅巻锛"); - printf("\n2. 鏌ョ湅鎵鏈夊湴鐐癸紙灞傛閬嶅巻锛"); - printf("\n3. 鎸夊悕绉版煡璇㈠湴鐐"); - printf("\n4. 鎸夌被鍨嬫煡璇㈠湴鐐"); - printf("\n5. 瀵艰埅璺緞瑙勫垝锛堟爲DFS瀹炵幇锛"); - printf("\n6. 鎾ら攢涓婁竴姝ユ搷浣"); - printf("\n7. 閫鍑虹郴缁"); - printf("\n======================================"); - printf("\n璇疯緭鍏ュ姛鑳界紪鍙凤紙1-7锛夛細"); -} - -void InteractiveSearchByName(Tree tree, Stack* opStack) { - char name[50], op[100]; - printf("\n璇疯緭鍏ュ湴鐐瑰悕绉帮細"); - fgets(name, 50, stdin); - name[strcspn(name, "\n")] = '\0'; - - sprintf(op, "鏌ヨ鍦扮偣锛%s", name); - PushStack(opStack, op); - - TreeNode* node = SearchNodeByName(tree, name); - if (node) { - printf("\n銆愭煡璇㈢粨鏋溿慭n"); - printf("鍚嶇О锛%s | ID锛%d\n", node->data.name, node->data.id); - printf("鍧愭爣锛(%.1f, %.1f)\n", node->data.x, node->data.y); - printf("绫诲瀷锛%s\n", node->data.desc); - printf("寮鏀炬椂闂达細%s\n", node->data.openTime); - printf("鐖惰妭鐐癸細%s\n", node->parent->data.name); - } else { - printf("\n鏈壘鍒板湴鐐癸細%s\n", name); - } -} - -void InteractiveSearchByType(Tree tree, Stack* opStack) { - char type[20], op[50]; - printf("\n璇疯緭鍏ュ湴鐐圭被鍨嬶紙濡傛暀瀛︽ゼ銆侀鍫傦級锛"); - fgets(type, 20, stdin); - type[strcspn(type, "\n")] = '\0'; - - sprintf(op, "鏌ヨ绫诲瀷锛%s", type); - PushStack(opStack, op); - - Place result[10]; - int count = 0; - SearchNodesByType(tree, type, result, &count); - if (count > 0) { - printf("\n銆愭煡璇㈢粨鏋溿戝叡%d涓%s锛歕n", count, type); - for (int i = 0; i < count; i++) { - printf("%d. %s | 寮鏀炬椂闂达細%s\n", - i+1, result[i].name, result[i].openTime); - } - } else { - printf("\n鏈壘鍒拌绫诲瀷鍦扮偣\n"); - } -} - -// 鏍慏FS璺緞鎼滅储锛堟敮鎸佹牴鑺傜偣涓浆锛屼换鎰忓湴鐐逛簰閫氾級 -int TreeDFS_PathSearch(TreeNode* start, TreeNode* end, Stack* pathStack, VisitedNode* visited, int maxNodes) { - if (!start || !end) return -1; - - // 妫鏌ュ凡璁块棶 - for (int i = 0; i < maxNodes; i++) { - if (visited[i].node == start && visited[i].visited) return 0; - } - - // 鏍囪璁块棶 - for (int i = 0; i < maxNodes; i++) { - if (visited[i].node == NULL) { - visited[i].node = start; - visited[i].visited = 1; - break; - } - } - - PushStack(pathStack, start); - - // 鎵惧埌缁堢偣 - if (start == end) return 1; - - // 1. 閬嶅巻瀛愯妭鐐 - TreeNode* child = start->child; - while (child) { - if (TreeDFS_PathSearch(child, end, pathStack, visited, maxNodes) == 1) return 1; - child = child->sibling; - } - - // 2. 閬嶅巻鍏勫紵鑺傜偣 - TreeNode* sibling = start->sibling; - while (sibling) { - if (TreeDFS_PathSearch(sibling, end, pathStack, visited, maxNodes) == 1) return 1; - sibling = sibling->sibling; - } - - // 3. 鍥炴函鍒扮埗鑺傜偣锛堝叧閿細閫氳繃鏍硅妭鐐逛腑杞級 - if (start->parent != NULL) { - if (TreeDFS_PathSearch(start->parent, end, pathStack, visited, maxNodes) == 1) return 1; - } - - // 鍥炴函 - PopStack(pathStack, &start); - for (int i = 0; i < maxNodes; i++) { - if (visited[i].node == start) visited[i].visited = 0; - } - return 0; -} - -void InteractiveNavigation(Tree tree, Stack* nodeStack, Stack* opStack) { - char startName[50], endName[50], op[200]; - printf("\n璇疯緭鍏ヨ捣鐐癸細"); - fgets(startName, 50, stdin); - startName[strcspn(startName, "\n")] = '\0'; - - printf("璇疯緭鍏ョ粓鐐癸細"); - fgets(endName, 50, stdin); - endName[strcspn(endName, "\n")] = '\0'; - - snprintf(op, sizeof(op), "瀵艰埅锛%s -> %s", startName, endName); - PushStack(opStack, op); - - TreeNode* start = SearchNodeByName(tree, startName); - TreeNode* end = SearchNodeByName(tree, endName); - if (!start || !end) { - printf("\n璧风偣鎴栫粓鐐逛笉瀛樺湪锛乗n"); - return; - } - - Stack pathStack; - InitStack(&pathStack, 0); - Stack tempStack; - InitStack(&tempStack, 0); - VisitedNode visited[20] = {0}; - - // 璋冪敤鏍慏FS鎼滅储 - if (TreeDFS_PathSearch(start, end, &pathStack, visited, 20) == 1) { - printf("\n鏈浼樿矾寰勶紙绾爲DFS鐢熸垚锛夛細\n"); - float totalDist = 0.0f; - TreeNode* prev = NULL; - TreeNode* node; - int idx = 1; - - // 鍙嶈浆璺緞骞惰繃婊ゆ牴鑺傜偣 - while (PopStack(&pathStack, &node) == 0) { - if (strcmp(node->data.name, "鏍″洯鎬昏") != 0) { - PushStack(&tempStack, node); - } - } - - // 杈撳嚭璺緞 - while (PopStack(&tempStack, &node) == 0) { - printf("%d. %s", idx++, node->data.name); - if (prev != NULL) { - float dist = CalculateDistance(prev, node); - totalDist += dist; - printf("锛堣窛绂诲墠涓绔欙細%.1f绫筹級", dist); - } - printf("\n"); - prev = node; - } - - // 姝ヨ鏃堕棿淇濆簳1鍒嗛挓 - float walkTime = totalDist / 80.0f; - walkTime = walkTime < 1.0f ? 1.0f : walkTime; - printf("\n鎬昏窛绂伙細%.1f绫 | 棰勪及姝ヨ鏃堕棿锛%.0f鍒嗛挓\n", totalDist, walkTime); - } else { - printf("\n鏈壘鍒板彲琛岃矾寰勶紒\n"); - } - - DestroyStack(&pathStack); - DestroyStack(&tempStack); -} - -// 鎾ら攢鍔熻兘瀹炵幇 -void InteractiveUndo(Stack* opStack) { - if (opStack->top == -1) { - printf("\n鏆傛棤鎿嶄綔鍙挙閿\n"); - return; - } - char* lastOp; - if (PopStack(opStack, &lastOp) == 0) { - printf("\n宸叉挙閿鎿嶄綔锛%s\n", lastOp); - free(lastOp); - } else { - printf("\n鎾ら攢澶辫触\n"); - } -} - -// -------------------------- 4. main鍑芥暟 -------------------------- -int main() { - Tree campusTree = InitTree(); - Stack opStack; - InitStack(&opStack, 1); - Stack nodeStack; - InitStack(&nodeStack, 0); - - // 鏍″洯鍦扮偣鏁版嵁锛坉esc瀛楁瀛樺偍绫诲瀷锛 - Place places[] = { - {1, "澶ф垚妤糄", 10.0f, 20.0f, "鏁欏妤", "6:00-23:00"}, - {2, "闀块妤糃", 15.0f, 25.0f, "鏁欏妤", "6:00-23:00"}, - {3, "涓椋熷爞", 5.0f, 30.0f, "椋熷爞", "5:00-21:00"}, - {4, "浜旈鍫", 20.0f, 10.0f, "椋熷爞", "5:00-21:00"}, - {5, "鍥句功棣", 12.0f, 15.0f, "鍥句功棣", "6:00-23:00"}, - {6, "鏍¢棬", 0.0f, 0.0f, "鍏朵粬", "鍏ㄥぉ"}, - {7, "鎿嶅満", 18.0f, 35.0f, "鍏朵粬", "6:00-22:00"}, - {8, "鏌氬瓙鏋", 4.0f, 32.0f, "椋熷爞", "5:00-21:00"}, - {9, "灏忓悆琛", 3.0f, 5.0f, "鍏朵粬", "鍏ㄥぉ"}, - {10, "瀹胯垗1鍖", 65.0f, 35.0f, "鍏朵粬", "6:00-23:00"} - }; - - // 鏍戠粨鏋勶細鎵鏈夊湴鐐逛綔涓烘牴鑺傜偣鐨勫瓙鑺傜偣锛堝厔寮熷叧绯伙級 - int placeCount = sizeof(places) / sizeof(Place); - for (int i = 0; i < placeCount; i++) { - AddChildNode(campusTree, places[i]); - } - - // 涓诲惊鐜 - int choice; - while (1) { - PrintMenu(); - while (scanf("%d", &choice) != 1) { - clearInputBuffer(); - printf("\n璇疯緭鍏ユ湁鏁堢殑鏁板瓧缂栧彿锛1-7锛夛細"); - } - clearInputBuffer(); - - switch (choice) { - case 1: - printf("\n銆愭爲缁撴瀯锛堝墠搴忛亶鍘嗭級銆慭n"); - PreOrder_Traverse(campusTree, 0); - break; - case 2: - printf("\n銆愭墍鏈夊湴鐐癸紙灞傛閬嶅巻锛夈慭n"); - Level_Traverse(campusTree); - break; - case 3: - InteractiveSearchByName(campusTree, &opStack); - break; - case 4: - InteractiveSearchByType(campusTree, &opStack); - break; - case 5: - InteractiveNavigation(campusTree, &nodeStack, &opStack); - break; - case 6: - InteractiveUndo(&opStack); - break; - case 7: - printf("\n鎰熻阿浣跨敤锛屽啀瑙侊紒\n"); - DestroyTree(&campusTree); - DestroyStack(&opStack); - DestroyStack(&nodeStack); - return 0; - default: - printf("\n杈撳叆閿欒锛岃閲嶆柊閫夋嫨锛乗n"); - } - } -} \ No newline at end of file -- Gitee From be0dc6e01ff8ae7a330bef2a1844109c672bde97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=81=92?= <16212856+butter_01@user.noreply.gitee.com> Date: Fri, 14 Nov 2025 14:03:23 +0000 Subject: [PATCH 10/33] =?UTF-8?q?add=20=E6=A0=A1=E5=9B=AD=E5=AF=BC?= =?UTF-8?q?=E6=B8=B8=E7=B3=BB=E7=BB=9F/=E6=A0=91=E7=BB=93=E6=9E=84=20main.?= =?UTF-8?q?c.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 寮犳亽 <16212856+butter_01@user.noreply.gitee.com> --- ...46\240\221\347\273\223\346\236\204 main.c" | 278 ++++++++++++++++++ 1 file changed, 278 insertions(+) create mode 100644 "\346\240\241\345\233\255\345\257\274\346\270\270\347\263\273\347\273\237/\346\240\221\347\273\223\346\236\204 main.c" diff --git "a/\346\240\241\345\233\255\345\257\274\346\270\270\347\263\273\347\273\237/\346\240\221\347\273\223\346\236\204 main.c" "b/\346\240\241\345\233\255\345\257\274\346\270\270\347\263\273\347\273\237/\346\240\221\347\273\223\346\236\204 main.c" new file mode 100644 index 0000000..9b240cc --- /dev/null +++ "b/\346\240\241\345\233\255\345\257\274\346\270\270\347\263\273\347\273\237/\346\240\221\347\273\223\346\236\204 main.c" @@ -0,0 +1,278 @@ +#include "campus_tree.h" + +// -------------------------- 鍓嶅簭閬嶅巻 -------------------------- +void PreOrder_Traverse(TreeNode* node, int depth) { + if (!node) return; + for (int i = 0; i < depth; i++) printf(" "); + printf("|-%s锛圛D锛%d锛岀埗鑺傜偣锛%s锛塡n", + node->data.name, node->data.id, + node->parent ? node->parent->data.name : "鏃"); + PreOrder_Traverse(node->child, depth + 1); + PreOrder_Traverse(node->sibling, depth); +} + +// -------------------------- 娓呯悊杈撳叆缂撳啿鍖 -------------------------- +void clearInputBuffer() { + while (getchar() != '\n'); // 娓呯┖缂撳啿鍖烘畫鐣欑殑瀛楃 +} + +// -------------------------- 浜や簰鍑芥暟 -------------------------- +void PrintMenu() { + printf("\n 鏍″洯瀵兼父绯荤粺 "); + printf("\n======================================"); + printf("\n1. 鏌ョ湅鏍戠粨鏋勶紙鍓嶅簭閬嶅巻锛"); + printf("\n2. 鏌ョ湅鎵鏈夊湴鐐癸紙灞傛閬嶅巻锛"); + printf("\n3. 鎸夊悕绉版煡璇㈠湴鐐"); + printf("\n4. 鎸夌被鍨嬫煡璇㈠湴鐐"); + printf("\n5. 瀵艰埅璺緞瑙勫垝锛堟爲DFS瀹炵幇锛"); + printf("\n6. 鎾ら攢涓婁竴姝ユ搷浣"); + printf("\n7. 閫鍑虹郴缁"); + printf("\n======================================"); + printf("\n璇疯緭鍏ュ姛鑳界紪鍙凤紙1-7锛夛細"); +} + +void InteractiveSearchByName(Tree tree, Stack* opStack) { + char name[50], op[100]; + printf("\n璇疯緭鍏ュ湴鐐瑰悕绉帮細"); + fgets(name, 50, stdin); + name[strcspn(name, "\n")] = '\0'; + + sprintf(op, "鏌ヨ鍦扮偣锛%s", name); + PushStack(opStack, op); + + TreeNode* node = SearchNodeByName(tree, name); + if (node) { + printf("\n銆愭煡璇㈢粨鏋溿慭n"); + printf("鍚嶇О锛%s | ID锛%d\n", node->data.name, node->data.id); + printf("鍧愭爣锛(%.1f, %.1f)\n", node->data.x, node->data.y); + printf("绫诲瀷锛%s\n", node->data.desc); + printf("寮鏀炬椂闂达細%s\n", node->data.openTime); + printf("鐖惰妭鐐癸細%s\n", node->parent->data.name); + } else { + printf("\n鏈壘鍒板湴鐐癸細%s\n", name); + } +} + +void InteractiveSearchByType(Tree tree, Stack* opStack) { + char type[20], op[50]; + printf("\n璇疯緭鍏ュ湴鐐圭被鍨嬶紙濡傛暀瀛︽ゼ銆侀鍫傦級锛"); + fgets(type, 20, stdin); + type[strcspn(type, "\n")] = '\0'; + + sprintf(op, "鏌ヨ绫诲瀷锛%s", type); + PushStack(opStack, op); + + Place result[10]; + int count = 0; + SearchNodesByType(tree, type, result, &count); + if (count > 0) { + printf("\n銆愭煡璇㈢粨鏋溿戝叡%d涓%s锛歕n", count, type); + for (int i = 0; i < count; i++) { + printf("%d. %s | 寮鏀炬椂闂达細%s\n", + i+1, result[i].name, result[i].openTime); + } + } else { + printf("\n鏈壘鍒拌绫诲瀷鍦扮偣\n"); + } +} + +// 鏍慏FS璺緞鎼滅储锛堟敮鎸佹牴鑺傜偣涓浆锛屼换鎰忓湴鐐逛簰閫氾級 +int TreeDFS_PathSearch(TreeNode* start, TreeNode* end, Stack* pathStack, VisitedNode* visited, int maxNodes) { + if (!start || !end) return -1; + + // 妫鏌ュ凡璁块棶 + for (int i = 0; i < maxNodes; i++) { + if (visited[i].node == start && visited[i].visited) return 0; + } + + // 鏍囪璁块棶 + for (int i = 0; i < maxNodes; i++) { + if (visited[i].node == NULL) { + visited[i].node = start; + visited[i].visited = 1; + break; + } + } + + PushStack(pathStack, start); + + // 鎵惧埌缁堢偣 + if (start == end) return 1; + + // 1. 閬嶅巻瀛愯妭鐐 + TreeNode* child = start->child; + while (child) { + if (TreeDFS_PathSearch(child, end, pathStack, visited, maxNodes) == 1) return 1; + child = child->sibling; + } + + // 2. 閬嶅巻鍏勫紵鑺傜偣 + TreeNode* sibling = start->sibling; + while (sibling) { + if (TreeDFS_PathSearch(sibling, end, pathStack, visited, maxNodes) == 1) return 1; + sibling = sibling->sibling; + } + + // 3. 鍥炴函鍒扮埗鑺傜偣锛堝叧閿細閫氳繃鏍硅妭鐐逛腑杞級 + if (start->parent != NULL) { + if (TreeDFS_PathSearch(start->parent, end, pathStack, visited, maxNodes) == 1) return 1; + } + + // 鍥炴函 + PopStack(pathStack, &start); + for (int i = 0; i < maxNodes; i++) { + if (visited[i].node == start) visited[i].visited = 0; + } + return 0; +} + +void InteractiveNavigation(Tree tree, Stack* nodeStack, Stack* opStack) { + char startName[50], endName[50], op[200]; + printf("\n璇疯緭鍏ヨ捣鐐癸細"); + fgets(startName, 50, stdin); + startName[strcspn(startName, "\n")] = '\0'; + + printf("璇疯緭鍏ョ粓鐐癸細"); + fgets(endName, 50, stdin); + endName[strcspn(endName, "\n")] = '\0'; + + snprintf(op, sizeof(op), "瀵艰埅锛%s -> %s", startName, endName); + PushStack(opStack, op); + + TreeNode* start = SearchNodeByName(tree, startName); + TreeNode* end = SearchNodeByName(tree, endName); + if (!start || !end) { + printf("\n璧风偣鎴栫粓鐐逛笉瀛樺湪锛乗n"); + return; + } + + Stack pathStack; + InitStack(&pathStack, 0); + Stack tempStack; + InitStack(&tempStack, 0); + VisitedNode visited[20] = {0}; + + // 璋冪敤鏍慏FS鎼滅储 + if (TreeDFS_PathSearch(start, end, &pathStack, visited, 20) == 1) { + printf("\n鏈浼樿矾寰勶紙绾爲DFS鐢熸垚锛夛細\n"); + float totalDist = 0.0f; + TreeNode* prev = NULL; + TreeNode* node; + int idx = 1; + + // 鍙嶈浆璺緞骞惰繃婊ゆ牴鑺傜偣 + while (PopStack(&pathStack, &node) == 0) { + if (strcmp(node->data.name, "鏍″洯鎬昏") != 0) { + PushStack(&tempStack, node); + } + } + + // 杈撳嚭璺緞 + while (PopStack(&tempStack, &node) == 0) { + printf("%d. %s", idx++, node->data.name); + if (prev != NULL) { + float dist = CalculateDistance(prev, node); + totalDist += dist; + printf("锛堣窛绂诲墠涓绔欙細%.1f绫筹級", dist); + } + printf("\n"); + prev = node; + } + + // 姝ヨ鏃堕棿淇濆簳1鍒嗛挓 + float walkTime = totalDist / 80.0f; + walkTime = walkTime < 1.0f ? 1.0f : walkTime; + printf("\n鎬昏窛绂伙細%.1f绫 | 棰勪及姝ヨ鏃堕棿锛%.0f鍒嗛挓\n", totalDist, walkTime); + } else { + printf("\n鏈壘鍒板彲琛岃矾寰勶紒\n"); + } + + DestroyStack(&pathStack); + DestroyStack(&tempStack); +} + +// 鎾ら攢鍔熻兘瀹炵幇 +void InteractiveUndo(Stack* opStack) { + if (opStack->top == -1) { + printf("\n鏆傛棤鎿嶄綔鍙挙閿\n"); + return; + } + char* lastOp; + if (PopStack(opStack, &lastOp) == 0) { + printf("\n宸叉挙閿鎿嶄綔锛%s\n", lastOp); + free(lastOp); + } else { + printf("\n鎾ら攢澶辫触\n"); + } +} + +// -------------------------- 4. main鍑芥暟 -------------------------- +int main() { + Tree campusTree = InitTree(); + Stack opStack; + InitStack(&opStack, 1); + Stack nodeStack; + InitStack(&nodeStack, 0); + + // 鏍″洯鍦扮偣鏁版嵁锛坉esc瀛楁瀛樺偍绫诲瀷锛 + Place places[] = { + {1, "澶ф垚妤糄", 10.0f, 20.0f, "鏁欏妤", "6:00-23:00"}, + {2, "闀块妤糃", 15.0f, 25.0f, "鏁欏妤", "6:00-23:00"}, + {3, "涓椋熷爞", 5.0f, 30.0f, "椋熷爞", "5:00-21:00"}, + {4, "浜旈鍫", 20.0f, 10.0f, "椋熷爞", "5:00-21:00"}, + {5, "鍥句功棣", 12.0f, 15.0f, "鍥句功棣", "6:00-23:00"}, + {6, "鏍¢棬", 0.0f, 0.0f, "鍏朵粬", "鍏ㄥぉ"}, + {7, "鎿嶅満", 18.0f, 35.0f, "鍏朵粬", "6:00-22:00"}, + {8, "鏌氬瓙鏋", 4.0f, 32.0f, "椋熷爞", "5:00-21:00"}, + {9, "灏忓悆琛", 3.0f, 5.0f, "鍏朵粬", "鍏ㄥぉ"}, + {10, "瀹胯垗1鍖", 65.0f, 35.0f, "鍏朵粬", "6:00-23:00"} + }; + + // 鏍戠粨鏋勶細鎵鏈夊湴鐐逛綔涓烘牴鑺傜偣鐨勫瓙鑺傜偣锛堝厔寮熷叧绯伙級 + int placeCount = sizeof(places) / sizeof(Place); + for (int i = 0; i < placeCount; i++) { + AddChildNode(campusTree, places[i]); + } + + // 涓诲惊鐜 + int choice; + while (1) { + PrintMenu(); + while (scanf("%d", &choice) != 1) { + clearInputBuffer(); + printf("\n璇疯緭鍏ユ湁鏁堢殑鏁板瓧缂栧彿锛1-7锛夛細"); + } + clearInputBuffer(); + + switch (choice) { + case 1: + printf("\n銆愭爲缁撴瀯锛堝墠搴忛亶鍘嗭級銆慭n"); + PreOrder_Traverse(campusTree, 0); + break; + case 2: + printf("\n銆愭墍鏈夊湴鐐癸紙灞傛閬嶅巻锛夈慭n"); + Level_Traverse(campusTree); + break; + case 3: + InteractiveSearchByName(campusTree, &opStack); + break; + case 4: + InteractiveSearchByType(campusTree, &opStack); + break; + case 5: + InteractiveNavigation(campusTree, &nodeStack, &opStack); + break; + case 6: + InteractiveUndo(&opStack); + break; + case 7: + printf("\n鎰熻阿浣跨敤锛屽啀瑙侊紒\n"); + DestroyTree(&campusTree); + DestroyStack(&opStack); + DestroyStack(&nodeStack); + return 0; + default: + printf("\n杈撳叆閿欒锛岃閲嶆柊閫夋嫨锛乗n"); + } + } +} \ No newline at end of file -- Gitee From 3875f070bd1df205079058d20a149b5d161cc9f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=81=92?= <16212856+butter_01@user.noreply.gitee.com> Date: Fri, 14 Nov 2025 14:04:40 +0000 Subject: [PATCH 11/33] =?UTF-8?q?add=20=E6=A0=A1=E5=9B=AD=E5=AF=BC?= =?UTF-8?q?=E6=B8=B8=E7=B3=BB=E7=BB=9F/campus=5Ftree.h.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 寮犳亽 <16212856+butter_01@user.noreply.gitee.com> --- .../campus_tree.h" | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 "\346\240\241\345\233\255\345\257\274\346\270\270\347\263\273\347\273\237/campus_tree.h" diff --git "a/\346\240\241\345\233\255\345\257\274\346\270\270\347\263\273\347\273\237/campus_tree.h" "b/\346\240\241\345\233\255\345\257\274\346\270\270\347\263\273\347\273\237/campus_tree.h" new file mode 100644 index 0000000..ae3bc75 --- /dev/null +++ "b/\346\240\241\345\233\255\345\257\274\346\270\270\347\263\273\347\273\237/campus_tree.h" @@ -0,0 +1,65 @@ +#ifndef CAMPUS_TREE_ENHANCE_H +#define CAMPUS_TREE_ENHANCE_H + +#include +#include +#include +#include + +// 鍦扮偣淇℃伅缁撴瀯浣 +typedef struct Place { + int id; // 鍦扮偣ID + char name[50]; // 鍦扮偣鍚嶇О + float x; // 妯潗鏍 + float y; // 绾靛潗鏍 + char desc[200]; // 鍔熻兘鎻忚堪 + char openTime[50]; // 寮鏀炬椂闂 +} Place; + +// 鏍戣妭鐐圭粨鏋勪綋 +typedef struct TreeNode { + Place data; // 鑺傜偣瀛樺偍鐨勫湴鐐规暟鎹 + struct TreeNode* parent;// 鐖惰妭鐐规寚閽 + struct TreeNode* child; // 绗竴涓瓙鑺傜偣鎸囬拡 + struct TreeNode* sibling;// 鍏勫紵鑺傜偣鎸囬拡 + int childCount; // 瀛愯妭鐐规暟閲 +} TreeNode, *Tree; + +// 鏍堢粨鏋勪綋 +typedef struct Stack { + int top; + int type; // 0: 鑺傜偣鏍堬紝1: 鎿嶄綔鏍 + union { + TreeNode** nodes; // 鍔ㄦ佽妭鐐规暟缁 + char** ops; // 鍔ㄦ佸瓧绗︿覆鏁扮粍 + } data; +} Stack; + +// 宸茶闂妭鐐圭粨鏋勪綋 +typedef struct { + TreeNode* node; + int visited; +} VisitedNode; + +// 鏍戞搷浣滃嚱鏁 +Tree InitTree(); +TreeNode* CreateTreeNode(Place place); +int AddChildNode(TreeNode* parent, Place place); +TreeNode* SearchNodeByName(Tree tree, const char* name); +void SearchNodesByType(Tree tree, const char* type, Place* result, int* count); +void DFS_Traverse(TreeNode* node, int depth); +void Level_Traverse(Tree tree); +float CalculateDistance(TreeNode* a, TreeNode* b); +void DestroyTree(Tree* tree); + +// 鏍堟搷浣滃嚱鏁 +void InitStack(Stack* stack, int type); +int PushStack(Stack* stack, void* data); +int PopStack(Stack* stack, void* data); +void DestroyStack(Stack* stack); + +// 璺緞鎼滅储鍑芥暟 +int DFS_PathSearch_WithVisited(TreeNode* start, TreeNode* end, Stack* nodeStack, Stack* pathStack, VisitedNode* visited, int maxNodes); +int DFS_PathSearch(TreeNode* start, TreeNode* end, Stack* nodeStack, Stack* pathStack); + +#endif \ No newline at end of file -- Gitee From 6d74c5a14d9f0302280545483f884f357696da05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=81=92?= <16212856+butter_01@user.noreply.gitee.com> Date: Fri, 14 Nov 2025 14:05:41 +0000 Subject: [PATCH 12/33] =?UTF-8?q?add=20=E6=A0=A1=E5=9B=AD=E5=AF=BC?= =?UTF-8?q?=E6=B8=B8=E7=B3=BB=E7=BB=9F/compus=5Ftree.c.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 寮犳亽 <16212856+butter_01@user.noreply.gitee.com> --- .../compus_tree.c" | 245 ++++++++++++++++++ 1 file changed, 245 insertions(+) create mode 100644 "\346\240\241\345\233\255\345\257\274\346\270\270\347\263\273\347\273\237/compus_tree.c" diff --git "a/\346\240\241\345\233\255\345\257\274\346\270\270\347\263\273\347\273\237/compus_tree.c" "b/\346\240\241\345\233\255\345\257\274\346\270\270\347\263\273\347\273\237/compus_tree.c" new file mode 100644 index 0000000..27173b8 --- /dev/null +++ "b/\346\240\241\345\233\255\345\257\274\346\270\270\347\263\273\347\273\237/compus_tree.c" @@ -0,0 +1,245 @@ +#include "campus_tree.h" + +// 鍒濆鍖栨爲 +Tree InitTree() { + Tree root = (Tree)malloc(sizeof(TreeNode)); + if (!root) return NULL; + root->data.id = 0; + strcpy(root->data.name, "鏍″洯鎬昏"); + root->data.x = 0.0f; + root->data.y = 0.0f; + strcpy(root->data.desc, "鏍″洯鍦扮偣鏍硅妭鐐"); + strcpy(root->data.openTime, "鍏ㄥぉ"); + root->parent = NULL; + root->child = NULL; + root->sibling = NULL; + root->childCount = 0; + return root; +} + +// 鍒涘缓鏍戣妭鐐 +TreeNode* CreateTreeNode(Place place) { + TreeNode* node = (TreeNode*)malloc(sizeof(TreeNode)); + if (!node) return NULL; + node->data = place; + node->parent = NULL; + node->child = NULL; + node->sibling = NULL; + node->childCount = 0; + return node; +} + +// 涓虹埗鑺傜偣娣诲姞瀛愯妭鐐 +int AddChildNode(TreeNode* parent, Place place) { + if (!parent) return -1; + TreeNode* newNode = CreateTreeNode(place); + if (!newNode) return -2; + newNode->parent = parent; + + if (!parent->child) { + parent->child = newNode; + } else { + TreeNode* temp = parent->child; + while (temp->sibling) temp = temp->sibling; + temp->sibling = newNode; + } + parent->childCount++; + return 0; +} + +// 鎸夊悕绉伴掑綊鏌ユ壘鑺傜偣 +TreeNode* SearchNodeByName(Tree tree, const char* name) { + if (!tree) return NULL; + if (strcmp(tree->data.name, name) == 0) return tree; + TreeNode* find = SearchNodeByName(tree->child, name); + if (find) return find; + return SearchNodeByName(tree->sibling, name); +} + +// 鎸夌被鍨嬫煡鎵炬墍鏈夎妭鐐癸紙鐩存帴妫鏌ヨ妭鐐硅嚜韬殑desc瀛楁锛 +void SearchNodesByType(Tree tree, const char* type, Place* result, int* count) { + if (!tree || !type || !result || !count) return; + TreeNode* queue[100]; + int front = 0, rear = 0; + queue[rear++] = tree; + + while (front < rear) { + TreeNode* temp = queue[front++]; + // 鐩存帴妫鏌ヨ妭鐐硅嚜韬殑绫诲瀷锛坉esc瀛楁锛 + if (temp->data.id > 0 && strcmp(temp->data.desc, type) == 0) { + result[*count] = temp->data; + (*count)++; + } + // 瀛愯妭鐐瑰叆闃 + temp = temp->child; + while (temp) { + queue[rear++] = temp; + temp = temp->sibling; + } + } +} + +// 娣卞害浼樺厛閬嶅巻鏍 +void DFS_Traverse(TreeNode* node, int depth) { + if (!node) return; + for (int i = 0; i < depth; i++) printf(" "); + printf("|-%s锛圛D锛%d锛塡n", node->data.name, node->data.id); + DFS_Traverse(node->child, depth + 1); + DFS_Traverse(node->sibling, depth); +} + +// 灞傛閬嶅巻鏍 +void Level_Traverse(Tree tree) { + if (!tree) return; + TreeNode* queue[100]; + int front = 0, rear = 0; + queue[rear++] = tree; + + while (front < rear) { + TreeNode* temp = queue[front++]; + printf("ID锛%d | 鍚嶇О锛%s | 鍧愭爣锛(%.1f,%.1f) | 绫诲瀷锛%s\n", + temp->data.id, temp->data.name, temp->data.x, temp->data.y, temp->data.desc); + // 瀛愯妭鐐瑰叆闃 + temp = temp->child; + while (temp) { + queue[rear++] = temp; + temp = temp->sibling; + } + } +} + +// 璁$畻涓ょ偣璺濈 +float CalculateDistance(TreeNode* a, TreeNode* b) { + if (!a || !b) return 0.0f; + float dx = a->data.x - b->data.x; + float dy = a->data.y - b->data.y; + return sqrt(dx*dx + dy*dy); +} + +// 鍒濆鍖栨爤 +void InitStack(Stack* stack, int type) { + stack->top = -1; + stack->type = type; + if (type == 0) { + stack->data.nodes = (TreeNode**)malloc(100 * sizeof(TreeNode*)); + } else { + stack->data.ops = (char**)malloc(100 * sizeof(char*)); + } +} + +// 鍏ユ爤 +int PushStack(Stack* stack, void* data) { + if (stack->top >= 99) return -1; + stack->top++; + if (stack->type == 0) { + stack->data.nodes[stack->top] = (TreeNode*)data; + } else { + stack->data.ops[stack->top] = strdup((char*)data); + } + return 0; +} + +// 鍑烘爤 +int PopStack(Stack* stack, void* data) { + if (stack->top < 0) return -1; + if (stack->type == 0) { + *(TreeNode**)data = stack->data.nodes[stack->top]; + } else { + *(char**)data = stack->data.ops[stack->top]; + } + stack->top--; + return 0; +} + +// 閿姣佹爤 +void DestroyStack(Stack* stack) { + if (stack->type == 1) { + for (int i = 0; i <= stack->top; i++) { + free(stack->data.ops[i]); + } + free(stack->data.ops); + } else if (stack->type == 0) { + free(stack->data.nodes); + } + stack->top = -1; +} + +// 甯﹀凡璁块棶鏍囪鐨凞FS璺緞鎼滅储 +int DFS_PathSearch_WithVisited(TreeNode* start, TreeNode* end, Stack* nodeStack, Stack* pathStack, VisitedNode* visited, int maxNodes) { + if (!start || !end) return -1; + + // 妫鏌ユ槸鍚﹀凡璁块棶 + for (int i = 0; i < maxNodes; i++) { + if (visited[i].node == start && visited[i].visited) { + return 0; + } + } + + // 鏍囪涓哄凡璁块棶 + for (int i = 0; i < maxNodes; i++) { + if (visited[i].node == NULL) { + visited[i].node = start; + visited[i].visited = 1; + break; + } + } + + PushStack(nodeStack, start); + PushStack(pathStack, start); + + if (start == end) return 1; + + // 閬嶅巻瀛愯妭鐐 + TreeNode* child = start->child; + while (child) { + if (DFS_PathSearch_WithVisited(child, end, nodeStack, pathStack, visited, maxNodes) == 1) { + return 1; + } + child = child->sibling; + } + + // 閬嶅巻鍏勫紵鑺傜偣 + TreeNode* sibling = start->sibling; + while (sibling) { + if (DFS_PathSearch_WithVisited(sibling, end, nodeStack, pathStack, visited, maxNodes) == 1) { + return 1; + } + sibling = sibling->sibling; + } + + // 鍥炴函鐖惰妭鐐 + if (start->parent != NULL) { + if (DFS_PathSearch_WithVisited(start->parent, end, nodeStack, pathStack, visited, maxNodes) == 1) { + return 1; + } + } + + // 鍥炴函 + for (int i = 0; i < maxNodes; i++) { + if (visited[i].node == start) { + visited[i].visited = 0; + break; + } + } + PopStack(pathStack, &start); + return 0; +} + +// 瀵瑰鏆撮湶鐨凞FS璺緞鎼滅储鎺ュ彛 +int DFS_PathSearch(TreeNode* start, TreeNode* end, Stack* nodeStack, Stack* pathStack) { + VisitedNode visited[20] = {0}; + for (int i = 0; i < 20; i++) { + visited[i].node = NULL; + visited[i].visited = 0; + } + return DFS_PathSearch_WithVisited(start, end, nodeStack, pathStack, visited, 20); +} + +// 閿姣佹爲 +void DestroyTree(Tree* tree) { + if (!*tree) return; + DestroyTree(&((*tree)->child)); + DestroyTree(&((*tree)->sibling)); + free(*tree); + *tree = NULL; +} \ No newline at end of file -- Gitee From bd8f36ae67e24017506561cb04c7e885c86b6726 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=98=B3?= <16213565+liiyaaa@user.noreply.gitee.com> Date: Tue, 18 Nov 2025 08:23:09 +0000 Subject: [PATCH 13/33] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20=E5=9B=BE=E7=BB=93?= =?UTF-8?q?=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "\345\233\276\347\273\223\346\236\204/.keep" | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 "\345\233\276\347\273\223\346\236\204/.keep" diff --git "a/\345\233\276\347\273\223\346\236\204/.keep" "b/\345\233\276\347\273\223\346\236\204/.keep" new file mode 100644 index 0000000..e69de29 -- Gitee From 2af597b2314a025336c7754050e9f7b6b9e0460d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=98=B3?= <16213565+liiyaaa@user.noreply.gitee.com> Date: Tue, 18 Nov 2025 08:25:43 +0000 Subject: [PATCH 14/33] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20campus=5Fguide.h?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "\345\233\276\347\273\223\346\236\204/campus_guide.h/.keep" | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 "\345\233\276\347\273\223\346\236\204/campus_guide.h/.keep" diff --git "a/\345\233\276\347\273\223\346\236\204/campus_guide.h/.keep" "b/\345\233\276\347\273\223\346\236\204/campus_guide.h/.keep" new file mode 100644 index 0000000..e69de29 -- Gitee From fb2ae3b745ab0e64b2f2b990b4fd46de086977a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=98=B3?= <16213565+liiyaaa@user.noreply.gitee.com> Date: Tue, 18 Nov 2025 08:26:52 +0000 Subject: [PATCH 15/33] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20?= =?UTF-8?q?=E5=9B=BE=E7=BB=93=E6=9E=84/campus=5Fguide.h?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "\345\233\276\347\273\223\346\236\204/campus_guide.h/.keep" | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 "\345\233\276\347\273\223\346\236\204/campus_guide.h/.keep" diff --git "a/\345\233\276\347\273\223\346\236\204/campus_guide.h/.keep" "b/\345\233\276\347\273\223\346\236\204/campus_guide.h/.keep" deleted file mode 100644 index e69de29..0000000 -- Gitee From f8ba3803e30bfd1c802919d5ed2768246427f096 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=98=B3?= <16213565+liiyaaa@user.noreply.gitee.com> Date: Tue, 18 Nov 2025 08:27:45 +0000 Subject: [PATCH 16/33] =?UTF-8?q?add=20=E5=9B=BE=E7=BB=93=E6=9E=84/campus?= =?UTF-8?q?=5Fguide.h.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 鏉庨槼 <16213565+liiyaaa@user.noreply.gitee.com> --- .../campus_guide.h" | 80 +++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 "\345\233\276\347\273\223\346\236\204/campus_guide.h" diff --git "a/\345\233\276\347\273\223\346\236\204/campus_guide.h" "b/\345\233\276\347\273\223\346\236\204/campus_guide.h" new file mode 100644 index 0000000..103fca5 --- /dev/null +++ "b/\345\233\276\347\273\223\346\236\204/campus_guide.h" @@ -0,0 +1,80 @@ +#ifndef CAMPUS_GUIDE_H +#define CAMPUS_GUIDE_H + +#include +#include +#include +#include +#include + +// 甯搁噺瀹氫箟 +#define MAX_PLACE 30 // 鏈澶у湴鐐规暟閲 +#define MAX_HISTORY 10 // 鏈澶у巻鍙茶褰曟暟 +#define MAX_PATH 50 // 鏈澶ц矾寰勯暱搴 +#define MAX_OPERATIONS 20 // 鏈澶ф搷浣滆褰曟暟 +#define WALK_SPEED 80.0 // 姝ヨ閫熷害锛堢背/鍒嗛挓锛 + +// 鍦扮偣缁撴瀯浣 +typedef struct { + int id; // 鍦扮偣ID + char name[50]; // 鍦扮偣鍚嶇О + float x, y; // 鍧愭爣 + char description[200];// 鍔熻兘鎻忚堪 +} Place; + +// 鍘嗗彶璁板綍缁撴瀯浣 +typedef struct { + time_t queryTime; // 鏌ヨ鏃堕棿 + int startId; // 璧风偣ID + int endId; // 缁堢偣ID + int path[MAX_PATH]; // 璺緞 + int pathLen; // 璺緞闀垮害 + float distance; // 鎬昏窛绂 +} History; + +// 椤哄簭琛ㄥ瓨鍌ㄥ湴鐐 +typedef struct { + Place data[MAX_PLACE]; + int length; +} PlaceList; + +// 椤哄簭琛ㄥ瓨鍌ㄥ巻鍙茶褰 +typedef struct { + History data[MAX_HISTORY]; + int length; +} HistoryList; + +// 鏍堢粨鏋勶紙鐢ㄤ簬鎿嶄綔鎾ら攢锛 +typedef struct { + int data[MAX_OPERATIONS]; + int top; +} Stack; + +// 鍥剧殑閭绘帴鐭╅樀琛ㄧず +typedef struct { + float edges[MAX_PLACE][MAX_PLACE]; // 杈圭殑鏉冮噸锛堣窛绂伙級锛-1琛ㄧず鏃犵洿鎺ヨ矾寰 + int n; // 椤剁偣鏁 +} Graph; + +// 鍏ㄥ眬鍙橀噺澹版槑 +extern PlaceList placeList; +extern HistoryList historyList; +extern Graph graph; +extern Stack operationStack; + +// 鍑芥暟澹版槑锛堜笌婧愭枃浠跺疄鐜板畬鍏ㄥ悓姝ワ級 +void initAll(); +void push(Stack *s, int value); +int pop(Stack *s); +void addPlace(const char *name, float x, float y, const char *desc); +Place* queryPlace(const char *name); +int getPlaceIdByName(const char *name); +float dijkstra(int start, int end, int *path, int *pathLen); +float findShortestPath(int start, int end, int *path, int *pathLen); +void showPath(int *path, int len, float dist); +void showHistory(); +void undoOperation(); +void initSampleData(); +void showMenu(); + +#endif \ No newline at end of file -- Gitee From 523e7803af8bb9385fe675ca89d2c59feb0d6326 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=98=B3?= <16213565+liiyaaa@user.noreply.gitee.com> Date: Tue, 18 Nov 2025 08:29:28 +0000 Subject: [PATCH 17/33] =?UTF-8?q?add=20=E5=9B=BE=E7=BB=93=E6=9E=84/campus?= =?UTF-8?q?=5Fguide.c.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 鏉庨槼 <16213565+liiyaaa@user.noreply.gitee.com> --- .../campus_guide.c" | 390 ++++++++++++++++++ 1 file changed, 390 insertions(+) create mode 100644 "\345\233\276\347\273\223\346\236\204/campus_guide.c" diff --git "a/\345\233\276\347\273\223\346\236\204/campus_guide.c" "b/\345\233\276\347\273\223\346\236\204/campus_guide.c" new file mode 100644 index 0000000..eea9ad4 --- /dev/null +++ "b/\345\233\276\347\273\223\346\236\204/campus_guide.c" @@ -0,0 +1,390 @@ +#include "campus_guide.h" + +// 鍏ㄥ眬鍙橀噺瀹氫箟 +PlaceList placeList; +HistoryList historyList; +Graph graph; +Stack operationStack; + +// 鍒濆鍖栨墍鏈夋暟鎹粨鏋 +void initAll() { + placeList.length = 0; + memset(placeList.data, 0, sizeof(placeList.data)); + + historyList.length = 0; + memset(historyList.data, 0, sizeof(historyList.data)); + + graph.n = 0; + for (int i = 0; i < MAX_PLACE; i++) { + for (int j = 0; j < MAX_PLACE; j++) { + graph.edges[i][j] = (i == j) ? 0 : -1; + } + } + + operationStack.top = -1; + memset(operationStack.data, 0, sizeof(operationStack.data)); +} + +// 鏍堝叆鏍堟搷浣 +void push(Stack *s, int value) { + if (s->top < MAX_OPERATIONS - 1) { + s->data[++s->top] = value; + } +} + +// 鏍堝嚭鏍堟搷浣 +int pop(Stack *s) { + if (s->top >= 0) { + return s->data[s->top--]; + } + return -1; +} + +// 娣诲姞鍦扮偣锛堣嚜鍔ㄥ垎閰岻D锛屼慨澶嶅瓧绗︿覆缁堟绗︼級 +void addPlace(const char *name, float x, float y, const char *desc) { + if (placeList.length >= MAX_PLACE) { + printf("鍦扮偣鏁伴噺宸茶揪涓婇檺锛乗n"); + return; + } + + int id = placeList.length; + Place p; + p.id = id; + // 瀹夊叏鎷疯礉瀛楃涓插苟娣诲姞缁堟绗 + strncpy(p.name, name, sizeof(p.name)-1); + p.name[sizeof(p.name)-1] = '\0'; + p.x = x; + p.y = y; + strncpy(p.description, desc, sizeof(p.description)-1); + p.description[sizeof(p.description)-1] = '\0'; + + placeList.data[id] = p; + placeList.length++; + graph.n++; + + // 璁$畻涓庡凡鏈夊湴鐐圭殑璺濈骞舵坊鍔犺竟 + for (int i = 0; i < id; i++) { + float dx = x - placeList.data[i].x; + float dy = y - placeList.data[i].y; + float dist = sqrt(dx*dx + dy*dy); + graph.edges[id][i] = dist; + graph.edges[i][id] = dist; + } + + push(&operationStack, id); // 璁板綍鎿嶄綔ID +} + +// 鏍规嵁鍚嶇О鏌ヨ鍦扮偣 +Place* queryPlace(const char *name) { + for (int i = 0; i < placeList.length; i++) { + if (strcmp(placeList.data[i].name, name) == 0) { + return &placeList.data[i]; + } + } + return NULL; +} + +// 鏍规嵁鍚嶇О鑾峰彇鍦扮偣ID +int getPlaceIdByName(const char *name) { + Place *p = queryPlace(name); + return (p != NULL) ? p->id : -1; +} + +// Dijkstra鏈鐭矾寰勭畻娉曪紙鏍稿績瀹炵幇锛 +float dijkstra(int start, int end, int *path, int *pathLen) { + float dist[MAX_PLACE]; + int visited[MAX_PLACE] = {0}; + int pre[MAX_PLACE]; + int n = graph.n; + + // 鍒濆鍖栬窛绂绘暟缁勫拰鍓嶉┍鏁扮粍 + for (int i = 0; i < n; i++) { + dist[i] = (graph.edges[start][i] > 0) ? graph.edges[start][i] : 1e9; + pre[i] = (dist[i] != 1e9) ? start : -1; + } + dist[start] = 0; + visited[start] = 1; + + // 杩唬鏌ユ壘鏈鐭矾寰 + for (int i = 1; i < n; i++) { + float minDist = 1e9; + int u = -1; + // 鎵惧埌鏈闂妭鐐逛腑璺濈鏈灏忕殑 + for (int j = 0; j < n; j++) { + if (!visited[j] && dist[j] < minDist) { + minDist = dist[j]; + u = j; + } + } + if (u == -1) break; // 鏃犲彲杈捐矾寰 + visited[u] = 1; + + // 鏉惧紱鎿嶄綔 + for (int v = 0; v < n; v++) { + if (!visited[v] && graph.edges[u][v] > 0 + && dist[v] > dist[u] + graph.edges[u][v]) { + dist[v] = dist[u] + graph.edges[u][v]; + pre[v] = u; + } + } + } + + if (dist[end] == 1e9) return -1; // 鏃犺矾寰 + + // 鍥炴函鏋勫缓璺緞 + int tempPath[MAX_PATH]; + int len = 0; + int curr = end; + while (curr != -1) { + tempPath[len++] = curr; + curr = pre[curr]; + } + + // 鍙嶈浆璺緞锛堜粠璧风偣鍒扮粓鐐癸級 + *pathLen = len; + for (int i = 0; i < len; i++) { + path[i] = tempPath[len - 1 - i]; + } + + return dist[end]; +} + +// 鏌ユ壘鏈鐭矾寰勫苟淇濆瓨鍘嗗彶璁板綍锛堜慨澶嶅巻鍙茶褰曡鐩栭昏緫锛 +float findShortestPath(int start, int end, int *path, int *pathLen) { + float totalDist = dijkstra(start, end, path, pathLen); + if (totalDist < 0) return -1; + + History h; + h.queryTime = time(NULL); + h.startId = start; + h.endId = end; + h.pathLen = *pathLen; + h.distance = totalDist; + memcpy(h.path, path, *pathLen * sizeof(int)); + + // 鍘嗗彶璁板綍婊℃椂鍒犻櫎鏈鏃х殑锛屾湭婊℃椂鍚戝悗绉讳綅 + if (historyList.length >= MAX_HISTORY) { + for (int i = MAX_HISTORY - 1; i > 0; i--) { + historyList.data[i] = historyList.data[i - 1]; + } + } else { + for (int i = historyList.length; i > 0; i--) { + historyList.data[i] = historyList.data[i - 1]; + } + historyList.length++; + } + historyList.data[0] = h; // 鏂拌褰曟彃鍏ュご閮 + + return totalDist; +} + +// 鏄剧ず璺緞璇︽儏 +void showPath(int *path, int len, float dist) { + printf("鏈鐭矾寰勶細\n"); + for (int i = 0; i < len; i++) { + printf("%s", placeList.data[path[i]].name); + if (i < len - 1) printf(" -> "); + } + printf("\n鎬昏窛绂伙細%.2f绫 棰勮姝ヨ鏃堕棿锛%.0f鍒嗛挓\n", + dist, dist / WALK_SPEED); +} + +// 鏄剧ず鍘嗗彶璁板綍 +void showHistory() { + if (historyList.length == 0) { + printf("鏃犲巻鍙茶褰曪紒\n"); + return; + } + + printf("鍘嗗彶瀵艰埅璁板綍锛歕n"); + for (int i = 0; i < historyList.length; i++) { + History *h = &historyList.data[i]; + char timeStr[20]; + strftime(timeStr, sizeof(timeStr), "%Y-%m-%d %H:%M", localtime(&h->queryTime)); + + char *startName = placeList.data[h->startId].name; + char *endName = placeList.data[h->endId].name; + + printf("%d. %s 浠%s鍒%s 璺濈锛%.2f绫砛n", + i+1, timeStr, startName, endName, h->distance); + } +} + +// 鎾ら攢鎿嶄綔锛堟柊澧烇細鍘嗗彶璁板綍鍚屾娓呯悊閫昏緫锛 +void undoOperation() { + int opId = pop(&operationStack); + if (opId == -1) { + printf("鏃犳搷浣滃彲鎾ら攢锛乗n"); + return; + } + + // 鍏堜繚瀛樿鎾ら攢鍦扮偣鐨勫悕绉 + char deletedName[50]; + strncpy(deletedName, placeList.data[opId].name, sizeof(deletedName)-1); + deletedName[sizeof(deletedName)-1] = '\0'; + + // 娓呯悊鍥句腑璇ュ湴鐐圭殑鎵鏈夎竟 + for (int i = 0; i < MAX_PLACE; i++) { + graph.edges[opId][i] = -1; + graph.edges[i][opId] = -1; + } + + // 浠庡湴鐐瑰垪琛ㄤ腑鍒犻櫎锛屽悗缁湴鐐笽D绉讳綅骞跺悓姝ユ洿鏂板浘鐨勮竟 + for (int i = opId; i < placeList.length - 1; i++) { + // 鍦扮偣鏁版嵁绉讳綅 + placeList.data[i] = placeList.data[i+1]; + placeList.data[i].id = i; // 鏇存柊ID涓烘柊绱㈠紩 + + // 鍚屾鏇存柊鍥句腑璇ュ湴鐐逛笌鍏朵粬鑺傜偣鐨勮竟 + for (int j = 0; j < MAX_PLACE; j++) { + if (graph.edges[i+1][j] != -1) { + graph.edges[i][j] = graph.edges[i+1][j]; + graph.edges[j][i] = graph.edges[j][i+1]; + graph.edges[i+1][j] = -1; + graph.edges[j][i+1] = -1; + } + } + } + placeList.length--; + graph.n--; + + // 鏍稿績浼樺寲锛氭竻鐞嗗寘鍚鎾ら攢鍦扮偣ID鐨勫巻鍙茶褰 + int cleanCount = 0; + for (int i = 0; i < historyList.length; i++) { + History *h = &historyList.data[i]; + // 妫鏌ュ巻鍙茶褰曠殑璧风偣銆佺粓鐐规垨璺緞涓槸鍚﹀寘鍚鎾ら攢鐨処D + int hasDeletedId = (h->startId == opId) || (h->endId == opId); + if (!hasDeletedId) { + for (int j = 0; j < h->pathLen; j++) { + if (h->path[j] == opId) { + hasDeletedId = 1; + break; + } + } + } + + if (hasDeletedId) { + // 鍒犻櫎璇ュ巻鍙茶褰曪紝鍚庣画璁板綍鍚戝墠绉讳綅 + for (int j = i; j < historyList.length - 1; j++) { + historyList.data[j] = historyList.data[j+1]; + } + historyList.length--; + cleanCount++; + i--; // 绉讳綅鍚庨噸鏂版鏌ュ綋鍓嶇储寮 + } + } + + // 杈撳嚭鎾ら攢缁撴灉 + printf("宸叉挙閿娣诲姞鍦扮偣锛堝悕绉帮細%s锛塡n", deletedName); + if (cleanCount > 0) { + printf("宸插悓姝ユ竻鐞嗗寘鍚鍦扮偣鐨%d鏉″巻鍙插鑸褰昞n", cleanCount); + } +} + +// 鍒濆鍖栫ず渚嬫暟鎹 +void initSampleData() { + addPlace("鏍¢棬", 0, 0, "鏍″洯涓诲叆鍙o紝24灏忔椂寮鏀"); + addPlace("鏁欏妤", 100, 200, "1-4灞備负鏁欏"); + addPlace("鍥句功棣", 300, 200, "钘忎功50涓囧唽锛屽紑鏀炬椂闂8:00-22:00"); + addPlace("椋熷爞", 200, 400, "鎻愪緵鏃╀腑鏅氶锛屾敮鎸佹敮浠樺疂/寰俊鏀粯"); + addPlace("鎿嶅満", 400, 500, "鍖呭惈400绫宠窇閬撳拰1涓鐞冨満"); + addPlace("瀹胯垗鍖", 200, 600, "鍏15鏍嬪鑸嶆ゼ"); +} + +// 鏄剧ず涓昏彍鍗 +void showMenu() { + printf("\n===== 鏍″洯瀵兼父绯荤粺 =====\n"); + printf("1. 鏌ヨ鍦扮偣淇℃伅\n"); + printf("2. 鏌ユ壘鏈鐭矾寰刓n"); + printf("3. 鏌ョ湅鍘嗗彶璁板綍\n"); + printf("4. 鎾ら攢涓婁竴姝ユ搷浣淺n"); + printf("5. 閫鍑虹郴缁焅n"); + printf("璇烽夋嫨鎿嶄綔锛"); +} + +// 涓诲嚱鏁帮紙琛ュ厖瀹屾暣case 2閫昏緫锛 +int main() { + initAll(); + initSampleData(); + + int choice; + char name[50]; + int path[MAX_PATH]; + int pathLen; + float dist; + + while (1) { + showMenu(); + scanf("%d", &choice); + getchar(); // 鍚告敹鎹㈣绗 + + switch (choice) { + case 1: { + printf("璇疯緭鍏ヨ鏌ヨ鐨勫湴鐐瑰悕绉帮細"); + fgets(name, sizeof(name), stdin); + name[strcspn(name, "\n")] = '\0'; + + Place *p = queryPlace(name); + if (p) { + printf("\n鍦扮偣ID锛%d\n鍚嶇О锛%s\n鍧愭爣锛(%.1f, %.1f)\n鎻忚堪锛%s\n", + p->id, p->name, p->x, p->y, p->description); + } else { + printf("鏈壘鍒拌鍦扮偣锛乗n"); + } + break; + } + + case 2: { + char startName[50], endName[50]; + int startId, endId; + + printf("璇疯緭鍏ヨ捣鐐瑰悕绉帮細"); + fgets(startName, sizeof(startName), stdin); + startName[strcspn(startName, "\n")] = '\0'; + startId = getPlaceIdByName(startName); + + printf("璇疯緭鍏ョ粓鐐瑰悕绉帮細"); + fgets(endName, sizeof(endName), stdin); + endName[strcspn(endName, "\n")] = '\0'; + endId = getPlaceIdByName(endName); + + if (startId == -1) { + printf("璧风偣鍚嶇О涓嶅瓨鍦紒\n"); + break; + } + if (endId == -1) { + printf("缁堢偣鍚嶇О涓嶅瓨鍦紒\n"); + break; + } + + dist = findShortestPath(startId, endId, path, &pathLen); + if (dist < 0) { + printf("鏃犳硶鎵惧埌璺緞锛乗n"); + } else { + showPath(path, pathLen, dist); + } + break; + } + + case 3: { + showHistory(); + break; + } + + case 4: { + undoOperation(); + break; + } + + case 5: { + printf("鎰熻阿鎮ㄧ殑浣跨敤锛屽啀瑙侊紒\n"); + return 0; + } + + default: { + printf("鏃犳晥鎿嶄綔锛岃閲嶆柊閫夋嫨锛乗n"); + break; + } + } + } +} \ No newline at end of file -- Gitee From bc40e2e4eb9c7a6dc88286185a1f5254c93b1df6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=93=8D?= <16216866+xiang-zi-li@user.noreply.gitee.com> Date: Wed, 19 Nov 2025 09:58:57 +0000 Subject: [PATCH 18/33] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20=E6=A0=91=E7=BB=93?= =?UTF-8?q?=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "\346\240\221\347\273\223\346\236\204/.keep" | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 "\346\240\221\347\273\223\346\236\204/.keep" diff --git "a/\346\240\221\347\273\223\346\236\204/.keep" "b/\346\240\221\347\273\223\346\236\204/.keep" new file mode 100644 index 0000000..e69de29 -- Gitee From 182696f5f14ca0a559d5fe62f28dfe528391b13d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=93=8D?= <16216866+xiang-zi-li@user.noreply.gitee.com> Date: Wed, 19 Nov 2025 10:00:56 +0000 Subject: [PATCH 19/33] =?UTF-8?q?add=20=E9=A1=B9=E7=9B=AE=E6=96=87?= =?UTF-8?q?=E6=A1=A3/=E9=A1=B9=E7=9B=AE=E4=B9=A6.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 鏉庡搷 <16216866+xiang-zi-li@user.noreply.gitee.com> --- .../\351\241\271\347\233\256\344\271\246" | 85 +++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 "\351\241\271\347\233\256\346\226\207\346\241\243/\351\241\271\347\233\256\344\271\246" diff --git "a/\351\241\271\347\233\256\346\226\207\346\241\243/\351\241\271\347\233\256\344\271\246" "b/\351\241\271\347\233\256\346\226\207\346\241\243/\351\241\271\347\233\256\344\271\246" new file mode 100644 index 0000000..6dfebfc --- /dev/null +++ "b/\351\241\271\347\233\256\346\226\207\346\241\243/\351\241\271\347\233\256\344\271\246" @@ -0,0 +1,85 @@ +鏍″洯瀵兼父绯荤粺椤圭洰涔 + +涓銆侀」鐩儗鏅笌鐩爣 + +椤圭洰鑳屾櫙 + +褰撳墠鏍″洯闈㈢Н鎵╁ぇ銆佸缓绛戝垎甯冨鏉傦紝鏂扮敓鎶ュ埌銆佽瀹㈡潵璁挎椂鏄撹糠澶辨柟鍚戯紝浼犵粺绾歌川鍦板浘鏇存柊鎱€佹寚寮曚笉鐩磋銆傛湰绯荤粺缁撳悎鏁版嵁缁撴瀯鐭ヨ瘑锛屽紑鍙戣交閲忓寲鏍″洯瀵兼父宸ュ叿锛岃В鍐虫牎鍥鑸棝鐐广 + +椤圭洰鐩爣 + +1. 瀹炵幇鏍″洯鏍稿績鍦扮偣锛堟暀瀛︽ゼ銆侀鍫傘佸浘涔﹂绛夛級淇℃伅鐨勫瓨鍌ㄤ笌鏌ヨ銆 +2. 鏀寔鐢ㄦ埛杈撳叆璧风偣鍜岀粓鐐癸紝蹇熺敓鎴愭渶浼樻琛岃矾绾裤 +3. 鏍稿績杩愮敤绾挎ц〃涓庢爤涓ょ鏁版嵁缁撴瀯锛屼繚闅滃姛鑳借惤鍦颁笌杩愯鏁堢巼銆 + +浜屻佹牳蹇冨姛鑳借璁 + +1. 鍦扮偣淇℃伅绠$悊锛氬瓨鍌ㄥ湴鐐瑰悕绉般佷綅缃潗鏍囥佸姛鑳戒粙缁嶃佸紑鏀炬椂闂寸瓑淇℃伅锛屾敮鎸佹柊澧炪佷慨鏀广佹煡璇㈡搷浣溿 +2. 璺緞瀵艰埅锛氱敤鎴烽夋嫨璧风偣鍜岀粓鐐瑰悗锛岀郴缁熻绠楀苟灞曠ず鏈鐭矾寰勶紝鏍囨敞閫旂粡鍦扮偣鍙婇浼版琛屾椂闂淬 +3. 鍘嗗彶璁板綍绠$悊锛氫繚瀛樼敤鎴疯繎10娆℃煡璇㈢殑璺嚎璁板綍锛屾敮鎸佹煡鐪嬩笌鍐嶆瀵艰埅銆 +4. 鎿嶄綔鎾ら攢锛氱敤鎴疯閫夊湴鐐规垨鍙戣捣閿欒鏌ヨ鏃讹紝鍙挙閿涓婁竴姝ユ搷浣滐紝鍥炲綊涔嬪墠鐘舵併 + +涓夈佹暟鎹粨鏋勫簲鐢ㄨ璁 + +1. 绾挎ц〃锛堥『搴忚〃锛 + +- 搴旂敤鍦烘櫙锛氭牎鍥湴鐐逛俊鎭簱瀛樺偍銆佺敤鎴峰鑸巻鍙茶褰曞瓨鍌ㄣ +- 璁捐閫昏緫锛 +- 瀹氫箟鈥滃湴鐐光濇暟鎹厓绱狅紝鍖呭惈 鍦扮偣ID銆佸悕绉般佸潗鏍嘪銆佸潗鏍嘫銆佸姛鑳芥弿杩 5涓睘鎬э紝鐢ㄩ『搴忚〃瀛樺偍鎵鏈夊湴鐐逛俊鎭傞『搴忚〃鏀寔闅忔満璁块棶锛岀敤鎴锋煡璇⑩滃浘涔﹂鈥濇椂锛屽彲閫氳繃閬嶅巻椤哄簭琛ㄥ揩閫熷尮閰嶅搴斿厓绱狅紝鑾峰彇璇︾粏淇℃伅銆 +- 鐢ㄩ『搴忚〃瀛樺偍鐢ㄦ埛鍘嗗彶璁板綍锛屾瘡涓褰曞寘鍚 鏌ヨ鏃堕棿銆佽捣鐐广佺粓鐐广佽矾寰 锛屾寜鏌ヨ鏃堕棿鍊掑簭鎺掑垪锛岀敤鎴风偣鍑烩滃巻鍙茶褰曗濆嵆鍙洿鎺ヨ皟鍙栵紝鏃犻渶閲嶅璁$畻璺緞銆 + +2. 鏍堬紙椤哄簭鏍堬級 + +- 搴旂敤鍦烘櫙锛氳矾寰勬悳绱㈢殑娣卞害浼樺厛閬嶅巻锛圖FS锛夈佺敤鎴锋搷浣滄挙閿銆 +- 璁捐閫昏緫锛 +- 璺緞鎼滅储锛氬皢鏍″洯鍦板浘鎶借薄涓衡滃湴鐐癸紙椤剁偣锛-璺緞锛堣竟锛夆濈殑鍥剧粨鏋勶紝鐢―FS閬嶅巻鎵炬渶鐭矾寰勩傛瘡璁块棶涓涓湴鐐癸紙濡備粠鈥滄牎闂ㄢ濆埌鈥滄暀瀛︽ゼA鈥濓級锛屽氨灏嗚鍦扮偣鍘嬪叆鏍堬紱鑻ュ悗缁矾绾夸笉閫氾紙濡傗滄暀瀛︽ゼA鈥濆埌鈥滃浘涔﹂鈥濇棤鐩磋揪璺級锛屽垯浠庢爤椤跺脊鍑衡滄暀瀛︽ゼA鈥濓紝鍥炴函鍒颁笂涓鍦扮偣鈥滄牎闂ㄢ濓紝閲嶆柊鎺㈢储鍏朵粬璺嚎锛岀洿鑷虫壘鍒扮粓鐐广 +- 鎿嶄綔鎾ら攢锛氱敤鏍堝瓨鍌ㄧ敤鎴锋瘡涓姝ユ搷浣滐紙濡傗滈夋嫨璧风偣锛氭牎闂ㄢ濃滈夋嫨缁堢偣锛氬浘涔﹂鈥濓級銆傜敤鎴风偣鍑烩滄挙閿鈥濇椂锛屽脊鍑烘爤椤舵搷浣滆褰曪紝绯荤粺鎭㈠鍒颁笂涓姝ョ姸鎬侊紙濡傛挙閿鈥滈夋嫨缁堢偣鈥濓紝鍥炲埌鈥滃緟閫夌粓鐐光濈晫闈級銆 + +鍥涖侀鏈熸垚鏋 + +1. 鍙繍琛岀殑鏍″洯瀵兼父绯荤粺锛堟敮鎸佸湴鐐规煡璇€佽矾寰勫鑸佸巻鍙茶褰曘佹搷浣滄挙閿4澶у姛鑳斤級銆 +2. 瀹屾暣鏂囨。锛氬惈闇姹傚垎鏋愩佹暟鎹粨鏋勮璁″浘銆佹牳蹇冧唬鐮侊紙闄勬敞閲婏級銆佹祴璇曟姤鍛娿 +3. 婕旂ずDemo锛氳兘鐩磋灞曠ず鈥滅嚎鎬ц〃鏌ュ湴鐐光濃滄爤瀹炵幇DFS璺緞鈥濈殑杩囩▼锛岀鍚堟暟鎹粨鏋勮绋嬭姹傘 + +棣欐ⅷ: 10-23 14:19:41 +#include +#include + +// 鍒ゆ柇瀛楃涓叉槸鍚︿负鍥炴枃 +int HuiWen(char s[]) { + int len = strlen(s); + for (int i = 0; i < len / 2; i++) { + if (s[i] != s[len - 1 - i]) { + return 0; // 涓嶆槸鍥炴枃 + } + } + return 1; // 鏄洖鏂 +} + +int main() { + char s1[100], s2[100]; + int n1, n2; + + // 杈撳叆涓や釜瀛楃涓 + gets(s1); + gets(s2); + + // 璁$畻瀛楃涓查暱搴︼紙杩欓噷涔熷彲浠ョ敤strlen锛屼唬鐮佷腑鍐欐硶鍙紭鍖栵紝姝ゅ鎸夐昏緫瀹炵幇锛 + n1 = strlen(s1); + n2 = strlen(s2); + + // 鍒ゆ柇骞惰緭鍑虹粨鏋 + if (HuiWen(s1)) { + printf("%s鏄洖鏂囷紒\n", s1); + } else { + printf("%s涓嶆槸鍥炴枃锛乗n", s1); + } + + if (HuiWen(s2)) { + printf("%s鏄洖鏂囷紒\n", s2); + } else { + printf("%s涓嶆槸鍥炴枃锛乗n", s2); + } + + return 0; +} \ No newline at end of file -- Gitee From 69f72e98ebe608c88b14fd7f054dece15383dbe5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=93=8D?= <16216866+xiang-zi-li@user.noreply.gitee.com> Date: Wed, 19 Nov 2025 10:01:54 +0000 Subject: [PATCH 20/33] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20?= =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E4=B9=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "\351\241\271\347\233\256\344\271\246" | 86 -------------------------- 1 file changed, 86 deletions(-) delete mode 100644 "\351\241\271\347\233\256\344\271\246" diff --git "a/\351\241\271\347\233\256\344\271\246" "b/\351\241\271\347\233\256\344\271\246" deleted file mode 100644 index 2000485..0000000 --- "a/\351\241\271\347\233\256\344\271\246" +++ /dev/null @@ -1,86 +0,0 @@ -棣欐ⅷ: 10-23 13:34:51 -鏍″洯瀵兼父绯荤粺椤圭洰涔 - -涓銆侀」鐩儗鏅笌鐩爣 - -椤圭洰鑳屾櫙 - -褰撳墠鏍″洯闈㈢Н鎵╁ぇ銆佸缓绛戝垎甯冨鏉傦紝鏂扮敓鎶ュ埌銆佽瀹㈡潵璁挎椂鏄撹糠澶辨柟鍚戯紝浼犵粺绾歌川鍦板浘鏇存柊鎱€佹寚寮曚笉鐩磋銆傛湰绯荤粺缁撳悎鏁版嵁缁撴瀯鐭ヨ瘑锛屽紑鍙戣交閲忓寲鏍″洯瀵兼父宸ュ叿锛岃В鍐虫牎鍥鑸棝鐐广 - -椤圭洰鐩爣 - -1.聽瀹炵幇鏍″洯鏍稿績鍦扮偣锛堟暀瀛︽ゼ銆侀鍫傘佸浘涔﹂绛夛級淇℃伅鐨勫瓨鍌ㄤ笌鏌ヨ銆 -2.聽鏀寔鐢ㄦ埛杈撳叆璧风偣鍜岀粓鐐癸紝蹇熺敓鎴愭渶浼樻琛岃矾绾裤 -3.聽鏍稿績杩愮敤绾挎ц〃涓庢爤涓ょ鏁版嵁缁撴瀯锛屼繚闅滃姛鑳借惤鍦颁笌杩愯鏁堢巼銆 - -浜屻佹牳蹇冨姛鑳借璁 - -1.聽鍦扮偣淇℃伅绠$悊锛氬瓨鍌ㄥ湴鐐瑰悕绉般佷綅缃潗鏍囥佸姛鑳戒粙缁嶃佸紑鏀炬椂闂寸瓑淇℃伅锛屾敮鎸佹柊澧炪佷慨鏀广佹煡璇㈡搷浣溿 -2.聽璺緞瀵艰埅锛氱敤鎴烽夋嫨璧风偣鍜岀粓鐐瑰悗锛岀郴缁熻绠楀苟灞曠ず鏈鐭矾寰勶紝鏍囨敞閫旂粡鍦扮偣鍙婇浼版琛屾椂闂淬 -3.聽鍘嗗彶璁板綍绠$悊锛氫繚瀛樼敤鎴疯繎10娆℃煡璇㈢殑璺嚎璁板綍锛屾敮鎸佹煡鐪嬩笌鍐嶆瀵艰埅銆 -4.聽鎿嶄綔鎾ら攢锛氱敤鎴疯閫夊湴鐐规垨鍙戣捣閿欒鏌ヨ鏃讹紝鍙挙閿涓婁竴姝ユ搷浣滐紝鍥炲綊涔嬪墠鐘舵併 - -涓夈佹暟鎹粨鏋勫簲鐢ㄨ璁 - -1. 绾挎ц〃锛堥『搴忚〃锛 - -- 搴旂敤鍦烘櫙锛氭牎鍥湴鐐逛俊鎭簱瀛樺偍銆佺敤鎴峰鑸巻鍙茶褰曞瓨鍌ㄣ -- 璁捐閫昏緫锛 -- 瀹氫箟鈥滃湴鐐光濇暟鎹厓绱狅紝鍖呭惈聽鍦扮偣ID銆佸悕绉般佸潗鏍嘪銆佸潗鏍嘫銆佸姛鑳芥弿杩奥5涓睘鎬э紝鐢ㄩ『搴忚〃瀛樺偍鎵鏈夊湴鐐逛俊鎭傞『搴忚〃鏀寔闅忔満璁块棶锛岀敤鎴锋煡璇⑩滃浘涔﹂鈥濇椂锛屽彲閫氳繃閬嶅巻椤哄簭琛ㄥ揩閫熷尮閰嶅搴斿厓绱狅紝鑾峰彇璇︾粏淇℃伅銆 -- 鐢ㄩ『搴忚〃瀛樺偍鐢ㄦ埛鍘嗗彶璁板綍锛屾瘡涓褰曞寘鍚犳煡璇㈡椂闂淬佽捣鐐广佺粓鐐广佽矾寰劼狅紝鎸夋煡璇㈡椂闂村掑簭鎺掑垪锛岀敤鎴风偣鍑烩滃巻鍙茶褰曗濆嵆鍙洿鎺ヨ皟鍙栵紝鏃犻渶閲嶅璁$畻璺緞銆 - -2. 鏍堬紙椤哄簭鏍堬級 - -- 搴旂敤鍦烘櫙锛氳矾寰勬悳绱㈢殑娣卞害浼樺厛閬嶅巻锛圖FS锛夈佺敤鎴锋搷浣滄挙閿銆 -- 璁捐閫昏緫锛 -- 璺緞鎼滅储锛氬皢鏍″洯鍦板浘鎶借薄涓衡滃湴鐐癸紙椤剁偣锛-璺緞锛堣竟锛夆濈殑鍥剧粨鏋勶紝鐢―FS閬嶅巻鎵炬渶鐭矾寰勩傛瘡璁块棶涓涓湴鐐癸紙濡備粠鈥滄牎闂ㄢ濆埌鈥滄暀瀛︽ゼA鈥濓級锛屽氨灏嗚鍦扮偣鍘嬪叆鏍堬紱鑻ュ悗缁矾绾夸笉閫氾紙濡傗滄暀瀛︽ゼA鈥濆埌鈥滃浘涔﹂鈥濇棤鐩磋揪璺級锛屽垯浠庢爤椤跺脊鍑衡滄暀瀛︽ゼA鈥濓紝鍥炴函鍒颁笂涓鍦扮偣鈥滄牎闂ㄢ濓紝閲嶆柊鎺㈢储鍏朵粬璺嚎锛岀洿鑷虫壘鍒扮粓鐐广 -- 鎿嶄綔鎾ら攢锛氱敤鏍堝瓨鍌ㄧ敤鎴锋瘡涓姝ユ搷浣滐紙濡傗滈夋嫨璧风偣锛氭牎闂ㄢ濃滈夋嫨缁堢偣锛氬浘涔﹂鈥濓級銆傜敤鎴风偣鍑烩滄挙閿鈥濇椂锛屽脊鍑烘爤椤舵搷浣滆褰曪紝绯荤粺鎭㈠鍒颁笂涓姝ョ姸鎬侊紙濡傛挙閿鈥滈夋嫨缁堢偣鈥濓紝鍥炲埌鈥滃緟閫夌粓鐐光濈晫闈級銆 - -鍥涖侀鏈熸垚鏋 - -1.聽鍙繍琛岀殑鏍″洯瀵兼父绯荤粺锛堟敮鎸佸湴鐐规煡璇€佽矾寰勫鑸佸巻鍙茶褰曘佹搷浣滄挙閿4澶у姛鑳斤級銆 -2.聽瀹屾暣鏂囨。锛氬惈闇姹傚垎鏋愩佹暟鎹粨鏋勮璁″浘銆佹牳蹇冧唬鐮侊紙闄勬敞閲婏級銆佹祴璇曟姤鍛娿 -3.聽婕旂ずDemo锛氳兘鐩磋灞曠ず鈥滅嚎鎬ц〃鏌ュ湴鐐光濃滄爤瀹炵幇DFS璺緞鈥濈殑杩囩▼锛岀鍚堟暟鎹粨鏋勮绋嬭姹傘 - -棣欐ⅷ: 10-23 14:19:41 -#include -#include - -// 鍒ゆ柇瀛楃涓叉槸鍚︿负鍥炴枃 -int HuiWen(char s[]) { - int len = strlen(s); - for (int i = 0; i < len / 2; i++) { - if (s[i] != s[len - 1 - i]) { - return 0; // 涓嶆槸鍥炴枃 - } - } - return 1; // 鏄洖鏂 -} - -int main() { - char s1[100], s2[100]; - int n1, n2; - - // 杈撳叆涓や釜瀛楃涓 - gets(s1); - gets(s2); - - // 璁$畻瀛楃涓查暱搴︼紙杩欓噷涔熷彲浠ョ敤strlen锛屼唬鐮佷腑鍐欐硶鍙紭鍖栵紝姝ゅ鎸夐昏緫瀹炵幇锛 - n1 = strlen(s1); - n2 = strlen(s2); - - // 鍒ゆ柇骞惰緭鍑虹粨鏋 - if (HuiWen(s1)) { - printf("%s鏄洖鏂囷紒\n", s1); - } else { - printf("%s涓嶆槸鍥炴枃锛乗n", s1); - } - - if (HuiWen(s2)) { - printf("%s鏄洖鏂囷紒\n", s2); - } else { - printf("%s涓嶆槸鍥炴枃锛乗n", s2); - } - - return 0; -} -- Gitee From 1f669bc3ff1d7dc549706cc744de8c91007e69d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=93=8D?= <16216866+xiang-zi-li@user.noreply.gitee.com> Date: Wed, 19 Nov 2025 10:02:44 +0000 Subject: [PATCH 21/33] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20=E7=BA=BF=E6=80=A7?= =?UTF-8?q?=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "\347\272\277\346\200\247\350\241\250/.keep" | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 "\347\272\277\346\200\247\350\241\250/.keep" diff --git "a/\347\272\277\346\200\247\350\241\250/.keep" "b/\347\272\277\346\200\247\350\241\250/.keep" new file mode 100644 index 0000000..e69de29 -- Gitee From 233a014eceb2cfc0339fff88bbbbf59ef0ba8269 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=93=8D?= <16216866+xiang-zi-li@user.noreply.gitee.com> Date: Wed, 19 Nov 2025 10:03:50 +0000 Subject: [PATCH 22/33] =?UTF-8?q?add=20=E7=BA=BF=E6=80=A7=E8=A1=A8/?= =?UTF-8?q?=E4=BB=A3=E7=A0=81.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 鏉庡搷 <16216866+xiang-zi-li@user.noreply.gitee.com> --- .../\344\273\243\347\240\201" | 429 ++++++++++++++++++ 1 file changed, 429 insertions(+) create mode 100644 "\347\272\277\346\200\247\350\241\250/\344\273\243\347\240\201" diff --git "a/\347\272\277\346\200\247\350\241\250/\344\273\243\347\240\201" "b/\347\272\277\346\200\247\350\241\250/\344\273\243\347\240\201" new file mode 100644 index 0000000..6733ac2 --- /dev/null +++ "b/\347\272\277\346\200\247\350\241\250/\344\273\243\347\240\201" @@ -0,0 +1,429 @@ +#include +#include +#include +#include + +// 甯搁噺瀹氫箟 +#define MAX_PLACE 50 // 鏈澶у湴鐐规暟閲 +#define MAX_HISTORY 10 // 鏈澶у巻鍙茶褰曟暟 +#define MAX_OPERATE 20 // 鏈澶ф搷浣滆褰曟暟 +#define MAX_PATH 30 // 鏈澶ц矾寰勯暱搴 +#define WALK_SPEED 50 // 姝ヨ閫熷害锛50绫/鍒嗛挓锛堢敤浜庝及绠楁椂闂达級 + +// 1. 鏁版嵁缁撴瀯瀹氫箟 +// 鍦扮偣缁撴瀯浣擄紙椤剁偣锛 +typedef struct { + int id; // 鍦扮偣ID + char name[50]; // 鍦扮偣鍚嶇О + int x; // X鍧愭爣 + int y; // Y鍧愭爣 + char desc[200]; // 鍔熻兘鎻忚堪 + char openTime[50]; // 寮鏀炬椂闂 +} Place; + +// 椤哄簭琛紙瀛樺偍鍦扮偣搴撱佸巻鍙茶褰曪級 +// 鍦扮偣椤哄簭琛 +typedef struct { + Place data[MAX_PLACE]; + int length; +} PlaceList; + +// 瀵艰埅璁板綍缁撴瀯浣 +typedef struct { + char time[20]; // 鏌ヨ鏃堕棿 + char start[50]; // 璧风偣 + char end[50]; // 缁堢偣 + char path[MAX_PATH*50];// 璺緞淇℃伅 +} NavHistory; + +// 鍘嗗彶璁板綍椤哄簭琛 +typedef struct { + NavHistory data[MAX_HISTORY]; + int length; +} HistoryList; + +// 椤哄簭鏍堬紙鐢ㄤ簬DFS璺緞鎼滅储銆佹搷浣滄挙閿锛 +// 璺緞鏍堬紙瀛樺偍鍦扮偣ID锛 +typedef struct { + int data[MAX_PATH]; + int top; +} PathStack; + +// 鎿嶄綔鏍堬紙瀛樺偍鐢ㄦ埛鎿嶄綔鎻忚堪锛 +typedef struct { + char data[MAX_OPERATE][100]; + int top; +} OperateStack; + +// 鍥剧殑閭绘帴鐭╅樀锛堝瓨鍌ㄥ湴鐐归棿璺緞锛岃竟鏉冮噸涓鸿窛绂伙級 +int graph[MAX_PLACE][MAX_PLACE]; +int graphSize; // 鍥句腑椤剁偣鏁伴噺锛堝嵆鍦扮偣鏁伴噺锛 + +// 鍏ㄥ眬鍙橀噺锛堢畝鍖栬皟鐢紝瀹為檯椤圭洰鍙皝瑁呬负缁撴瀯浣擄級 +PlaceList placeList; // 鏍″洯鍦扮偣搴 +HistoryList historyList; // 瀵艰埅鍘嗗彶璁板綍 +PathStack pathStack; // DFS璺緞鏍 +OperateStack operateStack;// 鎿嶄綔鎾ら攢鏍 +char bestPath[MAX_PATH*50];// 鏈浼樿矾寰勫瓨鍌 +int minDistance = 0x7fffffff; // 鏈鐭窛绂伙紝鍒濆涓烘瀬澶у + +// 2. 鍒濆鍖栧嚱鏁 +// 鍒濆鍖栧湴鐐归『搴忚〃 +void initPlaceList() { + placeList.length = 0; + memset(placeList.data, 0, sizeof(placeList.data)); +} + +// 鍒濆鍖栧巻鍙茶褰曢『搴忚〃 +void initHistoryList() { + historyList.length = 0; + memset(historyList.data, 0, sizeof(historyList.data)); +} + +// 鍒濆鍖栬矾寰勬爤 +void initPathStack() { + pathStack.top = -1; +} + +// 鍒濆鍖栨搷浣滄爤 +void initOperateStack() { + operateStack.top = -1; +} + +// 鍒濆鍖栭偦鎺ョ煩闃 +void initGraph() { + graphSize = 0; + for (int i = 0; i < MAX_PLACE; i++) { + for (int j = 0; j < MAX_PLACE; j++) { + graph[i][j] = (i == j) ? 0 : 0x7fffffff; // 鍒濆鏃犺繛鎺ヤ负鏋佸ぇ鍊 + } + } +} + +// 3. 绾挎ц〃鐩稿叧鎿嶄綔锛堝湴鐐圭鐞嗐佸巻鍙茶褰曪級 +// 娣诲姞鍦扮偣鍒伴『搴忚〃 +void addPlace(Place p) { + if (placeList.length >= MAX_PLACE) { + printf("鍦扮偣搴撳凡婊★紝鏃犳硶娣诲姞锛乗n"); + return; + } + placeList.data[placeList.length++] = p; + graphSize++; // 鍥鹃《鐐规暟澧炲姞 + printf("娣诲姞鍦扮偣銆%s銆戞垚鍔燂紒\n", p.name); + // 璁板綍鎿嶄綔 + char op[100]; + sprintf(op, "娣诲姞鍦扮偣锛%s", p.name); + operateStack.top++; + strcpy(operateStack.data[operateStack.top], op); +} + +// 鏌ヨ鍦扮偣锛堟寜鍚嶇О锛 +Place* queryPlaceByName(char* name) { + for (int i = 0; i < placeList.length; i++) { + if (strcmp(placeList.data[i].name, name) == 0) { + return &placeList.data[i]; + } + } + return NULL; // 鏈壘鍒 +} + +// 娣诲姞瀵艰埅璁板綍鍒板巻鍙茶〃锛堟寜鏃堕棿鍊掑簭锛 +void addHistory(char* start, char* end, char* path) { + NavHistory h; + // 鑾峰彇褰撳墠鏃堕棿 + time_t now = time(NULL); + strftime(h.time, sizeof(h.time), "%Y-%m-%d %H:%M", localtime(&now)); + strcpy(h.start, start); + strcpy(h.end, end); + strcpy(h.path, path); + + // 鍘嗗彶璁板綍婊″垯绉婚櫎鏈鏃х殑锛堟渶鍚庝竴涓級 + if (historyList.length >= MAX_HISTORY) { + for (int i = MAX_HISTORY-1; i > 0; i--) { + historyList.data[i] = historyList.data[i-1]; + } + historyList.data[0] = h; + } else { + // 鏂拌褰曟彃鍏ュご閮紙鍊掑簭锛 + for (int i = historyList.length; i > 0; i--) { + historyList.data[i] = historyList.data[i-1]; + } + historyList.data[0] = h; + historyList.length++; + } + printf("鍘嗗彶璁板綍宸蹭繚瀛橈紒\n"); +} + +// 鏄剧ず鎵鏈夊巻鍙茶褰 +void showHistory() { + if (historyList.length == 0) { + printf("鏆傛棤瀵艰埅鍘嗗彶璁板綍锛乗n"); + return; + } + printf("\n===== 瀵艰埅鍘嗗彶璁板綍 =====\n"); + for (int i = 0; i < historyList.length; i++) { + printf("%d. 鏃堕棿锛%s\n 璧风偣锛%s -> 缁堢偣锛%s\n 璺緞锛%s\n", + i+1, historyList.data[i].time, + historyList.data[i].start, + historyList.data[i].end, + historyList.data[i].path); + } + printf("========================\n"); +} + +// 4. 鏍堢浉鍏虫搷浣滐紙DFS璺緞銆佹搷浣滄挙閿锛 +// 璺緞鏍堝帇鏍 +void pushPath(int placeId) { + if (pathStack.top >= MAX_PATH-1) { + printf("璺緞杩囬暱锛屾棤娉曠户缁帰绱紒\n"); + return; + } + pathStack.data[++pathStack.top] = placeId; +} + +// 璺緞鏍堝嚭鏍 +int popPath() { + if (pathStack.top == -1) { + printf("璺緞鏍堜负绌猴紒\n"); + return -1; + } + return pathStack.data[pathStack.top--]; +} + +// 鎿嶄綔鏍堝帇鏍 +void pushOperate(char* op) { + if (operateStack.top >= MAX_OPERATE-1) { + printf("鎿嶄綔璁板綍宸叉弧锛屾棤娉曡褰曪紒\n"); + return; + } + operateStack.top++; + strcpy(operateStack.data[operateStack.top], op); +} + +// 鎿嶄綔鎾ら攢锛堝嚭鏍堝苟鎭㈠鐘舵侊級 +void undoOperate() { + if (operateStack.top == -1) { + printf("鏃犳搷浣滃彲鎾ら攢锛乗n"); + return; + } + printf("鎾ら攢鎿嶄綔锛%s\n", operateStack.data[operateStack.top]); + operateStack.top--; + // 姝ゅ绠鍖栫姸鎬佹仮澶嶏紝瀹為檯闇鏍规嵁鎿嶄綔绫诲瀷澶勭悊锛堝鎾ら攢娣诲姞鍦扮偣鍒欏垹闄ゆ渶鍚庝竴涓級 + if (strstr(operateStack.data[operateStack.top+1], "娣诲姞鍦扮偣") != NULL) { + placeList.length--; + graphSize--; + } +} + +// 5. DFS璺緞鎼滅储锛堥掑綊瀹炵幇锛 +// 鍙傛暟锛氬綋鍓嶅湴鐐笽D銆佺粓鐐笽D銆佸凡璧拌窛绂汇佽闂爣璁 +void dfs(int currentId, int endId, int distance, int visited[]) { + // 鏍囪褰撳墠鍦扮偣宸茶闂 + visited[currentId] = 1; + // 灏嗗綋鍓嶅湴鐐瑰帇鏍 + pushPath(currentId); + + // 鍒拌揪缁堢偣锛屾洿鏂版渶鐭矾寰 + if (currentId == endId) { + if (distance < minDistance) { + minDistance = distance; + // 娓呯┖鏈浼樿矾寰 + memset(bestPath, 0, sizeof(bestPath)); + // 灏嗘爤涓矾寰勮浆涓哄瓧绗︿覆 + for (int i = 0; i <= pathStack.top; i++) { + strcat(bestPath, placeList.data[pathStack.data[i]].name); + if (i != pathStack.top) { + strcat(bestPath, " -> "); + } + } + } + // 鍥炴函锛氬嚭鏍堝苟鍙栨秷鏍囪 + popPath(); + visited[currentId] = 0; + return; + } + + // 閬嶅巻鎵鏈夌浉閭诲湴鐐 + for (int i = 0; i < graphSize; i++) { + // 鑻ユ湭璁块棶涓旀湁璺緞锛堣窛绂讳笉涓烘瀬澶у硷級 + if (visited[i] == 0 && graph[currentId][i] != 0x7fffffff) { + dfs(i, endId, distance + graph[currentId][i], visited); + } + } + + // 鍥炴函锛氬嚭鏍堝苟鍙栨秷鏍囪 + popPath(); + visited[currentId] = 0; +} + +// 璁$畻涓ょ偣闂寸洿绾胯窛绂伙紙浣滀负杈规潈閲嶅垵濮嬪寲绀轰緥锛 +int calcDistance(Place p1, Place p2) { + // 绠鍖栦负鏁存暟璺濈锛堝疄闄呭彲鎸夊嬀鑲″畾鐞嗚绠楃簿纭硷級 + return abs(p1.x - p2.x) + abs(p1.y - p2.y); +} + +// 鍒濆鍖栧浘鐨勮竟锛堟牴鎹湴鐐瑰潗鏍囪绠楄窛绂伙級 +void initGraphEdges() { + for (int i = 0; i < placeList.length; i++) { + for (int j = 0; j < placeList.length; j++) { + if (i != j) { + graph[i][j] = calcDistance(placeList.data[i], placeList.data[j]); + } + } + } +} + +// 瀵艰埅鍔熻兘锛氳緭鍏ヨ捣鐐圭粓鐐癸紝鐢熸垚鏈鐭矾寰 +void navigate(char* startName, char* endName) { + // 鏌ユ壘璧风偣鍜岀粓鐐 + Place* start = queryPlaceByName(startName); + Place* end = queryPlaceByName(endName); + if (start == NULL || end == NULL) { + printf("璧风偣鎴栫粓鐐逛笉瀛樺湪锛乗n"); + return; + } + if (start == end) { + printf("璧风偣鍜岀粓鐐圭浉鍚岋紝鏃犻渶瀵艰埅锛乗n"); + return; + } + + // 鍒濆鍖朌FS鐩稿叧鍙傛暟 + initPathStack(); + minDistance = 0x7fffffff; + memset(bestPath, 0, sizeof(bestPath)); + int visited[MAX_PLACE] = {0}; + + // 鎵цDFS鎼滅储鏈鐭矾寰 + dfs(start->id, end->id, 0, visited); + + if (minDistance == 0x7fffffff) { + printf("鏃犳硶鎵惧埌浠庛%s銆戝埌銆%s銆戠殑璺緞锛乗n", startName, endName); + return; + } + + // 璁$畻棰勪及鏃堕棿 + int time = minDistance / WALK_SPEED; + if (minDistance % WALK_SPEED != 0) time++; + + // 鏄剧ず缁撴灉 + printf("\n===== 瀵艰埅缁撴灉 =====\n"); + printf("璧风偣锛%s\n缁堢偣锛%s\n", startName, endName); + printf("鏈鐭矾寰勶細%s\n", bestPath); + printf("鎬昏窛绂伙細%d绫砛n", minDistance); + printf("棰勪及姝ヨ鏃堕棿锛%d鍒嗛挓\n", time); + printf("=====================\n"); + + // 淇濆瓨鍒板巻鍙茶褰 + addHistory(startName, endName, bestPath); + + // 璁板綍鎿嶄綔 + char op[100]; + sprintf(op, "瀵艰埅锛%s -> %s", startName, endName); + pushOperate(op); +} + +// 6. 娴嬭瘯鏁版嵁涓庝富鍑芥暟 +// 鍔犺浇娴嬭瘯鍦扮偣鏁版嵁 +void loadTestData() { + // 鍒濆鍖栧湴鐐 + Place p1 = {0, "鏍¢棬", 0, 0, "鏍″洯涓诲叆鍙", "00:00-24:00"}; + Place p2 = {1, "鏁欏妤糀", 100, 200, "涓昏鏁欏鍖", "08:00-22:00"}; + Place p3 = {2, "鍥句功棣", 300, 200, "鍥句功鍊熼槄涓庤嚜涔", "08:30-21:30"}; + Place p4 = {3, "绗竴椋熷爞", 200, 400, "鎻愪緵涓夐", "06:30-21:00"}; + Place p5 = {4, "鎿嶅満", 100, 500, "浣撹偛娲诲姩鍦哄湴", "06:00-23:00"}; + + // 娣诲姞鍒板湴鐐瑰簱 + addPlace(p1); + addPlace(p2); + addPlace(p3); + addPlace(p4); + addPlace(p5); + + // 鍒濆鍖栧浘杈癸紙璺濈锛 + initGraphEdges(); +} + +// 涓昏彍鍗 +void showMenu() { + printf("\n===== 鏍″洯瀵兼父绯荤粺 =====\n"); + printf("1. 鏌ョ湅鍦扮偣淇℃伅\n"); + printf("2. 瀵艰埅璺嚎鏌ヨ\n"); + printf("3. 鏌ョ湅鍘嗗彶璁板綍\n"); + printf("4. 鎾ら攢涓婁竴姝ユ搷浣淺n"); + printf("5. 閫鍑虹郴缁焅n"); + printf("========================\n"); + printf("璇疯緭鍏ユ搷浣滅紪鍙凤細"); +} + +int main() { + // 鍒濆鍖栨墍鏈夋暟鎹粨鏋 + initPlaceList(); + initHistoryList(); + initPathStack(); + initOperateStack(); + initGraph(); + + // 鍔犺浇娴嬭瘯鏁版嵁锛堝疄闄呭彲鎵嬪姩娣诲姞锛 + loadTestData(); + printf("绯荤粺鍒濆鍖栧畬鎴愶紝娆㈣繋浣跨敤鏍″洯瀵兼父绯荤粺锛乗n"); + + int choice; + char name[50], start[50], end[50]; + Place* p; + + while (1) { + showMenu(); + scanf("%d", &choice); + getchar(); // 鍚告敹鎹㈣绗 + + switch (choice) { + case 1: + // 鏌ョ湅鍦扮偣淇℃伅 + printf("璇疯緭鍏ヨ鏌ヨ鐨勫湴鐐瑰悕绉帮細"); + fgets(name, sizeof(name), stdin); + name[strlen(name)-1] = '\0'; // 鍘婚櫎鎹㈣绗 + p = queryPlaceByName(name); + if (p != NULL) { + printf("\n===== 鍦扮偣璇︽儏 =====\n"); + printf("ID锛%d\n鍚嶇О锛%s\n鍧愭爣锛(%d,%d)\n鍔熻兘锛%s\n寮鏀炬椂闂达細%s\n", + p->id, p->name, p->x, p->y, p->desc, p->openTime); + printf("=====================\n"); + } else { + printf("鏈壘鍒拌鍦扮偣锛乗n"); + } + break; + + case 2: + // 瀵艰埅璺嚎鏌ヨ + printf("璇疯緭鍏ヨ捣鐐癸細"); + fgets(start, sizeof(start), stdin); + start[strlen(start)-1] = '\0'; + printf("璇疯緭鍏ョ粓鐐癸細"); + fgets(end, sizeof(end), stdin); + end[strlen(end)-1] = '\0'; + navigate(start, end); + break; + + case 3: + // 鏌ョ湅鍘嗗彶璁板綍 + showHistory(); + break; + + case 4: + // 鎾ら攢涓婁竴姝ユ搷浣 + undoOperate(); + break; + + case 5: + // 閫鍑虹郴缁 + printf("鎰熻阿浣跨敤锛屽啀瑙侊紒\n"); + exit(0); + + default: + printf("杈撳叆閿欒锛岃閲嶆柊閫夋嫨锛乗n"); + break; + } + } + + return 0; +} \ No newline at end of file -- Gitee From 15db9167980d40a9d00008a2849a37053189699a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=93=8D?= <16216866+xiang-zi-li@user.noreply.gitee.com> Date: Wed, 19 Nov 2025 10:04:33 +0000 Subject: [PATCH 23/33] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20?= =?UTF-8?q?=E6=BA=90=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "\346\272\220\344\273\243\347\240\201" | 429 ------------------------- 1 file changed, 429 deletions(-) delete mode 100644 "\346\272\220\344\273\243\347\240\201" diff --git "a/\346\272\220\344\273\243\347\240\201" "b/\346\272\220\344\273\243\347\240\201" deleted file mode 100644 index 6733ac2..0000000 --- "a/\346\272\220\344\273\243\347\240\201" +++ /dev/null @@ -1,429 +0,0 @@ -#include -#include -#include -#include - -// 甯搁噺瀹氫箟 -#define MAX_PLACE 50 // 鏈澶у湴鐐规暟閲 -#define MAX_HISTORY 10 // 鏈澶у巻鍙茶褰曟暟 -#define MAX_OPERATE 20 // 鏈澶ф搷浣滆褰曟暟 -#define MAX_PATH 30 // 鏈澶ц矾寰勯暱搴 -#define WALK_SPEED 50 // 姝ヨ閫熷害锛50绫/鍒嗛挓锛堢敤浜庝及绠楁椂闂达級 - -// 1. 鏁版嵁缁撴瀯瀹氫箟 -// 鍦扮偣缁撴瀯浣擄紙椤剁偣锛 -typedef struct { - int id; // 鍦扮偣ID - char name[50]; // 鍦扮偣鍚嶇О - int x; // X鍧愭爣 - int y; // Y鍧愭爣 - char desc[200]; // 鍔熻兘鎻忚堪 - char openTime[50]; // 寮鏀炬椂闂 -} Place; - -// 椤哄簭琛紙瀛樺偍鍦扮偣搴撱佸巻鍙茶褰曪級 -// 鍦扮偣椤哄簭琛 -typedef struct { - Place data[MAX_PLACE]; - int length; -} PlaceList; - -// 瀵艰埅璁板綍缁撴瀯浣 -typedef struct { - char time[20]; // 鏌ヨ鏃堕棿 - char start[50]; // 璧风偣 - char end[50]; // 缁堢偣 - char path[MAX_PATH*50];// 璺緞淇℃伅 -} NavHistory; - -// 鍘嗗彶璁板綍椤哄簭琛 -typedef struct { - NavHistory data[MAX_HISTORY]; - int length; -} HistoryList; - -// 椤哄簭鏍堬紙鐢ㄤ簬DFS璺緞鎼滅储銆佹搷浣滄挙閿锛 -// 璺緞鏍堬紙瀛樺偍鍦扮偣ID锛 -typedef struct { - int data[MAX_PATH]; - int top; -} PathStack; - -// 鎿嶄綔鏍堬紙瀛樺偍鐢ㄦ埛鎿嶄綔鎻忚堪锛 -typedef struct { - char data[MAX_OPERATE][100]; - int top; -} OperateStack; - -// 鍥剧殑閭绘帴鐭╅樀锛堝瓨鍌ㄥ湴鐐归棿璺緞锛岃竟鏉冮噸涓鸿窛绂伙級 -int graph[MAX_PLACE][MAX_PLACE]; -int graphSize; // 鍥句腑椤剁偣鏁伴噺锛堝嵆鍦扮偣鏁伴噺锛 - -// 鍏ㄥ眬鍙橀噺锛堢畝鍖栬皟鐢紝瀹為檯椤圭洰鍙皝瑁呬负缁撴瀯浣擄級 -PlaceList placeList; // 鏍″洯鍦扮偣搴 -HistoryList historyList; // 瀵艰埅鍘嗗彶璁板綍 -PathStack pathStack; // DFS璺緞鏍 -OperateStack operateStack;// 鎿嶄綔鎾ら攢鏍 -char bestPath[MAX_PATH*50];// 鏈浼樿矾寰勫瓨鍌 -int minDistance = 0x7fffffff; // 鏈鐭窛绂伙紝鍒濆涓烘瀬澶у - -// 2. 鍒濆鍖栧嚱鏁 -// 鍒濆鍖栧湴鐐归『搴忚〃 -void initPlaceList() { - placeList.length = 0; - memset(placeList.data, 0, sizeof(placeList.data)); -} - -// 鍒濆鍖栧巻鍙茶褰曢『搴忚〃 -void initHistoryList() { - historyList.length = 0; - memset(historyList.data, 0, sizeof(historyList.data)); -} - -// 鍒濆鍖栬矾寰勬爤 -void initPathStack() { - pathStack.top = -1; -} - -// 鍒濆鍖栨搷浣滄爤 -void initOperateStack() { - operateStack.top = -1; -} - -// 鍒濆鍖栭偦鎺ョ煩闃 -void initGraph() { - graphSize = 0; - for (int i = 0; i < MAX_PLACE; i++) { - for (int j = 0; j < MAX_PLACE; j++) { - graph[i][j] = (i == j) ? 0 : 0x7fffffff; // 鍒濆鏃犺繛鎺ヤ负鏋佸ぇ鍊 - } - } -} - -// 3. 绾挎ц〃鐩稿叧鎿嶄綔锛堝湴鐐圭鐞嗐佸巻鍙茶褰曪級 -// 娣诲姞鍦扮偣鍒伴『搴忚〃 -void addPlace(Place p) { - if (placeList.length >= MAX_PLACE) { - printf("鍦扮偣搴撳凡婊★紝鏃犳硶娣诲姞锛乗n"); - return; - } - placeList.data[placeList.length++] = p; - graphSize++; // 鍥鹃《鐐规暟澧炲姞 - printf("娣诲姞鍦扮偣銆%s銆戞垚鍔燂紒\n", p.name); - // 璁板綍鎿嶄綔 - char op[100]; - sprintf(op, "娣诲姞鍦扮偣锛%s", p.name); - operateStack.top++; - strcpy(operateStack.data[operateStack.top], op); -} - -// 鏌ヨ鍦扮偣锛堟寜鍚嶇О锛 -Place* queryPlaceByName(char* name) { - for (int i = 0; i < placeList.length; i++) { - if (strcmp(placeList.data[i].name, name) == 0) { - return &placeList.data[i]; - } - } - return NULL; // 鏈壘鍒 -} - -// 娣诲姞瀵艰埅璁板綍鍒板巻鍙茶〃锛堟寜鏃堕棿鍊掑簭锛 -void addHistory(char* start, char* end, char* path) { - NavHistory h; - // 鑾峰彇褰撳墠鏃堕棿 - time_t now = time(NULL); - strftime(h.time, sizeof(h.time), "%Y-%m-%d %H:%M", localtime(&now)); - strcpy(h.start, start); - strcpy(h.end, end); - strcpy(h.path, path); - - // 鍘嗗彶璁板綍婊″垯绉婚櫎鏈鏃х殑锛堟渶鍚庝竴涓級 - if (historyList.length >= MAX_HISTORY) { - for (int i = MAX_HISTORY-1; i > 0; i--) { - historyList.data[i] = historyList.data[i-1]; - } - historyList.data[0] = h; - } else { - // 鏂拌褰曟彃鍏ュご閮紙鍊掑簭锛 - for (int i = historyList.length; i > 0; i--) { - historyList.data[i] = historyList.data[i-1]; - } - historyList.data[0] = h; - historyList.length++; - } - printf("鍘嗗彶璁板綍宸蹭繚瀛橈紒\n"); -} - -// 鏄剧ず鎵鏈夊巻鍙茶褰 -void showHistory() { - if (historyList.length == 0) { - printf("鏆傛棤瀵艰埅鍘嗗彶璁板綍锛乗n"); - return; - } - printf("\n===== 瀵艰埅鍘嗗彶璁板綍 =====\n"); - for (int i = 0; i < historyList.length; i++) { - printf("%d. 鏃堕棿锛%s\n 璧风偣锛%s -> 缁堢偣锛%s\n 璺緞锛%s\n", - i+1, historyList.data[i].time, - historyList.data[i].start, - historyList.data[i].end, - historyList.data[i].path); - } - printf("========================\n"); -} - -// 4. 鏍堢浉鍏虫搷浣滐紙DFS璺緞銆佹搷浣滄挙閿锛 -// 璺緞鏍堝帇鏍 -void pushPath(int placeId) { - if (pathStack.top >= MAX_PATH-1) { - printf("璺緞杩囬暱锛屾棤娉曠户缁帰绱紒\n"); - return; - } - pathStack.data[++pathStack.top] = placeId; -} - -// 璺緞鏍堝嚭鏍 -int popPath() { - if (pathStack.top == -1) { - printf("璺緞鏍堜负绌猴紒\n"); - return -1; - } - return pathStack.data[pathStack.top--]; -} - -// 鎿嶄綔鏍堝帇鏍 -void pushOperate(char* op) { - if (operateStack.top >= MAX_OPERATE-1) { - printf("鎿嶄綔璁板綍宸叉弧锛屾棤娉曡褰曪紒\n"); - return; - } - operateStack.top++; - strcpy(operateStack.data[operateStack.top], op); -} - -// 鎿嶄綔鎾ら攢锛堝嚭鏍堝苟鎭㈠鐘舵侊級 -void undoOperate() { - if (operateStack.top == -1) { - printf("鏃犳搷浣滃彲鎾ら攢锛乗n"); - return; - } - printf("鎾ら攢鎿嶄綔锛%s\n", operateStack.data[operateStack.top]); - operateStack.top--; - // 姝ゅ绠鍖栫姸鎬佹仮澶嶏紝瀹為檯闇鏍规嵁鎿嶄綔绫诲瀷澶勭悊锛堝鎾ら攢娣诲姞鍦扮偣鍒欏垹闄ゆ渶鍚庝竴涓級 - if (strstr(operateStack.data[operateStack.top+1], "娣诲姞鍦扮偣") != NULL) { - placeList.length--; - graphSize--; - } -} - -// 5. DFS璺緞鎼滅储锛堥掑綊瀹炵幇锛 -// 鍙傛暟锛氬綋鍓嶅湴鐐笽D銆佺粓鐐笽D銆佸凡璧拌窛绂汇佽闂爣璁 -void dfs(int currentId, int endId, int distance, int visited[]) { - // 鏍囪褰撳墠鍦扮偣宸茶闂 - visited[currentId] = 1; - // 灏嗗綋鍓嶅湴鐐瑰帇鏍 - pushPath(currentId); - - // 鍒拌揪缁堢偣锛屾洿鏂版渶鐭矾寰 - if (currentId == endId) { - if (distance < minDistance) { - minDistance = distance; - // 娓呯┖鏈浼樿矾寰 - memset(bestPath, 0, sizeof(bestPath)); - // 灏嗘爤涓矾寰勮浆涓哄瓧绗︿覆 - for (int i = 0; i <= pathStack.top; i++) { - strcat(bestPath, placeList.data[pathStack.data[i]].name); - if (i != pathStack.top) { - strcat(bestPath, " -> "); - } - } - } - // 鍥炴函锛氬嚭鏍堝苟鍙栨秷鏍囪 - popPath(); - visited[currentId] = 0; - return; - } - - // 閬嶅巻鎵鏈夌浉閭诲湴鐐 - for (int i = 0; i < graphSize; i++) { - // 鑻ユ湭璁块棶涓旀湁璺緞锛堣窛绂讳笉涓烘瀬澶у硷級 - if (visited[i] == 0 && graph[currentId][i] != 0x7fffffff) { - dfs(i, endId, distance + graph[currentId][i], visited); - } - } - - // 鍥炴函锛氬嚭鏍堝苟鍙栨秷鏍囪 - popPath(); - visited[currentId] = 0; -} - -// 璁$畻涓ょ偣闂寸洿绾胯窛绂伙紙浣滀负杈规潈閲嶅垵濮嬪寲绀轰緥锛 -int calcDistance(Place p1, Place p2) { - // 绠鍖栦负鏁存暟璺濈锛堝疄闄呭彲鎸夊嬀鑲″畾鐞嗚绠楃簿纭硷級 - return abs(p1.x - p2.x) + abs(p1.y - p2.y); -} - -// 鍒濆鍖栧浘鐨勮竟锛堟牴鎹湴鐐瑰潗鏍囪绠楄窛绂伙級 -void initGraphEdges() { - for (int i = 0; i < placeList.length; i++) { - for (int j = 0; j < placeList.length; j++) { - if (i != j) { - graph[i][j] = calcDistance(placeList.data[i], placeList.data[j]); - } - } - } -} - -// 瀵艰埅鍔熻兘锛氳緭鍏ヨ捣鐐圭粓鐐癸紝鐢熸垚鏈鐭矾寰 -void navigate(char* startName, char* endName) { - // 鏌ユ壘璧风偣鍜岀粓鐐 - Place* start = queryPlaceByName(startName); - Place* end = queryPlaceByName(endName); - if (start == NULL || end == NULL) { - printf("璧风偣鎴栫粓鐐逛笉瀛樺湪锛乗n"); - return; - } - if (start == end) { - printf("璧风偣鍜岀粓鐐圭浉鍚岋紝鏃犻渶瀵艰埅锛乗n"); - return; - } - - // 鍒濆鍖朌FS鐩稿叧鍙傛暟 - initPathStack(); - minDistance = 0x7fffffff; - memset(bestPath, 0, sizeof(bestPath)); - int visited[MAX_PLACE] = {0}; - - // 鎵цDFS鎼滅储鏈鐭矾寰 - dfs(start->id, end->id, 0, visited); - - if (minDistance == 0x7fffffff) { - printf("鏃犳硶鎵惧埌浠庛%s銆戝埌銆%s銆戠殑璺緞锛乗n", startName, endName); - return; - } - - // 璁$畻棰勪及鏃堕棿 - int time = minDistance / WALK_SPEED; - if (minDistance % WALK_SPEED != 0) time++; - - // 鏄剧ず缁撴灉 - printf("\n===== 瀵艰埅缁撴灉 =====\n"); - printf("璧风偣锛%s\n缁堢偣锛%s\n", startName, endName); - printf("鏈鐭矾寰勶細%s\n", bestPath); - printf("鎬昏窛绂伙細%d绫砛n", minDistance); - printf("棰勪及姝ヨ鏃堕棿锛%d鍒嗛挓\n", time); - printf("=====================\n"); - - // 淇濆瓨鍒板巻鍙茶褰 - addHistory(startName, endName, bestPath); - - // 璁板綍鎿嶄綔 - char op[100]; - sprintf(op, "瀵艰埅锛%s -> %s", startName, endName); - pushOperate(op); -} - -// 6. 娴嬭瘯鏁版嵁涓庝富鍑芥暟 -// 鍔犺浇娴嬭瘯鍦扮偣鏁版嵁 -void loadTestData() { - // 鍒濆鍖栧湴鐐 - Place p1 = {0, "鏍¢棬", 0, 0, "鏍″洯涓诲叆鍙", "00:00-24:00"}; - Place p2 = {1, "鏁欏妤糀", 100, 200, "涓昏鏁欏鍖", "08:00-22:00"}; - Place p3 = {2, "鍥句功棣", 300, 200, "鍥句功鍊熼槄涓庤嚜涔", "08:30-21:30"}; - Place p4 = {3, "绗竴椋熷爞", 200, 400, "鎻愪緵涓夐", "06:30-21:00"}; - Place p5 = {4, "鎿嶅満", 100, 500, "浣撹偛娲诲姩鍦哄湴", "06:00-23:00"}; - - // 娣诲姞鍒板湴鐐瑰簱 - addPlace(p1); - addPlace(p2); - addPlace(p3); - addPlace(p4); - addPlace(p5); - - // 鍒濆鍖栧浘杈癸紙璺濈锛 - initGraphEdges(); -} - -// 涓昏彍鍗 -void showMenu() { - printf("\n===== 鏍″洯瀵兼父绯荤粺 =====\n"); - printf("1. 鏌ョ湅鍦扮偣淇℃伅\n"); - printf("2. 瀵艰埅璺嚎鏌ヨ\n"); - printf("3. 鏌ョ湅鍘嗗彶璁板綍\n"); - printf("4. 鎾ら攢涓婁竴姝ユ搷浣淺n"); - printf("5. 閫鍑虹郴缁焅n"); - printf("========================\n"); - printf("璇疯緭鍏ユ搷浣滅紪鍙凤細"); -} - -int main() { - // 鍒濆鍖栨墍鏈夋暟鎹粨鏋 - initPlaceList(); - initHistoryList(); - initPathStack(); - initOperateStack(); - initGraph(); - - // 鍔犺浇娴嬭瘯鏁版嵁锛堝疄闄呭彲鎵嬪姩娣诲姞锛 - loadTestData(); - printf("绯荤粺鍒濆鍖栧畬鎴愶紝娆㈣繋浣跨敤鏍″洯瀵兼父绯荤粺锛乗n"); - - int choice; - char name[50], start[50], end[50]; - Place* p; - - while (1) { - showMenu(); - scanf("%d", &choice); - getchar(); // 鍚告敹鎹㈣绗 - - switch (choice) { - case 1: - // 鏌ョ湅鍦扮偣淇℃伅 - printf("璇疯緭鍏ヨ鏌ヨ鐨勫湴鐐瑰悕绉帮細"); - fgets(name, sizeof(name), stdin); - name[strlen(name)-1] = '\0'; // 鍘婚櫎鎹㈣绗 - p = queryPlaceByName(name); - if (p != NULL) { - printf("\n===== 鍦扮偣璇︽儏 =====\n"); - printf("ID锛%d\n鍚嶇О锛%s\n鍧愭爣锛(%d,%d)\n鍔熻兘锛%s\n寮鏀炬椂闂达細%s\n", - p->id, p->name, p->x, p->y, p->desc, p->openTime); - printf("=====================\n"); - } else { - printf("鏈壘鍒拌鍦扮偣锛乗n"); - } - break; - - case 2: - // 瀵艰埅璺嚎鏌ヨ - printf("璇疯緭鍏ヨ捣鐐癸細"); - fgets(start, sizeof(start), stdin); - start[strlen(start)-1] = '\0'; - printf("璇疯緭鍏ョ粓鐐癸細"); - fgets(end, sizeof(end), stdin); - end[strlen(end)-1] = '\0'; - navigate(start, end); - break; - - case 3: - // 鏌ョ湅鍘嗗彶璁板綍 - showHistory(); - break; - - case 4: - // 鎾ら攢涓婁竴姝ユ搷浣 - undoOperate(); - break; - - case 5: - // 閫鍑虹郴缁 - printf("鎰熻阿浣跨敤锛屽啀瑙侊紒\n"); - exit(0); - - default: - printf("杈撳叆閿欒锛岃閲嶆柊閫夋嫨锛乗n"); - break; - } - } - - return 0; -} \ No newline at end of file -- Gitee From 9e6a6970d49d6441338eed2c40cebe434605af32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=81=92?= <16212856+butter_01@user.noreply.gitee.com> Date: Fri, 21 Nov 2025 13:30:36 +0000 Subject: [PATCH 24/33] =?UTF-8?q?add=20=E6=A0=91=E7=BB=93=E6=9E=84/campus?= =?UTF-8?q?=5Ftree.h.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 寮犳亽 <16212856+butter_01@user.noreply.gitee.com> --- .../campus_tree.h" | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 "\346\240\221\347\273\223\346\236\204/campus_tree.h" diff --git "a/\346\240\221\347\273\223\346\236\204/campus_tree.h" "b/\346\240\221\347\273\223\346\236\204/campus_tree.h" new file mode 100644 index 0000000..ae3bc75 --- /dev/null +++ "b/\346\240\221\347\273\223\346\236\204/campus_tree.h" @@ -0,0 +1,65 @@ +#ifndef CAMPUS_TREE_ENHANCE_H +#define CAMPUS_TREE_ENHANCE_H + +#include +#include +#include +#include + +// 鍦扮偣淇℃伅缁撴瀯浣 +typedef struct Place { + int id; // 鍦扮偣ID + char name[50]; // 鍦扮偣鍚嶇О + float x; // 妯潗鏍 + float y; // 绾靛潗鏍 + char desc[200]; // 鍔熻兘鎻忚堪 + char openTime[50]; // 寮鏀炬椂闂 +} Place; + +// 鏍戣妭鐐圭粨鏋勪綋 +typedef struct TreeNode { + Place data; // 鑺傜偣瀛樺偍鐨勫湴鐐规暟鎹 + struct TreeNode* parent;// 鐖惰妭鐐规寚閽 + struct TreeNode* child; // 绗竴涓瓙鑺傜偣鎸囬拡 + struct TreeNode* sibling;// 鍏勫紵鑺傜偣鎸囬拡 + int childCount; // 瀛愯妭鐐规暟閲 +} TreeNode, *Tree; + +// 鏍堢粨鏋勪綋 +typedef struct Stack { + int top; + int type; // 0: 鑺傜偣鏍堬紝1: 鎿嶄綔鏍 + union { + TreeNode** nodes; // 鍔ㄦ佽妭鐐规暟缁 + char** ops; // 鍔ㄦ佸瓧绗︿覆鏁扮粍 + } data; +} Stack; + +// 宸茶闂妭鐐圭粨鏋勪綋 +typedef struct { + TreeNode* node; + int visited; +} VisitedNode; + +// 鏍戞搷浣滃嚱鏁 +Tree InitTree(); +TreeNode* CreateTreeNode(Place place); +int AddChildNode(TreeNode* parent, Place place); +TreeNode* SearchNodeByName(Tree tree, const char* name); +void SearchNodesByType(Tree tree, const char* type, Place* result, int* count); +void DFS_Traverse(TreeNode* node, int depth); +void Level_Traverse(Tree tree); +float CalculateDistance(TreeNode* a, TreeNode* b); +void DestroyTree(Tree* tree); + +// 鏍堟搷浣滃嚱鏁 +void InitStack(Stack* stack, int type); +int PushStack(Stack* stack, void* data); +int PopStack(Stack* stack, void* data); +void DestroyStack(Stack* stack); + +// 璺緞鎼滅储鍑芥暟 +int DFS_PathSearch_WithVisited(TreeNode* start, TreeNode* end, Stack* nodeStack, Stack* pathStack, VisitedNode* visited, int maxNodes); +int DFS_PathSearch(TreeNode* start, TreeNode* end, Stack* nodeStack, Stack* pathStack); + +#endif \ No newline at end of file -- Gitee From acf6caf04f55c4e1b48c586dcbbf1bfb6f8a453d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=81=92?= <16212856+butter_01@user.noreply.gitee.com> Date: Fri, 21 Nov 2025 13:30:48 +0000 Subject: [PATCH 25/33] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20?= =?UTF-8?q?=E6=A0=A1=E5=9B=AD=E5=AF=BC=E6=B8=B8=E7=B3=BB=E7=BB=9F/campus?= =?UTF-8?q?=5Ftree.h?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../campus_tree.h" | 65 ------------------- 1 file changed, 65 deletions(-) delete mode 100644 "\346\240\241\345\233\255\345\257\274\346\270\270\347\263\273\347\273\237/campus_tree.h" diff --git "a/\346\240\241\345\233\255\345\257\274\346\270\270\347\263\273\347\273\237/campus_tree.h" "b/\346\240\241\345\233\255\345\257\274\346\270\270\347\263\273\347\273\237/campus_tree.h" deleted file mode 100644 index ae3bc75..0000000 --- "a/\346\240\241\345\233\255\345\257\274\346\270\270\347\263\273\347\273\237/campus_tree.h" +++ /dev/null @@ -1,65 +0,0 @@ -#ifndef CAMPUS_TREE_ENHANCE_H -#define CAMPUS_TREE_ENHANCE_H - -#include -#include -#include -#include - -// 鍦扮偣淇℃伅缁撴瀯浣 -typedef struct Place { - int id; // 鍦扮偣ID - char name[50]; // 鍦扮偣鍚嶇О - float x; // 妯潗鏍 - float y; // 绾靛潗鏍 - char desc[200]; // 鍔熻兘鎻忚堪 - char openTime[50]; // 寮鏀炬椂闂 -} Place; - -// 鏍戣妭鐐圭粨鏋勪綋 -typedef struct TreeNode { - Place data; // 鑺傜偣瀛樺偍鐨勫湴鐐规暟鎹 - struct TreeNode* parent;// 鐖惰妭鐐规寚閽 - struct TreeNode* child; // 绗竴涓瓙鑺傜偣鎸囬拡 - struct TreeNode* sibling;// 鍏勫紵鑺傜偣鎸囬拡 - int childCount; // 瀛愯妭鐐规暟閲 -} TreeNode, *Tree; - -// 鏍堢粨鏋勪綋 -typedef struct Stack { - int top; - int type; // 0: 鑺傜偣鏍堬紝1: 鎿嶄綔鏍 - union { - TreeNode** nodes; // 鍔ㄦ佽妭鐐规暟缁 - char** ops; // 鍔ㄦ佸瓧绗︿覆鏁扮粍 - } data; -} Stack; - -// 宸茶闂妭鐐圭粨鏋勪綋 -typedef struct { - TreeNode* node; - int visited; -} VisitedNode; - -// 鏍戞搷浣滃嚱鏁 -Tree InitTree(); -TreeNode* CreateTreeNode(Place place); -int AddChildNode(TreeNode* parent, Place place); -TreeNode* SearchNodeByName(Tree tree, const char* name); -void SearchNodesByType(Tree tree, const char* type, Place* result, int* count); -void DFS_Traverse(TreeNode* node, int depth); -void Level_Traverse(Tree tree); -float CalculateDistance(TreeNode* a, TreeNode* b); -void DestroyTree(Tree* tree); - -// 鏍堟搷浣滃嚱鏁 -void InitStack(Stack* stack, int type); -int PushStack(Stack* stack, void* data); -int PopStack(Stack* stack, void* data); -void DestroyStack(Stack* stack); - -// 璺緞鎼滅储鍑芥暟 -int DFS_PathSearch_WithVisited(TreeNode* start, TreeNode* end, Stack* nodeStack, Stack* pathStack, VisitedNode* visited, int maxNodes); -int DFS_PathSearch(TreeNode* start, TreeNode* end, Stack* nodeStack, Stack* pathStack); - -#endif \ No newline at end of file -- Gitee From 6a7a302c239736a84a6ab21f401f83df30407f92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=81=92?= <16212856+butter_01@user.noreply.gitee.com> Date: Fri, 21 Nov 2025 13:35:04 +0000 Subject: [PATCH 26/33] =?UTF-8?q?add=20=E6=A0=91=E7=BB=93=E6=9E=84/compus?= =?UTF-8?q?=5Ftree.c.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 寮犳亽 <16212856+butter_01@user.noreply.gitee.com> --- .../compus_tree.c" | 245 ++++++++++++++++++ 1 file changed, 245 insertions(+) create mode 100644 "\346\240\221\347\273\223\346\236\204/compus_tree.c" diff --git "a/\346\240\221\347\273\223\346\236\204/compus_tree.c" "b/\346\240\221\347\273\223\346\236\204/compus_tree.c" new file mode 100644 index 0000000..27173b8 --- /dev/null +++ "b/\346\240\221\347\273\223\346\236\204/compus_tree.c" @@ -0,0 +1,245 @@ +#include "campus_tree.h" + +// 鍒濆鍖栨爲 +Tree InitTree() { + Tree root = (Tree)malloc(sizeof(TreeNode)); + if (!root) return NULL; + root->data.id = 0; + strcpy(root->data.name, "鏍″洯鎬昏"); + root->data.x = 0.0f; + root->data.y = 0.0f; + strcpy(root->data.desc, "鏍″洯鍦扮偣鏍硅妭鐐"); + strcpy(root->data.openTime, "鍏ㄥぉ"); + root->parent = NULL; + root->child = NULL; + root->sibling = NULL; + root->childCount = 0; + return root; +} + +// 鍒涘缓鏍戣妭鐐 +TreeNode* CreateTreeNode(Place place) { + TreeNode* node = (TreeNode*)malloc(sizeof(TreeNode)); + if (!node) return NULL; + node->data = place; + node->parent = NULL; + node->child = NULL; + node->sibling = NULL; + node->childCount = 0; + return node; +} + +// 涓虹埗鑺傜偣娣诲姞瀛愯妭鐐 +int AddChildNode(TreeNode* parent, Place place) { + if (!parent) return -1; + TreeNode* newNode = CreateTreeNode(place); + if (!newNode) return -2; + newNode->parent = parent; + + if (!parent->child) { + parent->child = newNode; + } else { + TreeNode* temp = parent->child; + while (temp->sibling) temp = temp->sibling; + temp->sibling = newNode; + } + parent->childCount++; + return 0; +} + +// 鎸夊悕绉伴掑綊鏌ユ壘鑺傜偣 +TreeNode* SearchNodeByName(Tree tree, const char* name) { + if (!tree) return NULL; + if (strcmp(tree->data.name, name) == 0) return tree; + TreeNode* find = SearchNodeByName(tree->child, name); + if (find) return find; + return SearchNodeByName(tree->sibling, name); +} + +// 鎸夌被鍨嬫煡鎵炬墍鏈夎妭鐐癸紙鐩存帴妫鏌ヨ妭鐐硅嚜韬殑desc瀛楁锛 +void SearchNodesByType(Tree tree, const char* type, Place* result, int* count) { + if (!tree || !type || !result || !count) return; + TreeNode* queue[100]; + int front = 0, rear = 0; + queue[rear++] = tree; + + while (front < rear) { + TreeNode* temp = queue[front++]; + // 鐩存帴妫鏌ヨ妭鐐硅嚜韬殑绫诲瀷锛坉esc瀛楁锛 + if (temp->data.id > 0 && strcmp(temp->data.desc, type) == 0) { + result[*count] = temp->data; + (*count)++; + } + // 瀛愯妭鐐瑰叆闃 + temp = temp->child; + while (temp) { + queue[rear++] = temp; + temp = temp->sibling; + } + } +} + +// 娣卞害浼樺厛閬嶅巻鏍 +void DFS_Traverse(TreeNode* node, int depth) { + if (!node) return; + for (int i = 0; i < depth; i++) printf(" "); + printf("|-%s锛圛D锛%d锛塡n", node->data.name, node->data.id); + DFS_Traverse(node->child, depth + 1); + DFS_Traverse(node->sibling, depth); +} + +// 灞傛閬嶅巻鏍 +void Level_Traverse(Tree tree) { + if (!tree) return; + TreeNode* queue[100]; + int front = 0, rear = 0; + queue[rear++] = tree; + + while (front < rear) { + TreeNode* temp = queue[front++]; + printf("ID锛%d | 鍚嶇О锛%s | 鍧愭爣锛(%.1f,%.1f) | 绫诲瀷锛%s\n", + temp->data.id, temp->data.name, temp->data.x, temp->data.y, temp->data.desc); + // 瀛愯妭鐐瑰叆闃 + temp = temp->child; + while (temp) { + queue[rear++] = temp; + temp = temp->sibling; + } + } +} + +// 璁$畻涓ょ偣璺濈 +float CalculateDistance(TreeNode* a, TreeNode* b) { + if (!a || !b) return 0.0f; + float dx = a->data.x - b->data.x; + float dy = a->data.y - b->data.y; + return sqrt(dx*dx + dy*dy); +} + +// 鍒濆鍖栨爤 +void InitStack(Stack* stack, int type) { + stack->top = -1; + stack->type = type; + if (type == 0) { + stack->data.nodes = (TreeNode**)malloc(100 * sizeof(TreeNode*)); + } else { + stack->data.ops = (char**)malloc(100 * sizeof(char*)); + } +} + +// 鍏ユ爤 +int PushStack(Stack* stack, void* data) { + if (stack->top >= 99) return -1; + stack->top++; + if (stack->type == 0) { + stack->data.nodes[stack->top] = (TreeNode*)data; + } else { + stack->data.ops[stack->top] = strdup((char*)data); + } + return 0; +} + +// 鍑烘爤 +int PopStack(Stack* stack, void* data) { + if (stack->top < 0) return -1; + if (stack->type == 0) { + *(TreeNode**)data = stack->data.nodes[stack->top]; + } else { + *(char**)data = stack->data.ops[stack->top]; + } + stack->top--; + return 0; +} + +// 閿姣佹爤 +void DestroyStack(Stack* stack) { + if (stack->type == 1) { + for (int i = 0; i <= stack->top; i++) { + free(stack->data.ops[i]); + } + free(stack->data.ops); + } else if (stack->type == 0) { + free(stack->data.nodes); + } + stack->top = -1; +} + +// 甯﹀凡璁块棶鏍囪鐨凞FS璺緞鎼滅储 +int DFS_PathSearch_WithVisited(TreeNode* start, TreeNode* end, Stack* nodeStack, Stack* pathStack, VisitedNode* visited, int maxNodes) { + if (!start || !end) return -1; + + // 妫鏌ユ槸鍚﹀凡璁块棶 + for (int i = 0; i < maxNodes; i++) { + if (visited[i].node == start && visited[i].visited) { + return 0; + } + } + + // 鏍囪涓哄凡璁块棶 + for (int i = 0; i < maxNodes; i++) { + if (visited[i].node == NULL) { + visited[i].node = start; + visited[i].visited = 1; + break; + } + } + + PushStack(nodeStack, start); + PushStack(pathStack, start); + + if (start == end) return 1; + + // 閬嶅巻瀛愯妭鐐 + TreeNode* child = start->child; + while (child) { + if (DFS_PathSearch_WithVisited(child, end, nodeStack, pathStack, visited, maxNodes) == 1) { + return 1; + } + child = child->sibling; + } + + // 閬嶅巻鍏勫紵鑺傜偣 + TreeNode* sibling = start->sibling; + while (sibling) { + if (DFS_PathSearch_WithVisited(sibling, end, nodeStack, pathStack, visited, maxNodes) == 1) { + return 1; + } + sibling = sibling->sibling; + } + + // 鍥炴函鐖惰妭鐐 + if (start->parent != NULL) { + if (DFS_PathSearch_WithVisited(start->parent, end, nodeStack, pathStack, visited, maxNodes) == 1) { + return 1; + } + } + + // 鍥炴函 + for (int i = 0; i < maxNodes; i++) { + if (visited[i].node == start) { + visited[i].visited = 0; + break; + } + } + PopStack(pathStack, &start); + return 0; +} + +// 瀵瑰鏆撮湶鐨凞FS璺緞鎼滅储鎺ュ彛 +int DFS_PathSearch(TreeNode* start, TreeNode* end, Stack* nodeStack, Stack* pathStack) { + VisitedNode visited[20] = {0}; + for (int i = 0; i < 20; i++) { + visited[i].node = NULL; + visited[i].visited = 0; + } + return DFS_PathSearch_WithVisited(start, end, nodeStack, pathStack, visited, 20); +} + +// 閿姣佹爲 +void DestroyTree(Tree* tree) { + if (!*tree) return; + DestroyTree(&((*tree)->child)); + DestroyTree(&((*tree)->sibling)); + free(*tree); + *tree = NULL; +} \ No newline at end of file -- Gitee From b45ed48e13edacb61f3d189eebac89ff958a6df8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=81=92?= <16212856+butter_01@user.noreply.gitee.com> Date: Fri, 21 Nov 2025 13:35:14 +0000 Subject: [PATCH 27/33] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20?= =?UTF-8?q?=E6=A0=A1=E5=9B=AD=E5=AF=BC=E6=B8=B8=E7=B3=BB=E7=BB=9F/compus?= =?UTF-8?q?=5Ftree.c?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../compus_tree.c" | 245 ------------------ 1 file changed, 245 deletions(-) delete mode 100644 "\346\240\241\345\233\255\345\257\274\346\270\270\347\263\273\347\273\237/compus_tree.c" diff --git "a/\346\240\241\345\233\255\345\257\274\346\270\270\347\263\273\347\273\237/compus_tree.c" "b/\346\240\241\345\233\255\345\257\274\346\270\270\347\263\273\347\273\237/compus_tree.c" deleted file mode 100644 index 27173b8..0000000 --- "a/\346\240\241\345\233\255\345\257\274\346\270\270\347\263\273\347\273\237/compus_tree.c" +++ /dev/null @@ -1,245 +0,0 @@ -#include "campus_tree.h" - -// 鍒濆鍖栨爲 -Tree InitTree() { - Tree root = (Tree)malloc(sizeof(TreeNode)); - if (!root) return NULL; - root->data.id = 0; - strcpy(root->data.name, "鏍″洯鎬昏"); - root->data.x = 0.0f; - root->data.y = 0.0f; - strcpy(root->data.desc, "鏍″洯鍦扮偣鏍硅妭鐐"); - strcpy(root->data.openTime, "鍏ㄥぉ"); - root->parent = NULL; - root->child = NULL; - root->sibling = NULL; - root->childCount = 0; - return root; -} - -// 鍒涘缓鏍戣妭鐐 -TreeNode* CreateTreeNode(Place place) { - TreeNode* node = (TreeNode*)malloc(sizeof(TreeNode)); - if (!node) return NULL; - node->data = place; - node->parent = NULL; - node->child = NULL; - node->sibling = NULL; - node->childCount = 0; - return node; -} - -// 涓虹埗鑺傜偣娣诲姞瀛愯妭鐐 -int AddChildNode(TreeNode* parent, Place place) { - if (!parent) return -1; - TreeNode* newNode = CreateTreeNode(place); - if (!newNode) return -2; - newNode->parent = parent; - - if (!parent->child) { - parent->child = newNode; - } else { - TreeNode* temp = parent->child; - while (temp->sibling) temp = temp->sibling; - temp->sibling = newNode; - } - parent->childCount++; - return 0; -} - -// 鎸夊悕绉伴掑綊鏌ユ壘鑺傜偣 -TreeNode* SearchNodeByName(Tree tree, const char* name) { - if (!tree) return NULL; - if (strcmp(tree->data.name, name) == 0) return tree; - TreeNode* find = SearchNodeByName(tree->child, name); - if (find) return find; - return SearchNodeByName(tree->sibling, name); -} - -// 鎸夌被鍨嬫煡鎵炬墍鏈夎妭鐐癸紙鐩存帴妫鏌ヨ妭鐐硅嚜韬殑desc瀛楁锛 -void SearchNodesByType(Tree tree, const char* type, Place* result, int* count) { - if (!tree || !type || !result || !count) return; - TreeNode* queue[100]; - int front = 0, rear = 0; - queue[rear++] = tree; - - while (front < rear) { - TreeNode* temp = queue[front++]; - // 鐩存帴妫鏌ヨ妭鐐硅嚜韬殑绫诲瀷锛坉esc瀛楁锛 - if (temp->data.id > 0 && strcmp(temp->data.desc, type) == 0) { - result[*count] = temp->data; - (*count)++; - } - // 瀛愯妭鐐瑰叆闃 - temp = temp->child; - while (temp) { - queue[rear++] = temp; - temp = temp->sibling; - } - } -} - -// 娣卞害浼樺厛閬嶅巻鏍 -void DFS_Traverse(TreeNode* node, int depth) { - if (!node) return; - for (int i = 0; i < depth; i++) printf(" "); - printf("|-%s锛圛D锛%d锛塡n", node->data.name, node->data.id); - DFS_Traverse(node->child, depth + 1); - DFS_Traverse(node->sibling, depth); -} - -// 灞傛閬嶅巻鏍 -void Level_Traverse(Tree tree) { - if (!tree) return; - TreeNode* queue[100]; - int front = 0, rear = 0; - queue[rear++] = tree; - - while (front < rear) { - TreeNode* temp = queue[front++]; - printf("ID锛%d | 鍚嶇О锛%s | 鍧愭爣锛(%.1f,%.1f) | 绫诲瀷锛%s\n", - temp->data.id, temp->data.name, temp->data.x, temp->data.y, temp->data.desc); - // 瀛愯妭鐐瑰叆闃 - temp = temp->child; - while (temp) { - queue[rear++] = temp; - temp = temp->sibling; - } - } -} - -// 璁$畻涓ょ偣璺濈 -float CalculateDistance(TreeNode* a, TreeNode* b) { - if (!a || !b) return 0.0f; - float dx = a->data.x - b->data.x; - float dy = a->data.y - b->data.y; - return sqrt(dx*dx + dy*dy); -} - -// 鍒濆鍖栨爤 -void InitStack(Stack* stack, int type) { - stack->top = -1; - stack->type = type; - if (type == 0) { - stack->data.nodes = (TreeNode**)malloc(100 * sizeof(TreeNode*)); - } else { - stack->data.ops = (char**)malloc(100 * sizeof(char*)); - } -} - -// 鍏ユ爤 -int PushStack(Stack* stack, void* data) { - if (stack->top >= 99) return -1; - stack->top++; - if (stack->type == 0) { - stack->data.nodes[stack->top] = (TreeNode*)data; - } else { - stack->data.ops[stack->top] = strdup((char*)data); - } - return 0; -} - -// 鍑烘爤 -int PopStack(Stack* stack, void* data) { - if (stack->top < 0) return -1; - if (stack->type == 0) { - *(TreeNode**)data = stack->data.nodes[stack->top]; - } else { - *(char**)data = stack->data.ops[stack->top]; - } - stack->top--; - return 0; -} - -// 閿姣佹爤 -void DestroyStack(Stack* stack) { - if (stack->type == 1) { - for (int i = 0; i <= stack->top; i++) { - free(stack->data.ops[i]); - } - free(stack->data.ops); - } else if (stack->type == 0) { - free(stack->data.nodes); - } - stack->top = -1; -} - -// 甯﹀凡璁块棶鏍囪鐨凞FS璺緞鎼滅储 -int DFS_PathSearch_WithVisited(TreeNode* start, TreeNode* end, Stack* nodeStack, Stack* pathStack, VisitedNode* visited, int maxNodes) { - if (!start || !end) return -1; - - // 妫鏌ユ槸鍚﹀凡璁块棶 - for (int i = 0; i < maxNodes; i++) { - if (visited[i].node == start && visited[i].visited) { - return 0; - } - } - - // 鏍囪涓哄凡璁块棶 - for (int i = 0; i < maxNodes; i++) { - if (visited[i].node == NULL) { - visited[i].node = start; - visited[i].visited = 1; - break; - } - } - - PushStack(nodeStack, start); - PushStack(pathStack, start); - - if (start == end) return 1; - - // 閬嶅巻瀛愯妭鐐 - TreeNode* child = start->child; - while (child) { - if (DFS_PathSearch_WithVisited(child, end, nodeStack, pathStack, visited, maxNodes) == 1) { - return 1; - } - child = child->sibling; - } - - // 閬嶅巻鍏勫紵鑺傜偣 - TreeNode* sibling = start->sibling; - while (sibling) { - if (DFS_PathSearch_WithVisited(sibling, end, nodeStack, pathStack, visited, maxNodes) == 1) { - return 1; - } - sibling = sibling->sibling; - } - - // 鍥炴函鐖惰妭鐐 - if (start->parent != NULL) { - if (DFS_PathSearch_WithVisited(start->parent, end, nodeStack, pathStack, visited, maxNodes) == 1) { - return 1; - } - } - - // 鍥炴函 - for (int i = 0; i < maxNodes; i++) { - if (visited[i].node == start) { - visited[i].visited = 0; - break; - } - } - PopStack(pathStack, &start); - return 0; -} - -// 瀵瑰鏆撮湶鐨凞FS璺緞鎼滅储鎺ュ彛 -int DFS_PathSearch(TreeNode* start, TreeNode* end, Stack* nodeStack, Stack* pathStack) { - VisitedNode visited[20] = {0}; - for (int i = 0; i < 20; i++) { - visited[i].node = NULL; - visited[i].visited = 0; - } - return DFS_PathSearch_WithVisited(start, end, nodeStack, pathStack, visited, 20); -} - -// 閿姣佹爲 -void DestroyTree(Tree* tree) { - if (!*tree) return; - DestroyTree(&((*tree)->child)); - DestroyTree(&((*tree)->sibling)); - free(*tree); - *tree = NULL; -} \ No newline at end of file -- Gitee From 0f20147e3595bc02a8a0bf5ac94832ab63d76fd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=81=92?= <16212856+butter_01@user.noreply.gitee.com> Date: Fri, 21 Nov 2025 13:36:02 +0000 Subject: [PATCH 28/33] =?UTF-8?q?add=20=E6=A0=91=E7=BB=93=E6=9E=84/?= =?UTF-8?q?=E6=A0=91=E7=BB=93=E6=9E=84=20main.c.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 寮犳亽 <16212856+butter_01@user.noreply.gitee.com> --- ...46\240\221\347\273\223\346\236\204 main.c" | 278 ++++++++++++++++++ 1 file changed, 278 insertions(+) create mode 100644 "\346\240\221\347\273\223\346\236\204/\346\240\221\347\273\223\346\236\204 main.c" diff --git "a/\346\240\221\347\273\223\346\236\204/\346\240\221\347\273\223\346\236\204 main.c" "b/\346\240\221\347\273\223\346\236\204/\346\240\221\347\273\223\346\236\204 main.c" new file mode 100644 index 0000000..9b240cc --- /dev/null +++ "b/\346\240\221\347\273\223\346\236\204/\346\240\221\347\273\223\346\236\204 main.c" @@ -0,0 +1,278 @@ +#include "campus_tree.h" + +// -------------------------- 鍓嶅簭閬嶅巻 -------------------------- +void PreOrder_Traverse(TreeNode* node, int depth) { + if (!node) return; + for (int i = 0; i < depth; i++) printf(" "); + printf("|-%s锛圛D锛%d锛岀埗鑺傜偣锛%s锛塡n", + node->data.name, node->data.id, + node->parent ? node->parent->data.name : "鏃"); + PreOrder_Traverse(node->child, depth + 1); + PreOrder_Traverse(node->sibling, depth); +} + +// -------------------------- 娓呯悊杈撳叆缂撳啿鍖 -------------------------- +void clearInputBuffer() { + while (getchar() != '\n'); // 娓呯┖缂撳啿鍖烘畫鐣欑殑瀛楃 +} + +// -------------------------- 浜や簰鍑芥暟 -------------------------- +void PrintMenu() { + printf("\n 鏍″洯瀵兼父绯荤粺 "); + printf("\n======================================"); + printf("\n1. 鏌ョ湅鏍戠粨鏋勶紙鍓嶅簭閬嶅巻锛"); + printf("\n2. 鏌ョ湅鎵鏈夊湴鐐癸紙灞傛閬嶅巻锛"); + printf("\n3. 鎸夊悕绉版煡璇㈠湴鐐"); + printf("\n4. 鎸夌被鍨嬫煡璇㈠湴鐐"); + printf("\n5. 瀵艰埅璺緞瑙勫垝锛堟爲DFS瀹炵幇锛"); + printf("\n6. 鎾ら攢涓婁竴姝ユ搷浣"); + printf("\n7. 閫鍑虹郴缁"); + printf("\n======================================"); + printf("\n璇疯緭鍏ュ姛鑳界紪鍙凤紙1-7锛夛細"); +} + +void InteractiveSearchByName(Tree tree, Stack* opStack) { + char name[50], op[100]; + printf("\n璇疯緭鍏ュ湴鐐瑰悕绉帮細"); + fgets(name, 50, stdin); + name[strcspn(name, "\n")] = '\0'; + + sprintf(op, "鏌ヨ鍦扮偣锛%s", name); + PushStack(opStack, op); + + TreeNode* node = SearchNodeByName(tree, name); + if (node) { + printf("\n銆愭煡璇㈢粨鏋溿慭n"); + printf("鍚嶇О锛%s | ID锛%d\n", node->data.name, node->data.id); + printf("鍧愭爣锛(%.1f, %.1f)\n", node->data.x, node->data.y); + printf("绫诲瀷锛%s\n", node->data.desc); + printf("寮鏀炬椂闂达細%s\n", node->data.openTime); + printf("鐖惰妭鐐癸細%s\n", node->parent->data.name); + } else { + printf("\n鏈壘鍒板湴鐐癸細%s\n", name); + } +} + +void InteractiveSearchByType(Tree tree, Stack* opStack) { + char type[20], op[50]; + printf("\n璇疯緭鍏ュ湴鐐圭被鍨嬶紙濡傛暀瀛︽ゼ銆侀鍫傦級锛"); + fgets(type, 20, stdin); + type[strcspn(type, "\n")] = '\0'; + + sprintf(op, "鏌ヨ绫诲瀷锛%s", type); + PushStack(opStack, op); + + Place result[10]; + int count = 0; + SearchNodesByType(tree, type, result, &count); + if (count > 0) { + printf("\n銆愭煡璇㈢粨鏋溿戝叡%d涓%s锛歕n", count, type); + for (int i = 0; i < count; i++) { + printf("%d. %s | 寮鏀炬椂闂达細%s\n", + i+1, result[i].name, result[i].openTime); + } + } else { + printf("\n鏈壘鍒拌绫诲瀷鍦扮偣\n"); + } +} + +// 鏍慏FS璺緞鎼滅储锛堟敮鎸佹牴鑺傜偣涓浆锛屼换鎰忓湴鐐逛簰閫氾級 +int TreeDFS_PathSearch(TreeNode* start, TreeNode* end, Stack* pathStack, VisitedNode* visited, int maxNodes) { + if (!start || !end) return -1; + + // 妫鏌ュ凡璁块棶 + for (int i = 0; i < maxNodes; i++) { + if (visited[i].node == start && visited[i].visited) return 0; + } + + // 鏍囪璁块棶 + for (int i = 0; i < maxNodes; i++) { + if (visited[i].node == NULL) { + visited[i].node = start; + visited[i].visited = 1; + break; + } + } + + PushStack(pathStack, start); + + // 鎵惧埌缁堢偣 + if (start == end) return 1; + + // 1. 閬嶅巻瀛愯妭鐐 + TreeNode* child = start->child; + while (child) { + if (TreeDFS_PathSearch(child, end, pathStack, visited, maxNodes) == 1) return 1; + child = child->sibling; + } + + // 2. 閬嶅巻鍏勫紵鑺傜偣 + TreeNode* sibling = start->sibling; + while (sibling) { + if (TreeDFS_PathSearch(sibling, end, pathStack, visited, maxNodes) == 1) return 1; + sibling = sibling->sibling; + } + + // 3. 鍥炴函鍒扮埗鑺傜偣锛堝叧閿細閫氳繃鏍硅妭鐐逛腑杞級 + if (start->parent != NULL) { + if (TreeDFS_PathSearch(start->parent, end, pathStack, visited, maxNodes) == 1) return 1; + } + + // 鍥炴函 + PopStack(pathStack, &start); + for (int i = 0; i < maxNodes; i++) { + if (visited[i].node == start) visited[i].visited = 0; + } + return 0; +} + +void InteractiveNavigation(Tree tree, Stack* nodeStack, Stack* opStack) { + char startName[50], endName[50], op[200]; + printf("\n璇疯緭鍏ヨ捣鐐癸細"); + fgets(startName, 50, stdin); + startName[strcspn(startName, "\n")] = '\0'; + + printf("璇疯緭鍏ョ粓鐐癸細"); + fgets(endName, 50, stdin); + endName[strcspn(endName, "\n")] = '\0'; + + snprintf(op, sizeof(op), "瀵艰埅锛%s -> %s", startName, endName); + PushStack(opStack, op); + + TreeNode* start = SearchNodeByName(tree, startName); + TreeNode* end = SearchNodeByName(tree, endName); + if (!start || !end) { + printf("\n璧风偣鎴栫粓鐐逛笉瀛樺湪锛乗n"); + return; + } + + Stack pathStack; + InitStack(&pathStack, 0); + Stack tempStack; + InitStack(&tempStack, 0); + VisitedNode visited[20] = {0}; + + // 璋冪敤鏍慏FS鎼滅储 + if (TreeDFS_PathSearch(start, end, &pathStack, visited, 20) == 1) { + printf("\n鏈浼樿矾寰勶紙绾爲DFS鐢熸垚锛夛細\n"); + float totalDist = 0.0f; + TreeNode* prev = NULL; + TreeNode* node; + int idx = 1; + + // 鍙嶈浆璺緞骞惰繃婊ゆ牴鑺傜偣 + while (PopStack(&pathStack, &node) == 0) { + if (strcmp(node->data.name, "鏍″洯鎬昏") != 0) { + PushStack(&tempStack, node); + } + } + + // 杈撳嚭璺緞 + while (PopStack(&tempStack, &node) == 0) { + printf("%d. %s", idx++, node->data.name); + if (prev != NULL) { + float dist = CalculateDistance(prev, node); + totalDist += dist; + printf("锛堣窛绂诲墠涓绔欙細%.1f绫筹級", dist); + } + printf("\n"); + prev = node; + } + + // 姝ヨ鏃堕棿淇濆簳1鍒嗛挓 + float walkTime = totalDist / 80.0f; + walkTime = walkTime < 1.0f ? 1.0f : walkTime; + printf("\n鎬昏窛绂伙細%.1f绫 | 棰勪及姝ヨ鏃堕棿锛%.0f鍒嗛挓\n", totalDist, walkTime); + } else { + printf("\n鏈壘鍒板彲琛岃矾寰勶紒\n"); + } + + DestroyStack(&pathStack); + DestroyStack(&tempStack); +} + +// 鎾ら攢鍔熻兘瀹炵幇 +void InteractiveUndo(Stack* opStack) { + if (opStack->top == -1) { + printf("\n鏆傛棤鎿嶄綔鍙挙閿\n"); + return; + } + char* lastOp; + if (PopStack(opStack, &lastOp) == 0) { + printf("\n宸叉挙閿鎿嶄綔锛%s\n", lastOp); + free(lastOp); + } else { + printf("\n鎾ら攢澶辫触\n"); + } +} + +// -------------------------- 4. main鍑芥暟 -------------------------- +int main() { + Tree campusTree = InitTree(); + Stack opStack; + InitStack(&opStack, 1); + Stack nodeStack; + InitStack(&nodeStack, 0); + + // 鏍″洯鍦扮偣鏁版嵁锛坉esc瀛楁瀛樺偍绫诲瀷锛 + Place places[] = { + {1, "澶ф垚妤糄", 10.0f, 20.0f, "鏁欏妤", "6:00-23:00"}, + {2, "闀块妤糃", 15.0f, 25.0f, "鏁欏妤", "6:00-23:00"}, + {3, "涓椋熷爞", 5.0f, 30.0f, "椋熷爞", "5:00-21:00"}, + {4, "浜旈鍫", 20.0f, 10.0f, "椋熷爞", "5:00-21:00"}, + {5, "鍥句功棣", 12.0f, 15.0f, "鍥句功棣", "6:00-23:00"}, + {6, "鏍¢棬", 0.0f, 0.0f, "鍏朵粬", "鍏ㄥぉ"}, + {7, "鎿嶅満", 18.0f, 35.0f, "鍏朵粬", "6:00-22:00"}, + {8, "鏌氬瓙鏋", 4.0f, 32.0f, "椋熷爞", "5:00-21:00"}, + {9, "灏忓悆琛", 3.0f, 5.0f, "鍏朵粬", "鍏ㄥぉ"}, + {10, "瀹胯垗1鍖", 65.0f, 35.0f, "鍏朵粬", "6:00-23:00"} + }; + + // 鏍戠粨鏋勶細鎵鏈夊湴鐐逛綔涓烘牴鑺傜偣鐨勫瓙鑺傜偣锛堝厔寮熷叧绯伙級 + int placeCount = sizeof(places) / sizeof(Place); + for (int i = 0; i < placeCount; i++) { + AddChildNode(campusTree, places[i]); + } + + // 涓诲惊鐜 + int choice; + while (1) { + PrintMenu(); + while (scanf("%d", &choice) != 1) { + clearInputBuffer(); + printf("\n璇疯緭鍏ユ湁鏁堢殑鏁板瓧缂栧彿锛1-7锛夛細"); + } + clearInputBuffer(); + + switch (choice) { + case 1: + printf("\n銆愭爲缁撴瀯锛堝墠搴忛亶鍘嗭級銆慭n"); + PreOrder_Traverse(campusTree, 0); + break; + case 2: + printf("\n銆愭墍鏈夊湴鐐癸紙灞傛閬嶅巻锛夈慭n"); + Level_Traverse(campusTree); + break; + case 3: + InteractiveSearchByName(campusTree, &opStack); + break; + case 4: + InteractiveSearchByType(campusTree, &opStack); + break; + case 5: + InteractiveNavigation(campusTree, &nodeStack, &opStack); + break; + case 6: + InteractiveUndo(&opStack); + break; + case 7: + printf("\n鎰熻阿浣跨敤锛屽啀瑙侊紒\n"); + DestroyTree(&campusTree); + DestroyStack(&opStack); + DestroyStack(&nodeStack); + return 0; + default: + printf("\n杈撳叆閿欒锛岃閲嶆柊閫夋嫨锛乗n"); + } + } +} \ No newline at end of file -- Gitee From f242fe7f728dc6e7553194a462b8ba58e9887ce7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=81=92?= <16212856+butter_01@user.noreply.gitee.com> Date: Fri, 21 Nov 2025 13:36:11 +0000 Subject: [PATCH 29/33] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20?= =?UTF-8?q?=E6=A0=A1=E5=9B=AD=E5=AF=BC=E6=B8=B8=E7=B3=BB=E7=BB=9F/?= =?UTF-8?q?=E6=A0=91=E7=BB=93=E6=9E=84=20main.c?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...46\240\221\347\273\223\346\236\204 main.c" | 278 ------------------ 1 file changed, 278 deletions(-) delete mode 100644 "\346\240\241\345\233\255\345\257\274\346\270\270\347\263\273\347\273\237/\346\240\221\347\273\223\346\236\204 main.c" diff --git "a/\346\240\241\345\233\255\345\257\274\346\270\270\347\263\273\347\273\237/\346\240\221\347\273\223\346\236\204 main.c" "b/\346\240\241\345\233\255\345\257\274\346\270\270\347\263\273\347\273\237/\346\240\221\347\273\223\346\236\204 main.c" deleted file mode 100644 index 9b240cc..0000000 --- "a/\346\240\241\345\233\255\345\257\274\346\270\270\347\263\273\347\273\237/\346\240\221\347\273\223\346\236\204 main.c" +++ /dev/null @@ -1,278 +0,0 @@ -#include "campus_tree.h" - -// -------------------------- 鍓嶅簭閬嶅巻 -------------------------- -void PreOrder_Traverse(TreeNode* node, int depth) { - if (!node) return; - for (int i = 0; i < depth; i++) printf(" "); - printf("|-%s锛圛D锛%d锛岀埗鑺傜偣锛%s锛塡n", - node->data.name, node->data.id, - node->parent ? node->parent->data.name : "鏃"); - PreOrder_Traverse(node->child, depth + 1); - PreOrder_Traverse(node->sibling, depth); -} - -// -------------------------- 娓呯悊杈撳叆缂撳啿鍖 -------------------------- -void clearInputBuffer() { - while (getchar() != '\n'); // 娓呯┖缂撳啿鍖烘畫鐣欑殑瀛楃 -} - -// -------------------------- 浜や簰鍑芥暟 -------------------------- -void PrintMenu() { - printf("\n 鏍″洯瀵兼父绯荤粺 "); - printf("\n======================================"); - printf("\n1. 鏌ョ湅鏍戠粨鏋勶紙鍓嶅簭閬嶅巻锛"); - printf("\n2. 鏌ョ湅鎵鏈夊湴鐐癸紙灞傛閬嶅巻锛"); - printf("\n3. 鎸夊悕绉版煡璇㈠湴鐐"); - printf("\n4. 鎸夌被鍨嬫煡璇㈠湴鐐"); - printf("\n5. 瀵艰埅璺緞瑙勫垝锛堟爲DFS瀹炵幇锛"); - printf("\n6. 鎾ら攢涓婁竴姝ユ搷浣"); - printf("\n7. 閫鍑虹郴缁"); - printf("\n======================================"); - printf("\n璇疯緭鍏ュ姛鑳界紪鍙凤紙1-7锛夛細"); -} - -void InteractiveSearchByName(Tree tree, Stack* opStack) { - char name[50], op[100]; - printf("\n璇疯緭鍏ュ湴鐐瑰悕绉帮細"); - fgets(name, 50, stdin); - name[strcspn(name, "\n")] = '\0'; - - sprintf(op, "鏌ヨ鍦扮偣锛%s", name); - PushStack(opStack, op); - - TreeNode* node = SearchNodeByName(tree, name); - if (node) { - printf("\n銆愭煡璇㈢粨鏋溿慭n"); - printf("鍚嶇О锛%s | ID锛%d\n", node->data.name, node->data.id); - printf("鍧愭爣锛(%.1f, %.1f)\n", node->data.x, node->data.y); - printf("绫诲瀷锛%s\n", node->data.desc); - printf("寮鏀炬椂闂达細%s\n", node->data.openTime); - printf("鐖惰妭鐐癸細%s\n", node->parent->data.name); - } else { - printf("\n鏈壘鍒板湴鐐癸細%s\n", name); - } -} - -void InteractiveSearchByType(Tree tree, Stack* opStack) { - char type[20], op[50]; - printf("\n璇疯緭鍏ュ湴鐐圭被鍨嬶紙濡傛暀瀛︽ゼ銆侀鍫傦級锛"); - fgets(type, 20, stdin); - type[strcspn(type, "\n")] = '\0'; - - sprintf(op, "鏌ヨ绫诲瀷锛%s", type); - PushStack(opStack, op); - - Place result[10]; - int count = 0; - SearchNodesByType(tree, type, result, &count); - if (count > 0) { - printf("\n銆愭煡璇㈢粨鏋溿戝叡%d涓%s锛歕n", count, type); - for (int i = 0; i < count; i++) { - printf("%d. %s | 寮鏀炬椂闂达細%s\n", - i+1, result[i].name, result[i].openTime); - } - } else { - printf("\n鏈壘鍒拌绫诲瀷鍦扮偣\n"); - } -} - -// 鏍慏FS璺緞鎼滅储锛堟敮鎸佹牴鑺傜偣涓浆锛屼换鎰忓湴鐐逛簰閫氾級 -int TreeDFS_PathSearch(TreeNode* start, TreeNode* end, Stack* pathStack, VisitedNode* visited, int maxNodes) { - if (!start || !end) return -1; - - // 妫鏌ュ凡璁块棶 - for (int i = 0; i < maxNodes; i++) { - if (visited[i].node == start && visited[i].visited) return 0; - } - - // 鏍囪璁块棶 - for (int i = 0; i < maxNodes; i++) { - if (visited[i].node == NULL) { - visited[i].node = start; - visited[i].visited = 1; - break; - } - } - - PushStack(pathStack, start); - - // 鎵惧埌缁堢偣 - if (start == end) return 1; - - // 1. 閬嶅巻瀛愯妭鐐 - TreeNode* child = start->child; - while (child) { - if (TreeDFS_PathSearch(child, end, pathStack, visited, maxNodes) == 1) return 1; - child = child->sibling; - } - - // 2. 閬嶅巻鍏勫紵鑺傜偣 - TreeNode* sibling = start->sibling; - while (sibling) { - if (TreeDFS_PathSearch(sibling, end, pathStack, visited, maxNodes) == 1) return 1; - sibling = sibling->sibling; - } - - // 3. 鍥炴函鍒扮埗鑺傜偣锛堝叧閿細閫氳繃鏍硅妭鐐逛腑杞級 - if (start->parent != NULL) { - if (TreeDFS_PathSearch(start->parent, end, pathStack, visited, maxNodes) == 1) return 1; - } - - // 鍥炴函 - PopStack(pathStack, &start); - for (int i = 0; i < maxNodes; i++) { - if (visited[i].node == start) visited[i].visited = 0; - } - return 0; -} - -void InteractiveNavigation(Tree tree, Stack* nodeStack, Stack* opStack) { - char startName[50], endName[50], op[200]; - printf("\n璇疯緭鍏ヨ捣鐐癸細"); - fgets(startName, 50, stdin); - startName[strcspn(startName, "\n")] = '\0'; - - printf("璇疯緭鍏ョ粓鐐癸細"); - fgets(endName, 50, stdin); - endName[strcspn(endName, "\n")] = '\0'; - - snprintf(op, sizeof(op), "瀵艰埅锛%s -> %s", startName, endName); - PushStack(opStack, op); - - TreeNode* start = SearchNodeByName(tree, startName); - TreeNode* end = SearchNodeByName(tree, endName); - if (!start || !end) { - printf("\n璧风偣鎴栫粓鐐逛笉瀛樺湪锛乗n"); - return; - } - - Stack pathStack; - InitStack(&pathStack, 0); - Stack tempStack; - InitStack(&tempStack, 0); - VisitedNode visited[20] = {0}; - - // 璋冪敤鏍慏FS鎼滅储 - if (TreeDFS_PathSearch(start, end, &pathStack, visited, 20) == 1) { - printf("\n鏈浼樿矾寰勶紙绾爲DFS鐢熸垚锛夛細\n"); - float totalDist = 0.0f; - TreeNode* prev = NULL; - TreeNode* node; - int idx = 1; - - // 鍙嶈浆璺緞骞惰繃婊ゆ牴鑺傜偣 - while (PopStack(&pathStack, &node) == 0) { - if (strcmp(node->data.name, "鏍″洯鎬昏") != 0) { - PushStack(&tempStack, node); - } - } - - // 杈撳嚭璺緞 - while (PopStack(&tempStack, &node) == 0) { - printf("%d. %s", idx++, node->data.name); - if (prev != NULL) { - float dist = CalculateDistance(prev, node); - totalDist += dist; - printf("锛堣窛绂诲墠涓绔欙細%.1f绫筹級", dist); - } - printf("\n"); - prev = node; - } - - // 姝ヨ鏃堕棿淇濆簳1鍒嗛挓 - float walkTime = totalDist / 80.0f; - walkTime = walkTime < 1.0f ? 1.0f : walkTime; - printf("\n鎬昏窛绂伙細%.1f绫 | 棰勪及姝ヨ鏃堕棿锛%.0f鍒嗛挓\n", totalDist, walkTime); - } else { - printf("\n鏈壘鍒板彲琛岃矾寰勶紒\n"); - } - - DestroyStack(&pathStack); - DestroyStack(&tempStack); -} - -// 鎾ら攢鍔熻兘瀹炵幇 -void InteractiveUndo(Stack* opStack) { - if (opStack->top == -1) { - printf("\n鏆傛棤鎿嶄綔鍙挙閿\n"); - return; - } - char* lastOp; - if (PopStack(opStack, &lastOp) == 0) { - printf("\n宸叉挙閿鎿嶄綔锛%s\n", lastOp); - free(lastOp); - } else { - printf("\n鎾ら攢澶辫触\n"); - } -} - -// -------------------------- 4. main鍑芥暟 -------------------------- -int main() { - Tree campusTree = InitTree(); - Stack opStack; - InitStack(&opStack, 1); - Stack nodeStack; - InitStack(&nodeStack, 0); - - // 鏍″洯鍦扮偣鏁版嵁锛坉esc瀛楁瀛樺偍绫诲瀷锛 - Place places[] = { - {1, "澶ф垚妤糄", 10.0f, 20.0f, "鏁欏妤", "6:00-23:00"}, - {2, "闀块妤糃", 15.0f, 25.0f, "鏁欏妤", "6:00-23:00"}, - {3, "涓椋熷爞", 5.0f, 30.0f, "椋熷爞", "5:00-21:00"}, - {4, "浜旈鍫", 20.0f, 10.0f, "椋熷爞", "5:00-21:00"}, - {5, "鍥句功棣", 12.0f, 15.0f, "鍥句功棣", "6:00-23:00"}, - {6, "鏍¢棬", 0.0f, 0.0f, "鍏朵粬", "鍏ㄥぉ"}, - {7, "鎿嶅満", 18.0f, 35.0f, "鍏朵粬", "6:00-22:00"}, - {8, "鏌氬瓙鏋", 4.0f, 32.0f, "椋熷爞", "5:00-21:00"}, - {9, "灏忓悆琛", 3.0f, 5.0f, "鍏朵粬", "鍏ㄥぉ"}, - {10, "瀹胯垗1鍖", 65.0f, 35.0f, "鍏朵粬", "6:00-23:00"} - }; - - // 鏍戠粨鏋勶細鎵鏈夊湴鐐逛綔涓烘牴鑺傜偣鐨勫瓙鑺傜偣锛堝厔寮熷叧绯伙級 - int placeCount = sizeof(places) / sizeof(Place); - for (int i = 0; i < placeCount; i++) { - AddChildNode(campusTree, places[i]); - } - - // 涓诲惊鐜 - int choice; - while (1) { - PrintMenu(); - while (scanf("%d", &choice) != 1) { - clearInputBuffer(); - printf("\n璇疯緭鍏ユ湁鏁堢殑鏁板瓧缂栧彿锛1-7锛夛細"); - } - clearInputBuffer(); - - switch (choice) { - case 1: - printf("\n銆愭爲缁撴瀯锛堝墠搴忛亶鍘嗭級銆慭n"); - PreOrder_Traverse(campusTree, 0); - break; - case 2: - printf("\n銆愭墍鏈夊湴鐐癸紙灞傛閬嶅巻锛夈慭n"); - Level_Traverse(campusTree); - break; - case 3: - InteractiveSearchByName(campusTree, &opStack); - break; - case 4: - InteractiveSearchByType(campusTree, &opStack); - break; - case 5: - InteractiveNavigation(campusTree, &nodeStack, &opStack); - break; - case 6: - InteractiveUndo(&opStack); - break; - case 7: - printf("\n鎰熻阿浣跨敤锛屽啀瑙侊紒\n"); - DestroyTree(&campusTree); - DestroyStack(&opStack); - DestroyStack(&nodeStack); - return 0; - default: - printf("\n杈撳叆閿欒锛岃閲嶆柊閫夋嫨锛乗n"); - } - } -} \ No newline at end of file -- Gitee From 816c772a8dd48c29572d423a2866800a8ae674f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=93=8D?= <16216866+xiang-zi-li@user.noreply.gitee.com> Date: Wed, 26 Nov 2025 13:47:00 +0000 Subject: [PATCH 30/33] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20?= =?UTF-8?q?=E6=A0=A1=E5=9B=AD=E5=AF=BC=E6=B8=B8=E7=B3=BB=E7=BB=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../.keep" | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 "\346\240\241\345\233\255\345\257\274\346\270\270\347\263\273\347\273\237/.keep" diff --git "a/\346\240\241\345\233\255\345\257\274\346\270\270\347\263\273\347\273\237/.keep" "b/\346\240\241\345\233\255\345\257\274\346\270\270\347\263\273\347\273\237/.keep" deleted file mode 100644 index e69de29..0000000 -- Gitee From a6fca299ed5adcb9424c80f20af112421a13104e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=93=8D?= <16216866+xiang-zi-li@user.noreply.gitee.com> Date: Wed, 26 Nov 2025 14:39:11 +0000 Subject: [PATCH 31/33] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20?= =?UTF-8?q?=E5=9B=BE=E7=BB=93=E6=9E=84/campus=5Fguide.h?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../campus_guide.h" | 80 ------------------- 1 file changed, 80 deletions(-) delete mode 100644 "\345\233\276\347\273\223\346\236\204/campus_guide.h" diff --git "a/\345\233\276\347\273\223\346\236\204/campus_guide.h" "b/\345\233\276\347\273\223\346\236\204/campus_guide.h" deleted file mode 100644 index 103fca5..0000000 --- "a/\345\233\276\347\273\223\346\236\204/campus_guide.h" +++ /dev/null @@ -1,80 +0,0 @@ -#ifndef CAMPUS_GUIDE_H -#define CAMPUS_GUIDE_H - -#include -#include -#include -#include -#include - -// 甯搁噺瀹氫箟 -#define MAX_PLACE 30 // 鏈澶у湴鐐规暟閲 -#define MAX_HISTORY 10 // 鏈澶у巻鍙茶褰曟暟 -#define MAX_PATH 50 // 鏈澶ц矾寰勯暱搴 -#define MAX_OPERATIONS 20 // 鏈澶ф搷浣滆褰曟暟 -#define WALK_SPEED 80.0 // 姝ヨ閫熷害锛堢背/鍒嗛挓锛 - -// 鍦扮偣缁撴瀯浣 -typedef struct { - int id; // 鍦扮偣ID - char name[50]; // 鍦扮偣鍚嶇О - float x, y; // 鍧愭爣 - char description[200];// 鍔熻兘鎻忚堪 -} Place; - -// 鍘嗗彶璁板綍缁撴瀯浣 -typedef struct { - time_t queryTime; // 鏌ヨ鏃堕棿 - int startId; // 璧风偣ID - int endId; // 缁堢偣ID - int path[MAX_PATH]; // 璺緞 - int pathLen; // 璺緞闀垮害 - float distance; // 鎬昏窛绂 -} History; - -// 椤哄簭琛ㄥ瓨鍌ㄥ湴鐐 -typedef struct { - Place data[MAX_PLACE]; - int length; -} PlaceList; - -// 椤哄簭琛ㄥ瓨鍌ㄥ巻鍙茶褰 -typedef struct { - History data[MAX_HISTORY]; - int length; -} HistoryList; - -// 鏍堢粨鏋勶紙鐢ㄤ簬鎿嶄綔鎾ら攢锛 -typedef struct { - int data[MAX_OPERATIONS]; - int top; -} Stack; - -// 鍥剧殑閭绘帴鐭╅樀琛ㄧず -typedef struct { - float edges[MAX_PLACE][MAX_PLACE]; // 杈圭殑鏉冮噸锛堣窛绂伙級锛-1琛ㄧず鏃犵洿鎺ヨ矾寰 - int n; // 椤剁偣鏁 -} Graph; - -// 鍏ㄥ眬鍙橀噺澹版槑 -extern PlaceList placeList; -extern HistoryList historyList; -extern Graph graph; -extern Stack operationStack; - -// 鍑芥暟澹版槑锛堜笌婧愭枃浠跺疄鐜板畬鍏ㄥ悓姝ワ級 -void initAll(); -void push(Stack *s, int value); -int pop(Stack *s); -void addPlace(const char *name, float x, float y, const char *desc); -Place* queryPlace(const char *name); -int getPlaceIdByName(const char *name); -float dijkstra(int start, int end, int *path, int *pathLen); -float findShortestPath(int start, int end, int *path, int *pathLen); -void showPath(int *path, int len, float dist); -void showHistory(); -void undoOperation(); -void initSampleData(); -void showMenu(); - -#endif \ No newline at end of file -- Gitee From 2d2807e43bf254d715a0b24f7ca82fe62d0526f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=93=8D?= <16216866+xiang-zi-li@user.noreply.gitee.com> Date: Wed, 26 Nov 2025 14:39:40 +0000 Subject: [PATCH 32/33] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20?= =?UTF-8?q?=E5=9B=BE=E7=BB=93=E6=9E=84/campus=5Fguide.c?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../campus_guide.c" | 390 ------------------ 1 file changed, 390 deletions(-) delete mode 100644 "\345\233\276\347\273\223\346\236\204/campus_guide.c" diff --git "a/\345\233\276\347\273\223\346\236\204/campus_guide.c" "b/\345\233\276\347\273\223\346\236\204/campus_guide.c" deleted file mode 100644 index eea9ad4..0000000 --- "a/\345\233\276\347\273\223\346\236\204/campus_guide.c" +++ /dev/null @@ -1,390 +0,0 @@ -#include "campus_guide.h" - -// 鍏ㄥ眬鍙橀噺瀹氫箟 -PlaceList placeList; -HistoryList historyList; -Graph graph; -Stack operationStack; - -// 鍒濆鍖栨墍鏈夋暟鎹粨鏋 -void initAll() { - placeList.length = 0; - memset(placeList.data, 0, sizeof(placeList.data)); - - historyList.length = 0; - memset(historyList.data, 0, sizeof(historyList.data)); - - graph.n = 0; - for (int i = 0; i < MAX_PLACE; i++) { - for (int j = 0; j < MAX_PLACE; j++) { - graph.edges[i][j] = (i == j) ? 0 : -1; - } - } - - operationStack.top = -1; - memset(operationStack.data, 0, sizeof(operationStack.data)); -} - -// 鏍堝叆鏍堟搷浣 -void push(Stack *s, int value) { - if (s->top < MAX_OPERATIONS - 1) { - s->data[++s->top] = value; - } -} - -// 鏍堝嚭鏍堟搷浣 -int pop(Stack *s) { - if (s->top >= 0) { - return s->data[s->top--]; - } - return -1; -} - -// 娣诲姞鍦扮偣锛堣嚜鍔ㄥ垎閰岻D锛屼慨澶嶅瓧绗︿覆缁堟绗︼級 -void addPlace(const char *name, float x, float y, const char *desc) { - if (placeList.length >= MAX_PLACE) { - printf("鍦扮偣鏁伴噺宸茶揪涓婇檺锛乗n"); - return; - } - - int id = placeList.length; - Place p; - p.id = id; - // 瀹夊叏鎷疯礉瀛楃涓插苟娣诲姞缁堟绗 - strncpy(p.name, name, sizeof(p.name)-1); - p.name[sizeof(p.name)-1] = '\0'; - p.x = x; - p.y = y; - strncpy(p.description, desc, sizeof(p.description)-1); - p.description[sizeof(p.description)-1] = '\0'; - - placeList.data[id] = p; - placeList.length++; - graph.n++; - - // 璁$畻涓庡凡鏈夊湴鐐圭殑璺濈骞舵坊鍔犺竟 - for (int i = 0; i < id; i++) { - float dx = x - placeList.data[i].x; - float dy = y - placeList.data[i].y; - float dist = sqrt(dx*dx + dy*dy); - graph.edges[id][i] = dist; - graph.edges[i][id] = dist; - } - - push(&operationStack, id); // 璁板綍鎿嶄綔ID -} - -// 鏍规嵁鍚嶇О鏌ヨ鍦扮偣 -Place* queryPlace(const char *name) { - for (int i = 0; i < placeList.length; i++) { - if (strcmp(placeList.data[i].name, name) == 0) { - return &placeList.data[i]; - } - } - return NULL; -} - -// 鏍规嵁鍚嶇О鑾峰彇鍦扮偣ID -int getPlaceIdByName(const char *name) { - Place *p = queryPlace(name); - return (p != NULL) ? p->id : -1; -} - -// Dijkstra鏈鐭矾寰勭畻娉曪紙鏍稿績瀹炵幇锛 -float dijkstra(int start, int end, int *path, int *pathLen) { - float dist[MAX_PLACE]; - int visited[MAX_PLACE] = {0}; - int pre[MAX_PLACE]; - int n = graph.n; - - // 鍒濆鍖栬窛绂绘暟缁勫拰鍓嶉┍鏁扮粍 - for (int i = 0; i < n; i++) { - dist[i] = (graph.edges[start][i] > 0) ? graph.edges[start][i] : 1e9; - pre[i] = (dist[i] != 1e9) ? start : -1; - } - dist[start] = 0; - visited[start] = 1; - - // 杩唬鏌ユ壘鏈鐭矾寰 - for (int i = 1; i < n; i++) { - float minDist = 1e9; - int u = -1; - // 鎵惧埌鏈闂妭鐐逛腑璺濈鏈灏忕殑 - for (int j = 0; j < n; j++) { - if (!visited[j] && dist[j] < minDist) { - minDist = dist[j]; - u = j; - } - } - if (u == -1) break; // 鏃犲彲杈捐矾寰 - visited[u] = 1; - - // 鏉惧紱鎿嶄綔 - for (int v = 0; v < n; v++) { - if (!visited[v] && graph.edges[u][v] > 0 - && dist[v] > dist[u] + graph.edges[u][v]) { - dist[v] = dist[u] + graph.edges[u][v]; - pre[v] = u; - } - } - } - - if (dist[end] == 1e9) return -1; // 鏃犺矾寰 - - // 鍥炴函鏋勫缓璺緞 - int tempPath[MAX_PATH]; - int len = 0; - int curr = end; - while (curr != -1) { - tempPath[len++] = curr; - curr = pre[curr]; - } - - // 鍙嶈浆璺緞锛堜粠璧风偣鍒扮粓鐐癸級 - *pathLen = len; - for (int i = 0; i < len; i++) { - path[i] = tempPath[len - 1 - i]; - } - - return dist[end]; -} - -// 鏌ユ壘鏈鐭矾寰勫苟淇濆瓨鍘嗗彶璁板綍锛堜慨澶嶅巻鍙茶褰曡鐩栭昏緫锛 -float findShortestPath(int start, int end, int *path, int *pathLen) { - float totalDist = dijkstra(start, end, path, pathLen); - if (totalDist < 0) return -1; - - History h; - h.queryTime = time(NULL); - h.startId = start; - h.endId = end; - h.pathLen = *pathLen; - h.distance = totalDist; - memcpy(h.path, path, *pathLen * sizeof(int)); - - // 鍘嗗彶璁板綍婊℃椂鍒犻櫎鏈鏃х殑锛屾湭婊℃椂鍚戝悗绉讳綅 - if (historyList.length >= MAX_HISTORY) { - for (int i = MAX_HISTORY - 1; i > 0; i--) { - historyList.data[i] = historyList.data[i - 1]; - } - } else { - for (int i = historyList.length; i > 0; i--) { - historyList.data[i] = historyList.data[i - 1]; - } - historyList.length++; - } - historyList.data[0] = h; // 鏂拌褰曟彃鍏ュご閮 - - return totalDist; -} - -// 鏄剧ず璺緞璇︽儏 -void showPath(int *path, int len, float dist) { - printf("鏈鐭矾寰勶細\n"); - for (int i = 0; i < len; i++) { - printf("%s", placeList.data[path[i]].name); - if (i < len - 1) printf(" -> "); - } - printf("\n鎬昏窛绂伙細%.2f绫 棰勮姝ヨ鏃堕棿锛%.0f鍒嗛挓\n", - dist, dist / WALK_SPEED); -} - -// 鏄剧ず鍘嗗彶璁板綍 -void showHistory() { - if (historyList.length == 0) { - printf("鏃犲巻鍙茶褰曪紒\n"); - return; - } - - printf("鍘嗗彶瀵艰埅璁板綍锛歕n"); - for (int i = 0; i < historyList.length; i++) { - History *h = &historyList.data[i]; - char timeStr[20]; - strftime(timeStr, sizeof(timeStr), "%Y-%m-%d %H:%M", localtime(&h->queryTime)); - - char *startName = placeList.data[h->startId].name; - char *endName = placeList.data[h->endId].name; - - printf("%d. %s 浠%s鍒%s 璺濈锛%.2f绫砛n", - i+1, timeStr, startName, endName, h->distance); - } -} - -// 鎾ら攢鎿嶄綔锛堟柊澧烇細鍘嗗彶璁板綍鍚屾娓呯悊閫昏緫锛 -void undoOperation() { - int opId = pop(&operationStack); - if (opId == -1) { - printf("鏃犳搷浣滃彲鎾ら攢锛乗n"); - return; - } - - // 鍏堜繚瀛樿鎾ら攢鍦扮偣鐨勫悕绉 - char deletedName[50]; - strncpy(deletedName, placeList.data[opId].name, sizeof(deletedName)-1); - deletedName[sizeof(deletedName)-1] = '\0'; - - // 娓呯悊鍥句腑璇ュ湴鐐圭殑鎵鏈夎竟 - for (int i = 0; i < MAX_PLACE; i++) { - graph.edges[opId][i] = -1; - graph.edges[i][opId] = -1; - } - - // 浠庡湴鐐瑰垪琛ㄤ腑鍒犻櫎锛屽悗缁湴鐐笽D绉讳綅骞跺悓姝ユ洿鏂板浘鐨勮竟 - for (int i = opId; i < placeList.length - 1; i++) { - // 鍦扮偣鏁版嵁绉讳綅 - placeList.data[i] = placeList.data[i+1]; - placeList.data[i].id = i; // 鏇存柊ID涓烘柊绱㈠紩 - - // 鍚屾鏇存柊鍥句腑璇ュ湴鐐逛笌鍏朵粬鑺傜偣鐨勮竟 - for (int j = 0; j < MAX_PLACE; j++) { - if (graph.edges[i+1][j] != -1) { - graph.edges[i][j] = graph.edges[i+1][j]; - graph.edges[j][i] = graph.edges[j][i+1]; - graph.edges[i+1][j] = -1; - graph.edges[j][i+1] = -1; - } - } - } - placeList.length--; - graph.n--; - - // 鏍稿績浼樺寲锛氭竻鐞嗗寘鍚鎾ら攢鍦扮偣ID鐨勫巻鍙茶褰 - int cleanCount = 0; - for (int i = 0; i < historyList.length; i++) { - History *h = &historyList.data[i]; - // 妫鏌ュ巻鍙茶褰曠殑璧风偣銆佺粓鐐规垨璺緞涓槸鍚﹀寘鍚鎾ら攢鐨処D - int hasDeletedId = (h->startId == opId) || (h->endId == opId); - if (!hasDeletedId) { - for (int j = 0; j < h->pathLen; j++) { - if (h->path[j] == opId) { - hasDeletedId = 1; - break; - } - } - } - - if (hasDeletedId) { - // 鍒犻櫎璇ュ巻鍙茶褰曪紝鍚庣画璁板綍鍚戝墠绉讳綅 - for (int j = i; j < historyList.length - 1; j++) { - historyList.data[j] = historyList.data[j+1]; - } - historyList.length--; - cleanCount++; - i--; // 绉讳綅鍚庨噸鏂版鏌ュ綋鍓嶇储寮 - } - } - - // 杈撳嚭鎾ら攢缁撴灉 - printf("宸叉挙閿娣诲姞鍦扮偣锛堝悕绉帮細%s锛塡n", deletedName); - if (cleanCount > 0) { - printf("宸插悓姝ユ竻鐞嗗寘鍚鍦扮偣鐨%d鏉″巻鍙插鑸褰昞n", cleanCount); - } -} - -// 鍒濆鍖栫ず渚嬫暟鎹 -void initSampleData() { - addPlace("鏍¢棬", 0, 0, "鏍″洯涓诲叆鍙o紝24灏忔椂寮鏀"); - addPlace("鏁欏妤", 100, 200, "1-4灞備负鏁欏"); - addPlace("鍥句功棣", 300, 200, "钘忎功50涓囧唽锛屽紑鏀炬椂闂8:00-22:00"); - addPlace("椋熷爞", 200, 400, "鎻愪緵鏃╀腑鏅氶锛屾敮鎸佹敮浠樺疂/寰俊鏀粯"); - addPlace("鎿嶅満", 400, 500, "鍖呭惈400绫宠窇閬撳拰1涓鐞冨満"); - addPlace("瀹胯垗鍖", 200, 600, "鍏15鏍嬪鑸嶆ゼ"); -} - -// 鏄剧ず涓昏彍鍗 -void showMenu() { - printf("\n===== 鏍″洯瀵兼父绯荤粺 =====\n"); - printf("1. 鏌ヨ鍦扮偣淇℃伅\n"); - printf("2. 鏌ユ壘鏈鐭矾寰刓n"); - printf("3. 鏌ョ湅鍘嗗彶璁板綍\n"); - printf("4. 鎾ら攢涓婁竴姝ユ搷浣淺n"); - printf("5. 閫鍑虹郴缁焅n"); - printf("璇烽夋嫨鎿嶄綔锛"); -} - -// 涓诲嚱鏁帮紙琛ュ厖瀹屾暣case 2閫昏緫锛 -int main() { - initAll(); - initSampleData(); - - int choice; - char name[50]; - int path[MAX_PATH]; - int pathLen; - float dist; - - while (1) { - showMenu(); - scanf("%d", &choice); - getchar(); // 鍚告敹鎹㈣绗 - - switch (choice) { - case 1: { - printf("璇疯緭鍏ヨ鏌ヨ鐨勫湴鐐瑰悕绉帮細"); - fgets(name, sizeof(name), stdin); - name[strcspn(name, "\n")] = '\0'; - - Place *p = queryPlace(name); - if (p) { - printf("\n鍦扮偣ID锛%d\n鍚嶇О锛%s\n鍧愭爣锛(%.1f, %.1f)\n鎻忚堪锛%s\n", - p->id, p->name, p->x, p->y, p->description); - } else { - printf("鏈壘鍒拌鍦扮偣锛乗n"); - } - break; - } - - case 2: { - char startName[50], endName[50]; - int startId, endId; - - printf("璇疯緭鍏ヨ捣鐐瑰悕绉帮細"); - fgets(startName, sizeof(startName), stdin); - startName[strcspn(startName, "\n")] = '\0'; - startId = getPlaceIdByName(startName); - - printf("璇疯緭鍏ョ粓鐐瑰悕绉帮細"); - fgets(endName, sizeof(endName), stdin); - endName[strcspn(endName, "\n")] = '\0'; - endId = getPlaceIdByName(endName); - - if (startId == -1) { - printf("璧风偣鍚嶇О涓嶅瓨鍦紒\n"); - break; - } - if (endId == -1) { - printf("缁堢偣鍚嶇О涓嶅瓨鍦紒\n"); - break; - } - - dist = findShortestPath(startId, endId, path, &pathLen); - if (dist < 0) { - printf("鏃犳硶鎵惧埌璺緞锛乗n"); - } else { - showPath(path, pathLen, dist); - } - break; - } - - case 3: { - showHistory(); - break; - } - - case 4: { - undoOperation(); - break; - } - - case 5: { - printf("鎰熻阿鎮ㄧ殑浣跨敤锛屽啀瑙侊紒\n"); - return 0; - } - - default: { - printf("鏃犳晥鎿嶄綔锛岃閲嶆柊閫夋嫨锛乗n"); - break; - } - } - } -} \ No newline at end of file -- Gitee From c323660cd76b5cca1dc86143edfc4269f2ad4236 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=93=8D?= <16216866+xiang-zi-li@user.noreply.gitee.com> Date: Wed, 26 Nov 2025 14:43:30 +0000 Subject: [PATCH 33/33] =?UTF-8?q?add=20=E5=9B=BE=E7=BB=93=E6=9E=84/?= =?UTF-8?q?=E6=BA=90=E4=BB=A3=E7=A0=81.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 鏉庡搷 <16216866+xiang-zi-li@user.noreply.gitee.com> --- .../\346\272\220\344\273\243\347\240\201" | 216 ++++++++++++++++++ 1 file changed, 216 insertions(+) create mode 100644 "\345\233\276\347\273\223\346\236\204/\346\272\220\344\273\243\347\240\201" diff --git "a/\345\233\276\347\273\223\346\236\204/\346\272\220\344\273\243\347\240\201" "b/\345\233\276\347\273\223\346\236\204/\346\272\220\344\273\243\347\240\201" new file mode 100644 index 0000000..c37f7c0 --- /dev/null +++ "b/\345\233\276\347\273\223\346\236\204/\346\272\220\344\273\243\347\240\201" @@ -0,0 +1,216 @@ +#include +#include +#define MAX_SPOTS 20 // 鏈澶ф櫙鐐规暟 +#define INF 10000 // 鏃犵┓澶ф爣璁 + +// 鏅偣淇℃伅缁撴瀯浣擄紙鏂板鏀惰棌鏍囪涓庡叧閿瘝锛 +typedef struct { + int id; // 缂栧彿 + char name[50]; // 鍚嶇О + char intro[200];// 绠浠 + char keyword[100];// 鎼滅储鍏抽敭璇嶏紙濡"瀛︿範 鍥句功"锛 + int isCollected;// 鏀惰棌鏍囪锛1=鏀惰棌锛0=鏈敹钘忥級 +} Spot; + +// 鍥剧粨鏋勶紙淇濈暀閭绘帴鐭╅樀锛 +typedef struct { + Spot spots[MAX_SPOTS]; + int dist[MAX_SPOTS][MAX_SPOTS];// 璺濈鐭╅樀 + int crowd[MAX_SPOTS][MAX_SPOTS];// 鎷ユ尋搴︾煩闃碉紙1-5绾э級 + int spotCount; // 瀹為檯鏅偣鏁 +} CampusGraph; + +// 鍒濆鍖栧浘 +void initGraph(CampusGraph *g) { + g->spotCount = 0; + for (int i = 0; i < MAX_SPOTS; i++) { + g->spots[i].isCollected = 0; + for (int j = 0; j < MAX_SPOTS; j++) { + g->dist[i][j] = (i == j) ? 0 : INF; + g->crowd[i][j] = 3; // 榛樿鎷ユ尋搴︿腑绛 + } + } +} + +// 娣诲姞鏅偣锛堝惈鍏抽敭璇嶏級 +void addSpot(CampusGraph *g, int id, char *name, char *intro, char *keyword) { + g->spots[id].id = id; + strcpy(g->spots[id].name, name); + strcpy(g->spots[id].intro, intro); + strcpy(g->spots[id].keyword, keyword); + g->spotCount++; +} + +// 娣诲姞璺緞锛堣窛绂+鎷ユ尋搴︼級 +void addPath(CampusGraph *g, int a, int b, int distance, int crowdLevel) { + g->dist[a][b] = g->dist[b][a] = distance; + g->crowd[a][b] = g->crowd[b][a] = crowdLevel; +} + +// 1. 鍏抽敭璇嶆悳绱㈡櫙鐐 +void searchSpot(CampusGraph *g, char *key) { + printf("\n===== 鎼滅储缁撴灉 =====\n"); + int found = 0; + for (int i = 0; i < g->spotCount; i++) { + if (strstr(g->spots[i].name, key) || strstr(g->spots[i].keyword, key)) { + printf("缂栧彿锛%d | 鍚嶇О锛%s\n绠浠嬶細%s\n鏀惰棌鐘舵侊細%s\n\n", + g->spots[i].id, g->spots[i].name, g->spots[i].intro, + g->spots[i].isCollected ? "宸叉敹钘" : "鏈敹钘"); + found = 1; + } + } + if (!found) printf("鏈壘鍒板惈銆%s銆嶇殑鏅偣\n", key); +} + +// 2. 鏀惰棌/鍙栨秷鏀惰棌鏅偣 +void toggleCollection(CampusGraph *g, int id) { + if (id < 0 || id >= g->spotCount) { + printf("鏅偣缂栧彿鏃犳晥锛乗n"); + return; + } + g->spots[id].isCollected = !g->spots[id].isCollected; + printf("鎿嶄綔鎴愬姛锛%s宸%s鏀惰棌\n", g->spots[id].name, + g->spots[id].isCollected ? "鍔犲叆" : "鍙栨秷"); +} + +// 3. 鏌ョ湅鏀惰棌鍒楄〃 +void showCollection(CampusGraph *g) { + printf("\n===== 鏀惰棌鍒楄〃 =====\n"); + int hasCollected = 0; + for (int i = 0; i < g->spotCount; i++) { + if (g->spots[i].isCollected) { + printf("缂栧彿锛%d | 鍚嶇О锛%s\n绠浠嬶細%s\n\n", + g->spots[i].id, g->spots[i].name, g->spots[i].intro); + hasCollected = 1; + } + } + if (!hasCollected) printf("鏆傛棤鏀惰棌鏅偣\n"); +} + +// Dijkstra绠楁硶锛堟敮鎸佽窛绂/鎷ユ尋搴︽潈閲嶏級 +void dijkstra(CampusGraph *g, int start, int type, int res[], int prev[]) { + int visited[MAX_SPOTS] = {0}; + for (int i = 0; i < g->spotCount; i++) { + res[i] = (type == 1) ? g->dist[start][i] : g->crowd[start][i]; + prev[i] = (res[i] != INF && res[i] != 3) ? start : -1; + } + visited[start] = 1; + + for (int i = 1; i < g->spotCount; i++) { + int minVal = INF, u = -1; + for (int j = 0; j < g->spotCount; j++) { + if (!visited[j] && res[j] < minVal) { + minVal = res[j]; + u = j; + } + } + if (u == -1) break; + visited[u] = 1; + + for (int v = 0; v < g->spotCount; v++) { + int val = (type == 1) ? g->dist[u][v] : g->crowd[u][v]; + if (!visited[v] && res[u] + val < res[v]) { + res[v] = res[u] + val; + prev[v] = u; + } + } + } +} + +// 鎵撳嵃璺緞 +void printPath(CampusGraph *g, int prev[], int end) { + if (prev[end] == -1) { + printf("%s", g->spots[end].name); + return; + } + printPath(g, prev, prev[end]); + printf(" 鈫 %s", g->spots[end].name); +} + +// 澧炲己鐗堜富鑿滃崟 +void showMenu() { + printf("\n===== 鏍″洯瀵兼父绯荤粺锛堝寮虹増锛=====\n"); + printf("1. 鏌ョ湅鎵鏈夋櫙鐐筡n2. 鍏抽敭璇嶆悳绱㈡櫙鐐筡n3. 鏀惰棌/鍙栨秷鏀惰棌鏅偣\n"); + printf("4. 鏌ョ湅鏀惰棌鍒楄〃\n5. 鏌ヨ璺緞锛1-鏈鐭紝2-閬垮嘲锛塡n6. 閫鍑篭n"); + printf("璇烽夋嫨鍔熻兘锛1-6锛夛細"); +} + +// 涓诲嚱鏁 +int main() { + CampusGraph g; + initGraph(&g); + // 鍒濆鍖栨櫙鐐癸紙鍚叧閿瘝锛 + addSpot(&g, 0, "鍖楅棬", "杩戝湴閾佸彛锛岃闂ㄧ", "鏍¢棬 鍦伴搧 闂ㄧ"); + addSpot(&g, 1, "鍥句功棣", "棣嗚棌涓板瘜锛岃嚜涔犲尯鍏呰冻", "瀛︿範 鍥句功 鑷範"); + addSpot(&g, 2, "鏁欏妤", "澶氬獟浣撴暀瀹わ紝瀹為獙瀹", "涓婅 瀹為獙 鏁欏"); + addSpot(&g, 3, "椋熷爞", "鍗楀寳鑿滅郴锛屼环鏍间翰姘", "鍚冮キ 椁愰ギ 骞充环"); + addSpot(&g, 4, "鎿嶅満", "璺戦亾+绡悆鍦猴紝杩愬姩棣栭", "杩愬姩 璺戞 绡悆"); + addSpot(&g, 5, "瀹胯垗鍖", "娲楄。鎴+渚垮埄搴", "浣忓 鐢熸椿 璐墿"); + addSpot(&g, 6, "浣撹偛棣", "瀹ゅ唴鍦洪锛岃禌浜嬩妇鍔炲湴", "杩愬姩 璧涗簨 瀹ゅ唴"); + + // 鍒濆鍖栬矾寰勶紙璺濈/鎷ユ尋搴︼級 + addPath(&g, 0, 1, 200, 2); + addPath(&g, 0, 2, 150, 3); + addPath(&g, 1, 3, 300, 4); + addPath(&g, 2, 3, 220, 3); + addPath(&g, 2, 4, 400, 2); + addPath(&g, 3, 5, 280, 3); + addPath(&g, 4, 6, 250, 1); + addPath(&g, 5, 6, 350, 2); + + int choice, start, end, type; + int res[MAX_SPOTS], prev[MAX_SPOTS]; + char key[50]; + while (1) { + showMenu(); + scanf("%d", &choice); + switch (choice) { + case 1: // 鏌ョ湅鎵鏈夋櫙鐐 + printf("\n===== 鍏ㄩ儴鏅偣 =====\n"); + for (int i = 0; i < g.spotCount; i++) + printf("缂栧彿锛%d | 鍚嶇О锛%s\n绠浠嬶細%s\n鏀惰棌锛%s\n\n", + g.spots[i].id, g.spots[i].name, g.spots[i].intro, + g.spots[i].isCollected ? "鏄" : "鍚"); + break; + case 2: // 鎼滅储鏅偣 + printf("\n杈撳叆鎼滅储鍏抽敭璇嶏細"); + getchar(); + fgets(key, 50, stdin); + key[strcspn(key, "\n")] = '\0'; + searchSpot(&g, key); + break; + case 3: // 鏀惰棌鎿嶄綔 + printf("\n杈撳叆鏅偣缂栧彿锛"); + scanf("%d", &start); + toggleCollection(&g, start); + break; + case 4: // 鏌ョ湅鏀惰棌 + showCollection(&g); + break; + case 5: // 璺緞鏌ヨ + printf("\n閫夋嫨璺緞绫诲瀷锛1-鏈鐭窛绂伙紝2-閬垮嘲璺嚎锛夛細"); + scanf("%d", &type); + printf("璧风偣缂栧彿锛"); + scanf("%d", &start); + printf("缁堢偣缂栧彿锛"); + scanf("%d", &end); + if (start < 0 || start >= g.spotCount || end < 0 || end >= g.spotCount) { + printf("缂栧彿鏃犳晥锛乗n"); + break; + } + dijkstra(&g, start, type, res, prev); + if (res[end] == INF) printf("鏃犲彲杈捐矾寰勶紒\n"); + else { + printf("\n%s锛", type == 1 ? "鏈鐭矾寰" : "閬垮嘲璺緞"); + printPath(&g, prev, end); + printf("\n%s锛%d%s\n", type == 1 ? "鎬昏窛绂" : "鎬绘嫢鎸ゅ害", + res[end], type == 1 ? "绫" : "绾"); + } + break; + case 6: // 閫鍑 + printf("鎰熻阿浣跨敤锛屽啀瑙侊紒\n"); + return 0; + default: printf("杈撳叆閿欒锛岃閲嶈瘯锛乗n"); + } + } +} \ No newline at end of file -- Gitee