建立学生成绩链表需要定义一个结构体来存储学生信息,并通过链表操作实现数据的增删改查功能。以下是具体步骤和示例代码:
一、定义链表节点结构体
每个节点包含学号、成绩数组及指向下一个节点的指针。例如:
```c
typedef struct Student {
int number; // 学号
float score; // 3门课成绩
struct Student *next; // 指向下一个节点的指针
} Student;
```
二、创建链表函数
定义头指针并初始化为`NULL`
在链表头部或指定位置插入新节点
根据学号或位置删除节点
按学号或成绩排序后输出所有节点信息
三、示例代码实现
以下是一个完整的示例代码,包含链表创建、插入、删除、排序和输出功能:
```c
include include // 定义链表节点结构体 typedef struct Student { int number; // 学号 float score; // 3门课成绩 struct Student *next; // 指向下一个节点的指针 } Student; // 创建链表函数 Student* create() { Student *head = NULL, *p = NULL; int n; printf("输入学生人数(输入0结束):"); scanf("%d", &n); while (n != 0) { p = (Student *)malloc(sizeof(Student)); if (p == NULL) { printf("内存分配失败 "); exit(1); } printf("输入学号:"); scanf("%d", &p->number); printf("输入3门课成绩:"); for (int i = 0; i < 3; i++) { scanf("%f", &p->score[i]); } p->next = head; head = p; printf("是否继续输入?(1是,0结束):"); scanf("%d", &n); } return head; }
// 按成绩排序链表(冒泡排序)
void sort(Student *head) {
if (head == NULL || head->next == NULL) return;
Student *p = head, *q = NULL, *temp;
do {
q = p->next;
p->next = NULL;
temp = q->next;
while (temp != NULL) {
if (temp->score > q->score) {
p->next = temp;
q->next = temp->next;
temp->next = q;
} else {
p = p->next;
}
temp = temp->next;
}
} while (p != NULL);
}
// 输出链表信息
void print(Student *head) {
Student *p = head;
printf("学号t语文t数学t英语t平均分
");
while (p != NULL) {
printf("%dt%.2ft%.2ft%.2ft%.2f
", p->number, p->score, p->score, p->score, (p->score + p->score + p->score) / 3);
p = p->next;
}
}
// 删除指定学号的节点
void delete(Student head, int number) {
Student *p = *head, *prev = NULL;
while (p != NULL && p->number != number) {
prev = p;
p = p->next;
}
if (p == NULL) return;
if (prev == NULL) {
*head = p->next;
} else {
prev->next = p->next;
}
free(p);
}
// 主函数
int main() {
Student *head = create();
printf("学生成绩链表已建立
");
sort(head);
print(head);
int choice, number;
while (1) {
printf("
学生成绩管理系统
1. 添加学生
2. 删除学生
3. 输出所有学生
4. 退出
");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("输入学号:");
scanf("%d", &number);
delete(&head, number);
break;
case 2:
printf("输入学号:");
scanf("%