c语言用链表一个班有若干名学生,学生信息包括学号、姓名和成绩,统计并输出不及格的学生信息。
时间: 2024-03-16 08:47:49 浏览: 21
好的,我来为您解答。
首先,我们需要定义一个学生结构体,包括学号、姓名和成绩:
```c
typedef struct student {
char id[10];
char name[20];
int score;
struct student *next;
} Student;
```
然后,我们需要实现一个函数,用来统计并输出不及格的学生信息。该函数定义如下:
```c
void print_failed_students(Student *head) {
Student *p = head;
while (p != NULL) {
if (p->score < 60) {
printf("学号:%s,姓名:%s,成绩:%d\n", p->id, p->name, p->score);
}
p = p->next;
}
}
```
该函数接受一个链表头指针,用来遍历整个链表。如果当前学生成绩不及格,就输出该学生的信息。
具体来说,我们使用 p 指针来遍历链表,如果当前节点的成绩不及格,就输出该学生的信息。然后,将 p 指向下一个节点,继续遍历链表。
完成上述操作后,不及格的学生信息就被输出了。
完整代码如下:
相关问题
c语言用链表一个班有若干名学生,学生信息包括学号、姓名和成绩,统计并删除不及格的学生信息。
好的,我来为您解答。
首先,我们需要定义一个学生结构体,包括学号、姓名和成绩:
```c
typedef struct student {
char id[10];
char name[20];
int score;
struct student *next;
} Student;
```
然后,我们需要实现一个函数,用来统计并删除不及格的学生信息。该函数定义如下:
```c
void delete_failed_students(Student **head) {
Student *p, *pre;
p = *head;
pre = NULL;
while (p != NULL) {
if (p->score < 60) {
if (pre == NULL) {
*head = p->next;
} else {
pre->next = p->next;
}
free(p);
p = pre == NULL ? *head : pre->next;
} else {
pre = p;
p = p->next;
}
}
}
```
该函数接受一个指向链表头指针的指针,用来修改链表头指针的值。我们使用 p 和 pre 两个指针来遍历链表,如果发现当前学生成绩不及格,就将其从链表中删除。
具体来说,如果 pre 为空指针,说明当前节点是链表头节点,需要修改链表头指针的值。否则,将 pre 的 next 指向 p 的下一个节点,即删除 p 节点。同时,释放 p 节点内存,并将 p 指向下一个节点。
如果当前节点不需要删除,就将 pre 指向当前节点,p 指向下一个节点,继续遍历链表。
完成上述操作后,不及格的学生信息就被删除了。
完整代码如下:
有3个学生,包括学号、姓名、分数,定义结构体类型数组存学生信息,使用链表输入输出学生信息。
以下是使用链表输入输出3个学生信息的C语言代码,其中包括学号、姓名、分数等信息:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义学生结构体
struct student {
int id;
char name[20];
float score;
struct student *next;
};
int main() {
// 定义3个学生结构体
struct student *head, *p, *q;
int i;
float max_score = 0;
// 输入3个学生信息
head = NULL;
for (i = 0; i < 3; i++) {
p = (struct student *)malloc(sizeof(struct student));
printf("请输入第%d个学生的学号、姓名、分数:", i+1);
scanf("%d %s %f", &p->id, p->name, &p->score);
p->next = NULL;
if (head == NULL) {
head = p;
} else {
q->next = p;
}
q = p;
if (p->score > max_score) {
max_score = p->score;
}
}
// 输出总分最高的学生信息
printf("总分最高的学生信息为:\n");
for (p = head; p != NULL; p = p->next) {
if (p->score == max_score) {
printf("学号:%d,姓名:%s,分数:%f\n", p->id, p->name, p->score);
}
}
// 输出有一科或一科以上不及格的学生信息
printf("有一科或一科以上不及格的学生信息为:\n");
for (p = head; p != NULL; p = p->next) {
if (p->score < 60) {
printf("学号:%d,姓名:%s,分数:%f\n", p->id, p->name, p->score);
}
}
// 释放内存
for (p = head; p != NULL; p = q) {
q = p->next;
free(p);
}
return 0;
}
```