├── P1.c ├── P2.c ├── P3.c ├── README.md └── test.txt /P1.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | 5 | // 单链表节点 6 | typedef struct LNode 7 | { 8 | int Sno, score; 9 | char name[20]; 10 | struct LNode *next; 11 | } LNode; 12 | 13 | void printTitle() 14 | { 15 | system("cls"); 16 | printf("\n----------------- Student Score Query System -----------------\n\n"); 17 | printf("1.Show the scores of all students.\n"); 18 | printf("2.Insert the record of a student's score.\n"); 19 | printf("3.Delete the record of a student's score.\n"); 20 | printf("4.Modify the record of a student's score.\n"); 21 | printf("5.Show the score of a given student.\n"); 22 | printf("6.Show student who has achieved a given score.\n"); 23 | printf("0.Quit.\n"); 24 | printf("\nPlease input the number of the operation you want to perform: "); 25 | } 26 | 27 | // 找到成绩最低的结点 28 | LNode *minList(LNode *LinkList) 29 | { 30 | LNode *minp = LinkList, *p = LinkList->next; 31 | while (p != NULL) 32 | { 33 | if (minp->score > p->score) 34 | { 35 | minp = p; 36 | } 37 | p = p->next; 38 | } 39 | return minp; 40 | } 41 | 42 | // 交换两字符串 43 | void swap(char **p1, char **p2) 44 | { 45 | char *p; 46 | p = *p1; 47 | *p1 = *p2; 48 | *p2 = p; 49 | } 50 | 51 | // 链表按学号选择排序 52 | LNode *sortList(LNode *LinkList) 53 | { 54 | LNode *p, *q = LinkList->next; 55 | LNode temp; 56 | while (q->next != NULL) 57 | { 58 | p = minList(q); 59 | if (p->score != q->score) 60 | { 61 | temp.Sno = q->Sno; 62 | q->Sno = p->Sno; 63 | p->Sno = temp.Sno; 64 | temp.score = q->score; 65 | q->score = p->score; 66 | p->score = temp.score; 67 | swap(&p->name, &q->name); 68 | } 69 | q = q->next; 70 | } 71 | return LinkList; 72 | } 73 | 74 | // 获取总行数 75 | int countLines(FILE *file) 76 | { 77 | int line_num = 0; 78 | char strLine[50]; 79 | rewind(file); 80 | while (fgets(strLine, 50, file)) 81 | { 82 | line_num++; 83 | } 84 | rewind(file); 85 | return line_num; 86 | } 87 | 88 | // 导入学生成绩 89 | LNode *importData(LNode *LinkList) 90 | { 91 | LinkList = (LNode*)malloc(sizeof(LNode)); 92 | LNode *p = LinkList, *q = LinkList; 93 | FILE *fp = fopen("test.txt", "r"); 94 | int i, Sno, score, N = countLines(fp); 95 | char name[20] = {}; 96 | for (i = 0; i < N; i++) 97 | { 98 | q = (LNode*)malloc(sizeof(LNode)); 99 | fscanf(fp, "%d\t%s\t%d\n", &Sno, name, &score); 100 | q->Sno = Sno; 101 | strcpy(q->name, name); 102 | q->score = score; 103 | p->next = q; 104 | p = q; 105 | } 106 | p->next = NULL; 107 | fclose(fp); 108 | return LinkList; 109 | } 110 | 111 | // 保存学生成绩 112 | LNode *saveData(LNode *LinkList) 113 | { 114 | FILE *fp = fopen("test.txt", "w"); 115 | LNode *p = LinkList->next; 116 | while (p != NULL) 117 | { 118 | fprintf(fp, "%d\t%s\t%d\n", p->Sno, p->name, p->score); 119 | p = p->next; 120 | } 121 | sortList(LinkList); 122 | fclose(fp); 123 | return LinkList; 124 | } 125 | 126 | // 1.显示学生成绩表 127 | void printTable(LNode *LinkList) 128 | { 129 | LNode *p = LinkList->next; 130 | while (p != NULL) 131 | { 132 | printf("%d\t%s\t%d\n", p->Sno, p->name, p->score); 133 | p = p->next; 134 | } 135 | } 136 | 137 | // 2.插入一条记录 138 | void insert(LNode *LinkList) 139 | { 140 | int Sno, score, flag, temp; 141 | char name[20] = {}; 142 | LNode *q, *p = (LNode*)malloc(sizeof(LNode)); 143 | p->next = LinkList->next; 144 | LinkList->next = p; 145 | do // 保证该学生不存在 146 | { 147 | printf("Please input Student Number: "); 148 | scanf("%d", &temp); 149 | q = LinkList->next; 150 | flag = 0; 151 | while (q != NULL) 152 | { 153 | if (q->Sno == temp) 154 | { 155 | flag = 1; 156 | printf("Wrong Student Number!\n"); 157 | break; 158 | } 159 | q = q->next; 160 | } 161 | } while (flag); 162 | p->Sno = temp; 163 | printf("Please input Name: "); 164 | scanf("%s", p->name); 165 | printf("Please input Score: "); 166 | scanf("%d", &p->score); 167 | saveData(LinkList); 168 | printf("Insert Complete!"); 169 | } 170 | 171 | // 3.删除一条记录 172 | void delete(LNode *LinkList) 173 | { 174 | int temp, flag; 175 | LNode *q; 176 | do // 保证该学生存在 177 | { 178 | printf("Please input Student Number: "); 179 | scanf("%d", &temp); 180 | q = LinkList; 181 | flag = 1; 182 | while (q->next != NULL) 183 | { 184 | if (q->next->Sno == temp) 185 | { 186 | flag = 0; 187 | break; 188 | } 189 | q = q->next; 190 | } 191 | if (!flag) 192 | { 193 | break; 194 | } 195 | printf("Student not exist!\n"); 196 | } while (flag); 197 | q->next = q->next->next; 198 | saveData(LinkList); 199 | printf("Delete Complete!"); 200 | } 201 | 202 | // 4.修改一条记录 203 | void modify(LNode *LinkList) 204 | { 205 | int temp, flag; 206 | LNode *q; 207 | do // 保证该学生存在 208 | { 209 | printf("Please input Student Number: "); 210 | scanf("%d", &temp); 211 | q = LinkList->next; 212 | flag = 1; 213 | while (q != NULL) 214 | { 215 | if (q->Sno == temp) 216 | { 217 | flag = 0; 218 | break; 219 | } 220 | q = q->next; 221 | } 222 | if (!flag) 223 | { 224 | break; 225 | } 226 | printf("Student not exist!\n"); 227 | } while (flag); 228 | printf("Please input score: "); 229 | scanf("%d", &q->score); 230 | saveData(LinkList); 231 | printf("Modify Complete!"); 232 | } 233 | 234 | // 5.查看指定学生的成绩 235 | void showScoreOfStu(LNode *LinkList) 236 | { 237 | int operation, temp, flag; 238 | char NAME[20] = {}; 239 | LNode *q; 240 | while (1) 241 | { 242 | printf("1.Student Number\t\t2.Name\n"); 243 | printf("(Input 1 or 2) Search by:"); 244 | scanf("%d", &operation); 245 | if (operation == 1) // 通过学号 246 | { 247 | do // 保证该学生存在 248 | { 249 | printf("Please input Student Number: "); 250 | scanf("%d", &temp); 251 | q = LinkList->next; 252 | flag = 1; 253 | while (q != NULL) 254 | { 255 | if (q->Sno == temp) 256 | { 257 | flag = 0; 258 | break; 259 | } 260 | q = q->next; 261 | } 262 | if (!flag) 263 | { 264 | printf("%d\t%s\t%d\n", q->Sno, q->name, q->score); 265 | break; 266 | } 267 | printf("Student not exist!\n"); 268 | } while (flag); 269 | break; 270 | } 271 | else if (operation == 2) // 通过姓名 272 | { 273 | do // 保证该学生存在 274 | { 275 | printf("Please input name: "); 276 | scanf("%s", NAME); 277 | q = LinkList->next; 278 | flag = 1; 279 | while (q != NULL) 280 | { 281 | if (strcmp(q->name, NAME) == 0) 282 | { 283 | flag = 0; 284 | break; 285 | } 286 | q = q->next; 287 | } 288 | if (!flag) 289 | { 290 | printf("%d\t%s\t%d\n", q->Sno, q->name, q->score); 291 | break; 292 | } 293 | printf("Student not exist!\n"); 294 | } while (flag); 295 | break; 296 | } 297 | else 298 | { 299 | printf("Wrong operation!"); 300 | } 301 | 302 | } 303 | } 304 | 305 | // 6.查看分数为指定成绩的学生(规定满分为100分) 306 | void showStuGetScore(LNode *LinkList) 307 | { 308 | int s, flag = 1; 309 | LNode *p = LinkList->next; 310 | while (1) 311 | { 312 | printf("Please input score: "); 313 | scanf("%d", &s); 314 | if (s >= 0 && s <= 100) 315 | { 316 | break; 317 | } 318 | else 319 | { 320 | printf("Score should in the range from 0 to 100!\n"); 321 | } 322 | }; 323 | while (p != NULL) 324 | { 325 | if (p->score == s) 326 | { 327 | printf("%d\t%s\t%d\n", p->Sno, p->name, p->score); 328 | flag = 0; 329 | } 330 | p = p->next; 331 | }; 332 | if (flag) 333 | { 334 | printf("No student's score is %d.\n", s); 335 | } 336 | } 337 | 338 | int main() 339 | { 340 | LNode *LinkList; 341 | int operation = 0; 342 | LinkList = importData(LinkList); 343 | sortList(LinkList); 344 | while(1) 345 | { 346 | printTitle(); 347 | scanf("%d", &operation); 348 | switch(operation) 349 | { 350 | case 0: return 0; 351 | case 1: printTable(LinkList); break; 352 | case 2: insert(LinkList); break; 353 | case 3: delete(LinkList); break; 354 | case 4: modify(LinkList); break; 355 | case 5: showScoreOfStu(LinkList); break; 356 | case 6: showStuGetScore(LinkList); break; 357 | default: printf("Wrong operation!\n"); break; 358 | } 359 | system("pause"); 360 | } 361 | } 362 | -------------------------------------------------------------------------------- /P2.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | //定义Node 5 | typedef struct BiTNode 6 | { 7 | char data; 8 | struct BiTNode *lchild, *rchild, *parent; 9 | }BiTNode; 10 | 11 | //建立二叉树(先序) 12 | BiTNode *create_tree(BiTNode *p) 13 | { 14 | char c = getchar(); 15 | if (c == '#') 16 | { 17 | p = NULL; 18 | } 19 | else 20 | { 21 | p = (BiTNode *)malloc(sizeof(BiTNode)); 22 | p->data = c; 23 | p->lchild = create_tree(p->lchild); 24 | p->rchild = create_tree(p->rchild); 25 | } 26 | return p; 27 | } 28 | 29 | //设置parent指针 30 | BiTNode *addparent(BiTNode *p, BiTNode *q) 31 | { 32 | if (p != NULL) 33 | { 34 | p->parent = q; 35 | q = p; 36 | p->lchild = addparent(p->lchild, q); 37 | p->rchild = addparent(p->rchild, q); 38 | } 39 | return p; 40 | } 41 | 42 | //输出到根节点的路径 43 | void path(BiTNode *p) 44 | { 45 | while (p != NULL) 46 | { 47 | printf("%c ", p->data); 48 | p = p->parent; 49 | } 50 | printf("\n"); 51 | } 52 | 53 | //输出所有节点到根节点的路径 54 | void all_path(BiTNode *p) 55 | { 56 | if (p != NULL) 57 | { 58 | path(p); 59 | all_path(p->lchild); 60 | all_path(p->rchild); 61 | } 62 | } 63 | 64 | int main() 65 | { 66 | BiTNode *BiTree = NULL; 67 | printf("\n------Create Binary Tree------\n\n"); 68 | BiTree = create_tree(BiTree); 69 | if (BiTree == NULL) 70 | { 71 | printf("Empty Binary Tree!\n"); 72 | } 73 | addparent(BiTree, NULL); 74 | all_path(BiTree); 75 | system("pause"); 76 | return 0; 77 | } 78 | -------------------------------------------------------------------------------- /P3.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | #define INF 10000 //代表无限大 5 | #define V_SIZE 11 //景点数 6 | 7 | //打印菜单 8 | void printMenu() 9 | { 10 | system("cls"); 11 | printf("\n------------ Scenie Spot Information System ------------\n\n"); 12 | printf("1. Query the shortest way.\n"); 13 | printf("2. Printmap.\n"); 14 | printf("0. Quit System.\n"); 15 | printf("\nPlease input the number of the operation you want to perform: "); 16 | } 17 | 18 | //数组填充 19 | void array_fill(int * array, int len, int val) 20 | { 21 | int i; 22 | for (i = 0; i < len; i++) { 23 | array[i] = val; 24 | } 25 | } 26 | 27 | /* 28 | 输入参数: 29 | graph 权值矩阵 30 | n 矩阵大小,即点的个数 31 | start 起点 32 | dist 接收到所有点的最短距离 33 | */ 34 | void dijkstra(int graph[][V_SIZE], int n, int start, int dist[]) 35 | { 36 | int *path = (int *)malloc(sizeof(int) * n); 37 | int *shortest = (int *)malloc(sizeof(int) * n); 38 | int *mark = (int *)malloc(sizeof(int) * n); 39 | int min, v, i, j; 40 | array_fill(mark, n, 0); 41 | array_fill(dist, n, INF); 42 | 43 | for (i = 0; i < n; i++) 44 | { 45 | dist[i] = graph[start][i]; 46 | if (i != start && dist[i] < INF) 47 | { 48 | path[i] = start; 49 | } 50 | else 51 | { 52 | path[i] = -1; 53 | } 54 | } 55 | mark[start] = 1; 56 | while (1) 57 | { 58 | min = INF; 59 | v = -1; 60 | //找到最小的距离 61 | for (i = 0; i < n; i++) 62 | { 63 | if (!mark[i]) 64 | { 65 | if (dist[i] 0; j--) 109 | { 110 | printf("%d->", shortest[j]); 111 | } 112 | printf("%d\n", shortest[0]); 113 | } 114 | free(path); 115 | free(shortest); 116 | free(mark); 117 | } 118 | 119 | // 1. 求给定起点的最短路径 120 | void shortestWay(int graph[][V_SIZE], int n, int dist[]) 121 | { 122 | int start, end; 123 | printf("Please input the place you start: "); 124 | scanf("%d", &start); 125 | if (start < V_SIZE) 126 | { 127 | dijkstra(graph, n, start, dist); 128 | } 129 | else 130 | { 131 | printf("Place not exist!\n"); 132 | } 133 | } 134 | 135 | // 2. 打印地图 136 | void printMap() 137 | { 138 | printf("(0)-------------(6)-------------(7) \n"); 139 | printf(" | 511 | 349 | \n"); 140 | printf(" | | | \n"); 141 | printf(" |842 |534 |651 \n"); 142 | printf(" | | | \n"); 143 | printf(" | | | \n"); 144 | printf("(1) (5) (8) \n"); 145 | printf(" | | | \n"); 146 | printf(" | | | \n"); 147 | printf(" |967 |409 |825 \n"); 148 | printf(" | | | \n"); 149 | printf(" | | | \n"); 150 | printf("(2)-------------(4)-------------(9) \n"); 151 | printf(" | 902 | 367 | \n"); 152 | printf(" | | | \n"); 153 | printf(" | |672 |622 \n"); 154 | printf(" | | | \n"); 155 | printf(" | 607 | | \n"); 156 | printf(" +--------------(3) (10) \n"); 157 | } 158 | 159 | int main() 160 | { 161 | int operation; 162 | int dist[V_SIZE]; 163 | int W[V_SIZE][V_SIZE] = { 164 | { 0, 842, INF, INF, INF, INF, 511, INF, INF, INF, INF }, 165 | 166 | { 842, 0, 967, INF, INF, INF, INF, INF, INF, INF, INF }, 167 | 168 | { INF, 967, 0, 607, 902, INF, INF, INF, INF, INF, INF }, 169 | 170 | { INF, INF, 607, 0, 672, INF, INF, INF, INF, INF, INF }, 171 | 172 | { INF, INF, 902, 672, 0, 409, INF, INF, INF, 367, INF }, 173 | 174 | { INF, INF, INF, INF, 409, 0, 534, INF, INF, INF, INF }, 175 | 176 | { 511, INF, INF, INF, INF, 534, 0, 349, INF, INF, INF }, 177 | 178 | { INF, INF, INF, INF, INF, INF, 349, 0, 651, INF, INF }, 179 | 180 | { INF, INF, INF, INF, INF, INF, INF, 651, 0, 825, INF }, 181 | 182 | { INF, INF, INF, INF, 367, INF, INF, INF, 825, 0, 622 }, 183 | 184 | { INF, INF, INF, INF, INF, INF, INF, INF, INF, 622, 0 }}; 185 | while(1) 186 | { 187 | printMenu(); 188 | scanf("%d", &operation); 189 | switch(operation) 190 | { 191 | case 0: return 0; 192 | case 1: shortestWay(W, V_SIZE, dist); break; 193 | case 2: printMap(); break; 194 | default: printf("Wrong operation!\n"); break; 195 | } 196 | system("pause"); 197 | } 198 | } 199 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 数据结构课程设计 2 | ## 1. 成绩查询系统 3 | 4 | ### 设计目的 5 | 6 | - 掌握链表的存储和操作。 7 | - 掌握文件的操作。 8 | 9 | ### 要求 10 | 11 | - 采用单链表存储数据,数据的输入采用读文件方式,要求不少于20条记录; 12 | - 每个记录至少有数据项:学号、姓名、成绩; 13 | - 插入或删除一条新的记录; 14 | - 查找并显示给定姓名的学生成绩; 15 | - 查找并显示给定成绩的学生学号及姓名; 16 | - (选做)建立一个按学生成绩递增的单链表。 17 | 18 | 19 | 20 | ## 2. 二叉树 21 | 22 | ### 要求 23 | 24 | ​ 在二叉树的二叉链表存储结构中增加一个指向双亲结点的parent指针,设计算法,给这个指针赋值,并输出所有结点到根结点的逆路径。 25 | 26 | 27 | 28 | ## 3. 旅游信息管理系统 29 | 30 | ### 设计目的 31 | 32 | ​ 在旅游景区帮助游客信息查询,计算出所有景点之间最短路径和最短距离。 33 | 34 | ### 要求 35 | 36 | - 制订旅游景点导游线路策略,采用迪杰斯特拉算法或弗洛伊德算法均可; 37 | - 制订景区道路铺设策略; 38 | - 至少有8个景点。 39 | -------------------------------------------------------------------------------- /test.txt: -------------------------------------------------------------------------------- 1 | 6 jack 81 2 | 0 sb 1 3 | 1 Tom1 81 4 | 2 Tom2 82 5 | 3 Tom3 83 6 | 4 Tom4 84 7 | 5 Tom5 85 8 | --------------------------------------------------------------------------------