用c语言打出设计一个完整的程序,根据用户输入学生的人数n(n>2)以及每个学生的学号、姓名和成绩建立一个单链表,统计单链表存储的学生人数,输出所有学生信息,删除指定位置的元素。
时间: 2024-05-02 11:22:07 浏览: 98
学生成绩管理系统.doc
5星 · 资源好评率100%
这里给出一个示例代码,仅供参考:
```c
#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(int id, char *name, float score) {
Student *node = (Student*)malloc(sizeof(Student));
node->id = id;
strcpy(node->name, name); // 注意:字符串必须使用strcpy函数进行复制
node->score = score;
node->next = NULL;
return node;
}
// 添加节点到链表末尾
void addStudent(Student **head, Student *node) {
if (*head == NULL) { // 如果链表为空,直接将新节点作为头节点
*head = node;
} else {
Student *p = *head;
while (p->next != NULL) { // 找到链表末尾
p = p->next;
}
p->next = node; // 将新节点添加到末尾
}
}
// 删除指定位置的节点
void deleteStudent(Student **head, int index) {
if (*head == NULL) { // 如果链表为空,直接返回
return;
}
Student *p = *head;
if (index == 0) { // 如果删除头节点
*head = (*head)->next;
free(p);
return;
}
for (int i = 0; i < index - 1 && p != NULL; i++) { // 找到待删除节点的前一个节点
p = p->next;
}
if (p == NULL || p->next == NULL) { // 如果索引超出范围,直接返回
return;
}
Student *q = p->next; // 待删除节点
p->next = q->next; // 将待删除节点的下一个节点接到它的前一个节点
free(q); // 释放待删除节点的内存
}
int main() {
int n;
printf("请输入学生人数:");
scanf("%d", &n);
if (n <= 2) {
printf("学生人数必须大于2!\n");
return 1;
}
Student *head = NULL; // 链表头节点
for (int i = 0; i < n; i++) {
int id;
char name[20];
float score;
printf("请输入学号、姓名和成绩(用空格分隔):");
scanf("%d %s %f", &id, name, &score);
Student *node = createStudent(id, name, score);
addStudent(&head, node);
}
// 统计学生人数
int count = 0;
Student *p = head;
while (p != NULL) {
count++;
p = p->next;
}
printf("学生人数:%d\n", count);
// 输出所有学生信息
p = head;
while (p != NULL) {
printf("学号:%d,姓名:%s,成绩:%.2f\n", p->id, p->name, p->score);
p = p->next;
}
// 删除指定位置的元素
int index;
printf("请输入要删除的学生索引(从0开始):");
scanf("%d", &index);
deleteStudent(&head, index);
// 输出删除后的所有学生信息
p = head;
while (p != NULL) {
printf("学号:%d,姓名:%s,成绩:%.2f\n", p->id, p->name, p->score);
p = p->next;
}
// 释放链表内存
p = head;
while (p != NULL) {
Student *q = p;
p = p->next;
free(q);
}
return 0;
}
```
阅读全文