用c语言写一份学生信息管理系统 要求: (1)数据结构:创建学生信息结点类型以及学生信息结构体; (2)存储结构:选择单链表存储学生信息。 (3)实现功能(以函数方式实现):学生信息链表创建、学生信息输入、学生信息查询、学生信息修改、学生信息删除、学生信息输出(全部或部分输出)或保存到文件,学生相关排序。
时间: 2023-12-20 22:07:26 浏览: 96
好的,这是一个比较大的项目,我会尽量给出大体的代码框架和思路,但具体的实现还需要您自己完成。
首先,我们需要定义学生信息结构体,可以包括学生的姓名、学号、性别、年龄、成绩等信息,如下所示:
```c
struct student {
char name[20];
int id;
char sex[10];
int age;
float score;
struct student *next;
};
```
然后,我们需要定义学生信息结点类型,它包含了一个指向学生信息结构体的指针,如下所示:
```c
typedef struct student node;
```
接下来,我们需要定义一些函数来操作学生信息链表,如下所示:
```c
// 创建学生信息链表
node *create_list();
// 向学生信息链表中添加学生信息
void add_student(node *head);
// 查询学生信息
void search_student(node *head);
// 修改学生信息
void modify_student(node *head);
// 删除学生信息
void delete_student(node *head);
// 输出学生信息
void print_student(node *head);
// 保存学生信息到文件
void save_student(node *head);
// 加载学生信息文件
node *load_student();
// 对学生信息进行排序
void sort_student(node *head);
```
接下来,我们来逐个实现这些函数。
首先是创建学生信息链表的函数,它会返回一个指向链表头结点的指针。代码如下:
```c
node *create_list() {
node *head = (node*) malloc(sizeof(node));
head->next = NULL;
return head;
}
```
接下来是向学生信息链表中添加学生信息的函数,它会让用户输入学生信息,并将其添加到链表中。代码如下:
```c
void add_student(node *head) {
node *p = head;
while (p->next != NULL) {
p = p->next;
}
node *new_node = (node*) malloc(sizeof(node));
printf("请输入学生姓名:");
scanf("%s", new_node->name);
printf("请输入学生学号:");
scanf("%d", &new_node->id);
printf("请输入学生性别:");
scanf("%s", new_node->sex);
printf("请输入学生年龄:");
scanf("%d", &new_node->age);
printf("请输入学生成绩:");
scanf("%f", &new_node->score);
new_node->next = NULL;
p->next = new_node;
printf("添加成功!\n");
}
```
接下来是查询学生信息的函数,它会让用户输入学号,然后在链表中查找对应的学生信息。代码如下:
```c
void search_student(node *head) {
int id;
printf("请输入要查询的学生学号:");
scanf("%d", &id);
node *p = head->next;
while (p != NULL) {
if (p->id == id) {
printf("姓名:%s\n", p->name);
printf("学号:%d\n", p->id);
printf("性别:%s\n", p->sex);
printf("年龄:%d\n", p->age);
printf("成绩:%f\n", p->score);
return;
}
p = p->next;
}
printf("未找到该学生!\n");
}
```
接下来是修改学生信息的函数,它会让用户输入要修改的学号,然后在链表中查找对应的学生信息并修改。代码如下:
```c
void modify_student(node *head) {
int id;
printf("请输入要修改的学生学号:");
scanf("%d", &id);
node *p = head->next;
while (p != NULL) {
if (p->id == id) {
printf("请输入新的学生姓名:");
scanf("%s", p->name);
printf("请输入新的学生性别:");
scanf("%s", p->sex);
printf("请输入新的学生年龄:");
scanf("%d", &p->age);
printf("请输入新的学生成绩:");
scanf("%f", &p->score);
printf("修改成功!\n");
return;
}
p = p->next;
}
printf("未找到该学生!\n");
}
```
接下来是删除学生信息的函数,它会让用户输入要删除的学号,然后在链表中查找对应的学生信息并删除。代码如下:
```c
void delete_student(node *head) {
int id;
printf("请输入要删除的学生学号:");
scanf("%d", &id);
node *p = head->next;
node *prev = head;
while (p != NULL) {
if (p->id == id) {
prev->next = p->next;
free(p);
printf("删除成功!\n");
return;
}
prev = p;
p = p->next;
}
printf("未找到该学生!\n");
}
```
接下来是输出学生信息的函数,它会输出链表中所有学生的信息。代码如下:
```c
void print_student(node *head) {
node *p = head->next;
printf("姓名\t学号\t性别\t年龄\t成绩\n");
while (p != NULL) {
printf("%s\t%d\t%s\t%d\t%f\n", p->name, p->id, p->sex, p->age, p->score);
p = p->next;
}
}
```
接下来是保存学生信息到文件的函数,它会将链表中的学生信息保存到指定的文件中。代码如下:
```c
void save_student(node *head) {
FILE *fp = fopen("student.dat", "wb");
if (fp == NULL) {
printf("文件打开失败!\n");
return;
}
node *p = head->next;
while (p != NULL) {
fwrite(p, sizeof(node), 1, fp);
p = p->next;
}
fclose(fp);
printf("保存成功!\n");
}
```
接下来是加载学生信息文件的函数,它会从指定的文件中加载学生信息并返回一个指向链表头结点的指针。代码如下:
```c
node *load_student() {
FILE *fp = fopen("student.dat", "rb");
if (fp == NULL) {
printf("文件打开失败!\n");
return NULL;
}
node *head = create_list();
node *p = head;
node *new_node;
while (!feof(fp)) {
new_node = (node*) malloc(sizeof(node));
fread(new_node, sizeof(node), 1, fp);
if (feof(fp)) {
free(new_node);
break;
}
new_node->next = NULL;
p->next = new_node;
p = p->next;
}
fclose(fp);
return head;
}
```
最后是对学生信息进行排序的函数,它可以按照学号、姓名、成绩等多种方式对学生信息进行排序。具体实现可以使用快排、冒泡排序等算法,这里不再赘述。
至此,我们已经完成了一个简单的学生信息管理系统,它可以进行学生信息的增、删、改、查、排序等操作。
阅读全文