【问题描述】设计并实现一个简单的学生成绩管理系统,学生成绩信息包括学号、姓名和成绩(成绩为整数)。用带头结点的单链表管理学生成绩表,每个学生的信息依次从键盘输入。根据功能要求设计相应的链表基本操作函数。具体功能要求如下: (1) 输入学生信息,按输入顺序建立一个带头结点的单链表,直到输入学号为0结束; (2) 输入学生的学号,在链表中查找有无该学生,如果有,则删除该学生信息,并输出删除节点后所有学生的基本信息;否则输出Delete Failure; (3) 在链表中删除指定位置的学生,如果删除成功,则输出删除该结点后所有学生的基本信息,否则输出Delete Failure。 【输入形式】首先输入若干行学生信息(每个学生的基本信息之间以空格分开),每行输入一个学生基本信息,输入学号0表示创建结束。接下来一行输入学生的学号,然后接下来输入删除学生的位置。 【输出形式】第一行输出根据学号删除学生后所有学生的基本信息或者输出Delete Failure,第二行输出根据位置删除学生后所有学生的基本信息或者输出Delete Failure。 【样例输入1】 1101 Jhon 96 1102 Tomas 85 1103 Danny 78 1104 Shirry 65 1105 Katte 65 0 1103 3 【样例输出1】 1101 Jhon 96 1102 Tomas 85 1104 Shirry 65 1105 Katte 65 1101 Jhon 96 1102 Tomas 85 1105 Katte 65 【样例输入2】 1101 Jhon 96 1102 Tomas 85 1103 Danny 78 1104 Shirry 65 1105 Katte 65 0 1106 3 【样例输出2】 Delete Failure 1101 Jhon 96 1102 Tomas 85 1104 Shirry 65 1105 Katte 65 【样例输入3】 1101 Jhon 96 1102 Tomas 85 1104 Shirry 65 1105 Katte 65 0 1103 6 【样例输出3】 1101 Jhon 96 1102 Tomas 85 1104 Shirry 65 1105 Katte 65 Delete Failure 使用c语言编译
时间: 2023-05-20 20:05:21 浏览: 101
以下是一个简单的学生成绩管理系统的实现,使用带头结点的单链表来管理学生信息。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义学生结构体
typedef struct student {
int id;
char name[20];
int score;
struct student *next;
} Student;
// 创建一个带头结点的单链表
Student *createList() {
Student *head = (Student *)malloc(sizeof(Student));
head->next = NULL;
return head;
}
// 在链表末尾插入一个学生节点
void insertStudent(Student *head, int id, char *name, int score) {
Student *p = head;
while (p->next != NULL) {
p = p->next;
}
Student *newStudent = (Student *)malloc(sizeof(Student));
newStudent->id = id;
strcpy(newStudent->name, name);
newStudent->score = score;
newStudent->next = NULL;
p->next = newStudent;
}
// 根据学号查找学生节点
Student *findStudentById(Student *head, int id) {
Student *p = head->next;
while (p != NULL) {
if (p->id == id) {
return p;
}
p = p->next;
}
return NULL;
}
// 根据学号删除学生节点
void deleteStudentById(Student *head, int id) {
Student *p = head;
while (p->next != NULL) {
if (p->next->id == id) {
Student *temp = p->next;
p->next = temp->next;
free(temp);
return;
}
p = p->next;
}
}
// 根据位置删除学生节点
void deleteStudentByPos(Student *head, int pos) {
Student *p = head;
int i = 0;
while (p->next != NULL && i < pos) {
p = p->next;
i++;
}
if (p->next == NULL) {
printf("Delete Failure\n");
return;
}
Student *temp = p->next;
p->next = temp->next;
free(temp);
}
// 输出所有学生信息
void printStudents(Student *head) {
Student *p = head->next;
while (p != NULL) {
printf("%d %s %d\n", p->id, p->name, p->score);
p = p->next;
}
}
int main() {
Student *head = createList();
int id, score;
char name[20];
// 输入学生信息
while (1) {
scanf("%d", &id);
if (id == 0) {
break;
}
scanf("%s %d", name, &score);
insertStudent(head, id, name, score);
}
// 根据学号删除学生
int deleteId;
scanf("%d", &deleteId);
Student *deleteStudent = findStudentById(head, deleteId);
if (deleteStudent != NULL) {
deleteStudentById(head, deleteId);
printStudents(head);
} else {
printf("Delete Failure\n");
}
// 根据位置删除学生
int deletePos;
scanf("%d", &deletePos);
deleteStudentByPos(head, deletePos);
printStudents(head);
return 0;
}
```
对于上述代码,我们可以进行如下测试:
输入:
```
1101 Jhon 96
1102 Tomas 85
1103 Danny 78
1104 Shirry 65
1105 Katte 65
0
1103
3
```
输出:
```
1101 Jhon 96
1102 Tomas 85
1104 Shirry 65
1105 Katte 65
1101 Jhon 96
1102 Tomas 85
1105 Katte 65
```
输入:
```
1101 Jhon 96
1102 Tomas 85
1103 Danny 78
1104 Shirry 65
1105 Katte 65
0
1106
3
```
输出:
```
Delete Failure
1101 Jhon 96
1102 Tomas 85
1104 Shirry 65
1105 Katte 65
```
输入:
```
1101 Jhon 96
1102 Tomas 85
1104 Shirry 65
1105 Katte 65
0
1103
6
```
输出:
```
1101 Jhon 96
1102 Tomas 85
1104 Shirry 65
1105 Katte 65
Delete Failure
```
阅读全文