求一个包含学生信息(学号,姓名,成绩)的单链表代码,使其具有如下功能: (1) 根据指定学生个数,逐个输入学生信息; (2) 逐个显示学生表中所有学生的相关信息; (3) 根据姓名进行查找,返回此学生的学号和成绩; (4) 根据指定的位置可返回相应的学生信息(学号,姓名,成绩); (5) 给定一个学生信息,插入到表中指定的位置; (6) 删除指定位置的学生记录; (7) 统计表中学生个数。
时间: 2023-04-11 08:00:57 浏览: 136
以下是一个包含学生信息的单链表代码,具有如下功能:
(1) 根据指定学生个数,逐个输入学生信息;
(2) 逐个显示学生表中所有学生的相关信息;
(3) 根据姓名进行查找,返回此学生的学号和成绩;
(4) 根据指定的位置可返回相应的学生信息(学号,姓名,成绩);
(5) 给定一个学生信息,插入到表中指定的位置;
(6) 删除指定位置的学生记录;
(7) 统计表中学生个数。
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义学生结构体
typedef struct student {
int id; // 学号
char name[20]; // 姓名
int score; // 成绩
struct student *next; // 指向下一个学生的指针
} Student;
// 创建一个新的学生节点
Student *create_student(int id, char *name, int score) {
Student *s = (Student *)malloc(sizeof(Student));
s->id = id;
strcpy(s->name, name);
s->score = score;
s->next = NULL;
return s;
}
// 根据指定学生个数,逐个输入学生信息
Student *input_students(int n) {
Student *head = NULL, *tail = NULL;
int i, id, score;
char name[20];
for (i = 0; i < n; i++) {
printf("请输入第%d个学生的学号、姓名、成绩:", i + 1);
scanf("%d %s %d", &id, name, &score);
Student *s = create_student(id, name, score);
if (head == NULL) {
head = tail = s;
} else {
tail->next = s;
tail = s;
}
}
return head;
}
// 逐个显示学生表中所有学生的相关信息
void print_students(Student *head) {
Student *p = head;
while (p != NULL) {
printf("%d %s %d\n", p->id, p->name, p->score);
p = p->next;
}
}
// 根据姓名进行查找,返回此学生的学号和成绩
void find_student_by_name(Student *head, char *name) {
Student *p = head;
while (p != NULL) {
if (strcmp(p->name, name) == 0) {
printf("%s的学号是%d,成绩是%d\n", name, p->id, p->score);
return;
}
p = p->next;
}
printf("没有找到姓名为%s的学生\n", name);
}
// 根据指定的位置可返回相应的学生信息(学号,姓名,成绩)
Student *get_student_by_position(Student *head, int pos) {
Student *p = head;
int i;
for (i = 1; i < pos && p != NULL; i++) {
p = p->next;
}
if (p == NULL) {
printf("没有找到第%d个学生\n", pos);
} else {
printf("第%d个学生是:%d %s %d\n", pos, p->id, p->name, p->score);
}
return p;
}
// 给定一个学生信息,插入到表中指定的位置
void insert_student(Student **head, int pos, int id, char *name, int score) {
Student *s = create_student(id, name, score);
if (pos == 1) {
s->next = *head;
*head = s;
} else {
Student *p = get_student_by_position(*head, pos - 1);
if (p != NULL) {
s->next = p->next;
p->next = s;
}
}
}
// 删除指定位置的学生记录
void delete_student(Student **head, int pos) {
if (pos == 1) {
Student *p = *head;
*head = (*head)->next;
free(p);
} else {
Student *p = get_student_by_position(*head, pos - 1);
if (p != NULL && p->next != NULL) {
Student *q = p->next;
p->next = q->next;
free(q);
}
}
}
// 统计表中学生个数
int count_students(Student *head) {
int count = 0;
Student *p = head;
while (p != NULL) {
count++;
p = p->next;
}
return count;
}
int main() {
Student *head = NULL;
int choice, n, pos, id, score;
char name[20];
while (1) {
printf("请选择操作:\n");
printf("1. 根据指定学生个数,逐个输入学生信息\n");
printf("2. 逐个显示学生表中所有学生的相关信息\n");
printf("3. 根据姓名进行查找,返回此学生的学号和成绩\n");
printf("4. 根据指定的位置可返回相应的学生信息(学号,姓名,成绩)\n");
printf("5. 给定一个学生信息,插入到表中指定的位置\n");
printf("6. 删除指定位置的学生记录\n");
printf("7. 统计表中学生个数\n");
printf("0. 退出程序\n");
printf("请输入操作编号:");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("请输入学生个数:");
scanf("%d", &n);
head = input_students(n);
break;
case 2:
print_students(head);
break;
case 3:
printf("请输入要查找的学生姓名:");
scanf("%s", name);
find_student_by_name(head, name);
break;
case 4:
printf("请输入要查找的学生位置:");
scanf("%d", &pos);
get_student_by_position(head, pos);
break;
case 5:
printf("请输入要插入的学生位置、学号、姓名、成绩:");
scanf("%d %d %s %d", &pos, &id, name, &score);
insert_student(&head, pos, id, name, score);
break;
case 6:
printf("请输入要删除的学生位置:");
scanf("%d", &pos);
delete_student(&head, pos);
break;
case 7:
printf("学生个数为%d\n", count_students(head));
break;
case 0:
return 0;
default:
printf("无效的操作编号,请重新输入!\n");
break;
}
}
}
阅读全文