帮我基于DEVC++的基础上写一份使用单链表存储,能够做到学生信息链表创建、学生信息输入、学生信息 查询、学生信息修改、学生信息删除、学生信息输出(全部或部分输出)或保存到文件,学生相关排序功能的学生信息管理系统
时间: 2023-11-26 15:03:03 浏览: 81
当然可以,以下是基于Dev-C++的代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NAME_LEN 20
#define ID_LEN 10
#define MAX_LINE_LEN 1024
#define MAX_FILENAME_LEN 256
typedef struct student
{
char id[ID_LEN];
char name[NAME_LEN];
int score;
struct student *next;
} Student;
void print_menu();
Student *create_student();
void add_student(Student **head);
void search_student(Student *head);
void modify_student(Student *head);
void delete_student(Student **head);
void print_student(Student *head);
void save_file(Student *head);
void sort_student(Student *head);
int main()
{
Student *head = NULL;
int choice;
do
{
print_menu();
scanf("%d", &choice);
switch (choice)
{
case 1:
add_student(&head);
break;
case 2:
search_student(head);
break;
case 3:
modify_student(head);
break;
case 4:
delete_student(&head);
break;
case 5:
print_student(head);
break;
case 6:
save_file(head);
break;
case 7:
sort_student(head);
break;
case 0:
break;
default:
printf("输入错误,请重新输入!\n");
break;
}
} while (choice != 0);
return 0;
}
void print_menu()
{
printf("========== 学生信息管理系统 ==========\n");
printf("1. 添加学生信息\n");
printf("2. 查询学生信息\n");
printf("3. 修改学生信息\n");
printf("4. 删除学生信息\n");
printf("5. 输出学生信息\n");
printf("6. 保存学生信息到文件\n");
printf("7. 学生信息排序\n");
printf("0. 退出程序\n");
printf("=======================================\n");
printf("请输入您的选择:");
}
Student *create_student()
{
Student *p = (Student *)malloc(sizeof(Student));
if (p == NULL)
{
printf("内存分配失败!\n");
exit(1);
}
printf("请输入学生学号:");
scanf("%s", p->id);
printf("请输入学生姓名:");
scanf("%s", p->name);
printf("请输入学生分数:");
scanf("%d", &p->score);
p->next = NULL;
return p;
}
void add_student(Student **head)
{
Student *p = create_student();
if (*head == NULL)
{
*head = p;
}
else
{
Student *q = *head;
while (q->next != NULL)
{
q = q->next;
}
q->next = p;
}
printf("添加学生信息成功!\n");
}
void search_student(Student *head)
{
char id[ID_LEN];
printf("请输入要查询的学生学号:");
scanf("%s", id);
Student *p = head;
while (p != NULL)
{
if (strcmp(p->id, id) == 0)
{
printf("学生学号:%s\n", p->id);
printf("学生姓名:%s\n", p->name);
printf("学生分数:%d\n", p->score);
return;
}
p = p->next;
}
printf("未找到学号为 %s 的学生信息!\n", id);
}
void modify_student(Student *head)
{
char id[ID_LEN];
printf("请输入要修改的学生学号:");
scanf("%s", id);
Student *p = head;
while (p != NULL)
{
if (strcmp(p->id, id) == 0)
{
printf("请输入学生姓名:");
scanf("%s", p->name);
printf("请输入学生分数:");
scanf("%d", &p->score);
printf("修改学生信息成功!\n");
return;
}
p = p->next;
}
printf("未找到学号为 %s 的学生信息!\n", id);
}
void delete_student(Student **head)
{
char id[ID_LEN];
printf("请输入要删除的学生学号:");
scanf("%s", id);
Student *p = *head, *q = NULL;
while (p != NULL)
{
if (strcmp(p->id, id) == 0)
{
if (q == NULL)
{
*head = p->next;
}
else
{
q->next = p->next;
}
free(p);
printf("删除学生信息成功!\n");
return;
}
q = p;
p = p->next;
}
printf("未找到学号为 %s 的学生信息!\n", id);
}
void print_student(Student *head)
{
int choice;
printf("请选择输出方式:\n");
printf("1. 输出全部学生信息\n");
printf("2. 输出指定分数范围内的学生信息\n");
printf("请输入您的选择:");
scanf("%d", &choice);
switch (choice)
{
case 1:
printf("学号\t\t姓名\t\t分数\n");
Student *p = head;
while (p != NULL)
{
printf("%s\t\t%s\t\t%d\n", p->id, p->name, p->score);
p = p->next;
}
break;
case 2:
int min_score, max_score;
printf("请输入最低分数:");
scanf("%d", &min_score);
printf("请输入最高分数:");
scanf("%d", &max_score);
printf("学号\t\t姓名\t\t分数\n");
p = head;
while (p != NULL)
{
if (p->score >= min_score && p->score <= max_score)
{
printf("%s\t\t%s\t\t%d\n", p->id, p->name, p->score);
}
p = p->next;
}
break;
default:
printf("输入错误,请重新输入!\n");
break;
}
}
void save_file(Student *head)
{
char filename[MAX_FILENAME_LEN];
printf("请输入要保存到的文件名:");
scanf("%s", filename);
FILE *fp = fopen(filename, "w");
if (fp == NULL)
{
printf("文件打开失败!\n");
exit(1);
}
Student *p = head;
while (p != NULL)
{
fprintf(fp, "%s %s %d\n", p->id, p->name, p->score);
p = p->next;
}
fclose(fp);
printf("保存学生信息到文件成功!\n");
}
void sort_student(Student *head)
{
int choice;
printf("请选择排序方式:\n");
printf("1. 按学号排序\n");
printf("2. 按姓名排序\n");
printf("3. 按分数排序\n");
printf("请输入您的选择:");
scanf("%d", &choice);
switch (choice)
{
case 1:
{
Student *p = head, *q = NULL;
while (p != NULL)
{
q = p->next;
while (q != NULL)
{
if (strcmp(p->id, q->id) > 0)
{
char temp_id[ID_LEN];
strcpy(temp_id, p->id);
strcpy(p->id, q->id);
strcpy(q->id, temp_id);
char temp_name[NAME_LEN];
strcpy(temp_name, p->name);
strcpy(p->name, q->name);
strcpy(q->name, temp_name);
int temp_score = p->score;
p->score = q->score;
q->score = temp_score;
}
q = q->next;
}
p = p->next;
}
break;
}
case 2:
{
Student *p = head, *q = NULL;
while (p != NULL)
{
q = p->next;
while (q != NULL)
{
if (strcmp(p->name, q->name) > 0)
{
char temp_id[ID_LEN];
strcpy(temp_id, p->id);
strcpy(p->id, q->id);
strcpy(q->id, temp_id);
char temp_name[NAME_LEN];
strcpy(temp_name, p->name);
strcpy(p->name, q->name);
strcpy(q->name, temp_name);
int temp_score = p->score;
p->score = q->score;
q->score = temp_score;
}
q = q->next;
}
p = p->next;
}
break;
}
case 3:
{
Student *p = head, *q = NULL;
while (p != NULL)
{
q = p->next;
while (q != NULL)
{
if (p->score < q->score)
{
char temp_id[ID_LEN];
strcpy(temp_id, p->id);
strcpy(p->id, q->id);
strcpy(q->id, temp_id);
char temp_name[NAME_LEN];
strcpy(temp_name, p->name);
strcpy(p->name, q->name);
strcpy(q->name, temp_name);
int temp_score = p->score;
p->score = q->score;
q->score = temp_score;
}
q = q->next;
}
p = p->next;
}
break;
}
default:
printf("输入错误,请重新输入!\n");
break;
}
printf("排序成功!\n");
}
```
代码分析:
1. 定义了学生信息结构体,包括学号、姓名和分数,以及下一个学生信息结构体的指针。
2. 定义了打印菜单、创建学生信息、添加学生信息、查询学生信息、修改学生信息、删除学生信息、输出学生信息、保存学生信息到文件和学生信息排序等函数。
3. 在main()函数中,定义了一个学生信息链表的头结点指针head,以及用户输入的选择项choice。
4. 使用do-while循环,循环打印菜单和用户输入的选择项,根据选择项调用相应的函数进行处理,直到选择退出程序。
5. 在add_student()函数中,使用create_student()函数创建一个新的学生信息结构体,并将其添加到学生信息链表的末尾。
6. 在search_student()函数中,根据用户输入的学号查询学生信息,并输出查询结果。
7. 在modify_student()函数中,根据用户输入的学号修改学生信息。
8. 在delete_student()函数中,根据用户输入的学号删除学生信息。
9. 在print_student()函数中,根据用户输入的选择项输出全部学生信息或指定分数范围内的学生信息。
10. 在save_file()函数中,根据用户输入的文件名将学生信息保存到文件中。
11. 在sort_student()函数中,根据用户输入的选择项对学生信息进行排序。
阅读全文