用c语言设计一个完整的程序,根据用户输入学生的人数n(n>2)以及每个学生的学号、姓名和成绩建立一个单链表,统计单链表存储的学生人数,输出所有学生信息,删除指定位置的元素。
时间: 2024-05-12 20:19:53 浏览: 118
学生成绩管理系统(单链表)(C语言)
5星 · 资源好评率100%
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 学生结构体
typedef struct Student {
int id; // 学号
char name[20]; // 姓名
float score; // 成绩
struct Student *next; // 指向下一个学生的指针
} Student;
// 创建学生节点
Student *createStudent() {
Student *stu = (Student *)malloc(sizeof(Student));
printf("请输入学号:");
scanf("%d", &stu->id);
printf("请输入姓名:");
scanf("%s", stu->name);
printf("请输入成绩:");
scanf("%f", &stu->score);
stu->next = NULL;
return stu;
}
// 添加学生节点
void addStudent(Student **head) {
Student *stu = createStudent();
if (*head == NULL) { // 如果链表为空,直接将新节点作为头节点
*head = stu;
} else { // 如果链表不为空,遍历到尾部,将新节点插入
Student *p = *head;
while (p->next != NULL) {
p = p->next;
}
p->next = stu;
}
}
// 统计学生人数
int countStudent(Student *head) {
int count = 0;
Student *p = head;
while (p != NULL) {
count++;
p = p->next;
}
return count;
}
// 输出学生信息
void printStudent(Student *stu) {
printf("学号:%d\t姓名:%s\t成绩:%.1f\n", stu->id, stu->name, stu->score);
}
// 输出所有学生信息
void printAllStudent(Student *head) {
Student *p = head;
while (p != NULL) {
printStudent(p);
p = p->next;
}
}
// 删除指定位置的学生节点
void deleteStudent(Student **head, int pos) {
if (*head == NULL) { // 如果链表为空,直接返回
printf("链表为空,无法删除!\n");
return;
}
if (pos < 1 || pos > countStudent(*head)) { // 如果位置不合法,直接返回
printf("位置不合法!\n");
return;
}
if (pos == 1) { // 如果删除头节点
Student *p = *head;
*head = (*head)->next;
free(p);
} else { // 如果删除中间或尾部节点
Student *p = *head;
int i = 1;
while (i < pos - 1) {
p = p->next;
i++;
}
Student *q = p->next;
p->next = q->next;
free(q);
}
}
int main() {
int n;
printf("请输入学生人数:");
scanf("%d", &n);
if (n < 3) { // 如果人数不足3人,直接退出程序
printf("学生人数不足3人,无法建立链表!\n");
return 0;
}
Student *head = NULL;
for (int i = 0; i < n; i++) {
addStudent(&head);
}
printf("学生人数为:%d\n", countStudent(head));
printf("所有学生信息如下:\n");
printAllStudent(head);
int pos;
printf("请输入要删除的学生位置:");
scanf("%d", &pos);
deleteStudent(&head, pos);
printf("删除后的所有学生信息如下:\n");
printAllStudent(head);
return 0;
}
```
阅读全文