建立一个学生成绩信息(包括学号、姓名、成绩)的单向链表,学生数据按学号由小到大顺序排列,要求实现对成绩信息的插入、修改、删除和遍历操作。 输入格式: 根据输入的若干个学生信息创建单链表。每一行代表一个学生信息,以学号0作为输入的结束。 输入将要插入的学生信息(学号、姓名、成绩) 输入要修改的学生学号,以及学生成绩。 输入要删除的学生学号。 输出格式: 完成插入、修改、删除之后的所有学生信息,每个学生信息占一行,姓名和成绩之间以空格分隔,成绩保留一位小数。用c语言
时间: 2023-06-09 09:08:32 浏览: 231
实现如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* 学生信息结构体 */
typedef struct student {
int id; // 学号
char name[20]; // 姓名
float score; // 成绩
struct student *next; // 指向下一节点的指针
} Student;
/* 创建学生信息链表 */
void create_list(Student **head) {
/* 头节点为空时初始化链表 */
if (*head == NULL) {
*head = (Student *)malloc(sizeof(Student));
(*head)->next = NULL;
}
/* 尾插法插入节点 */
Student *p, *tail = *head;
while (1) {
p = (Student *)malloc(sizeof(Student)); // 创建新节点
printf("学号(输入 0 结束输入):");
scanf("%d", &p->id);
if (p->id == 0) { // 输入 0 结束创建
free(p);
break;
}
printf("姓名:");
scanf("%s", p->name);
printf("成绩:");
scanf("%f", &p->score);
tail->next = p;
p->next = NULL;
tail = p;
}
}
/* 打印学生信息链表 */
void print_list(Student *head) {
Student *p = head->next;
while (p != NULL) {
printf("%d %s %.1f\n", p->id, p->name, p->score);
p = p->next;
}
}
/* 插入学生信息节点 */
void insert_list(Student *head) {
Student *p, *pre = head;
p = (Student *)malloc(sizeof(Student));
printf("输入要插入的学生信息(学号、姓名、成绩):");
scanf("%d%s%f", &p->id, p->name, &p->score);
/* 找到插入位置 */
while (pre->next != NULL && pre->next->id < p->id) {
pre = pre->next;
}
/* 插入节点 */
p->next = pre->next;
pre->next = p;
}
/* 修改学生信息节点 */
void modify_list(Student *head) {
int id;
float score;
printf("输入要修改的学生学号及学生成绩:");
scanf("%d%f", &id, &score);
Student *p = head->next;
while (p != NULL) {
if (p->id == id) { // 找到节点
p->score = score; // 修改成绩
return;
}
p = p->next;
}
printf("修改失败,未找到该学生信息\n");
}
/* 删除学生信息节点 */
void delete_list(Student *head) {
int id;
printf("输入要删除的学生学号:");
scanf("%d", &id);
Student *p = head->next, *pre = head;
while (p != NULL) {
if (p->id == id) { // 找到节点
pre->next = p->next; // 删除节点
free(p);
printf("删除成功\n");
return;
}
pre = p;
p = p->next;
}
printf("删除失败,未找到该学生信息\n");
}
int main() {
Student *head = NULL; // 头节点指针初始化为空
create_list(&head);
printf("初始学生信息为:\n");
print_list(head);
insert_list(head);
printf("插入后的学生信息为:\n");
print_list(head);
modify_list(head);
printf("修改后的学生信息为:\n");
print_list(head);
delete_list(head);
printf("删除后的学生信息为:\n");
print_list(head);
return 0;
}
阅读全文