学生成绩管理系统链表示例代码
时间: 2024-06-17 18:00:42 浏览: 158
学生成绩管理系统是一个比较典型的应用系统,它需要完成学生信息的管理,包括学生的基本信息和成绩信息的管理。通常情况下,学生成绩管理系统是以链表的形式来实现的。
下面是一个简单的链表表示例代码:
```c
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//定义学生信息结构体
struct student{
char name[20]; //姓名
int num; //学号
int grade; //成绩
struct student *next; //指向下一个节点的指针
};
//定义全局变量,指向链表头节点
struct student *head = NULL;
//插入函数,在链表尾部插入节点
void insert(struct student *node){
struct student *p;
if(head == NULL){ //如果链表为空,则该节点为第一个节点
head = node;
head->next = NULL;
}
else{ //否则遍历链表找到最后一个节点,将新节点插入到其后面
p = head;
while(p->next != NULL){
p = p->next;
}
p->next = node;
node->next = NULL;
}
}
//删除函数,根据学号来删除节点
void delete(int num){
struct student *p, *q;
if(head == NULL){ //如果链表为空,则不需要删除
printf("The list is empty.\n");
return;
}
p = head;
while(p->num != num && p->next != NULL){ //遍历链表找到要删除的节点
q = p;
p = p->next;
}
if(p->num == num){ //如果找到了要删除的节点,则删除它
if(p == head){ //如果要删除的是头节点,则将头节点指向其后面的节点
head = p->next;
}
else{ //否则将其前面节点的指针指向其后面节点
q->next = p->next;
}
free(p);
printf("Delete success.\n");
}
else{ //如果没有找到要删除的节点,则输出错误信息
printf("The student is not found.\n");
}
}
//修改函数,根据学号来修改成绩
void update(int num, int grade){
struct student *p;
if(head == NULL){ //如果链表为空,则不需要修改
printf("The list is empty.\n");
return;
}
p = head;
while(p != NULL){ //遍历链表找到要修改的节点
if(p->num == num){
p->grade = grade;
printf("Update success.\n");
return;
}
p = p->next;
}
printf("The student is not found.\n"); //如果没有找到要修改的节点,则输出错误信息
}
//查询函数,根据学号来查找成绩
void search(int num){
struct student *p;
if(head == NULL){ //如果链表为空,则不需要查找
printf("The list is empty.\n");
return;
}
p = head;
while(p != NULL){ //遍历链表找到要查找的节点
if(p->num == num){
printf("Name: %s\n", p->name);
printf("Number: %d\n", p->num);
printf("Grade: %d\n", p->grade);
return;
}
p = p->next;
}
printf("The student is not found.\n"); //如果没有找到要查找的节点,则输出错误信息
}
//打印函数,遍历链表打印所有学生信息
void print(){
struct student *p;
if(head == NULL){ //如果链表为空,则不需要打印
printf("The list is empty.\n");
return;
}
p = head;
while(p != NULL){ //遍历链表打印每个学生的信息
printf("Name: %s\n", p->name);
printf("Number: %d\n", p->num);
printf("Grade: %d\n", p->grade);
p = p->next;
}
}
int main(){
struct student *node;
int choice, num, grade;
char name[20];
while(1){ //循环显示菜单,等待用户输入操作选项
printf("\n1.Insert\n2.Delete\n3.Update\n4.Search\n5.Print\n6.Exit\n");
printf("Please input your choice:");
scanf("%d", &choice);
switch(choice){
case 1: //插入操作,读入学生信息并创建新节点插入到链表尾部
node = (struct student*)malloc(sizeof(struct student));
printf("Name:");
scanf("%s", node->name);
printf("Number:");
scanf("%d", &node->num);
printf("Grade:");
scanf("%d", &node->grade);
insert(node);
break;
case 2: //删除操作,读入要删除的学生学号并调用delete函数进行删除操作
printf("Number:");
scanf("%d", &num);
delete(num);
break;
case 3: //修改操作,读入要修改的学生学号和新成绩并调用update函数进行修改操作
printf("Number:");
scanf("%d", &num);
printf("Grade:");
scanf("%d", &grade);
update(num, grade);
break;
case 4: //查找操作,读入要查找的学生学号并调用search函数进行查找操作
printf("Number:");
scanf("%d", &num);
search(num);
break;
case 5: //打印操作,调用print函数打印所有学生信息
print();
break;
case 6: //退出程序
exit(0);
default:
printf("Invalid input.\n");
break;
}
}
return 0;
}
```
阅读全文