请把上面3个函数组合成完整代码
时间: 2024-10-14 20:04:30 浏览: 22
以下是将上述三个函数组合到一个完整的C程序中的示例,包括输入数据、输出不及格和及格的学生,以及处理内存管理:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义学生节点结构体
typedef struct {
int student_id;
char name[20];
int math_score;
struct StudentNode* prior;
struct StudentNode* next;
} StudentNode;
// 创建新节点并输入学生数据
void input_students(StudentNode** head) {
int id, score;
scanf("%d %s %d", &id, name, &score);
StudentNode* newNode = (StudentNode*)malloc(sizeof(StudentNode));
newNode->student_id = id;
strncpy(newNode->name, name, sizeof(newNode->name));
newNode->math_score = score;
newNode->prior = NULL;
newNode->next = *head;
if (*head != NULL) {
(*head)->prior = newNode;
}
*head = newNode;
}
// 输出不及格学生
void output_ungraded_students(StudentNode* head) {
while (head != NULL && head->math_score < 60) {
printf("学号:%d 姓名:%s 成绩:%d\n", head->student_id, head->name, head->math_score);
head = head->next;
}
}
// 输出及格学生
void output_graded_students(StudentNode* tail) {
while (tail != NULL && tail->math_score >= 60) {
printf("学号:%d 姓名:%s 成绩:%d\n", tail->student_id, tail->name, tail->math_score);
tail = tail->prior;
}
}
int main() {
// 初始化链表头指针为NULL
StudentNode* head = NULL;
// 输入5个学生数据
for (int i = 1; i <= 5; ++i) {
input_students(&head);
}
// 输出不及格学生
output_ungraded_students(head);
// 及格学生不需要特殊处理,因为输出已经包含了所有学生,只要在main函数结束前不再输出即可
// 清理内存 - 由于这里是演示代码,实际上在实际项目中应该使用更复杂的内存清理策略,比如遍历整个链表并释放每个节点
// 在本例中略去,因为实际应用中通常会考虑使用智能指针或者在输入阶段就分配好固定大小的数组
// 学生Node* temp;
// while (head != NULL) {
// temp = head;
// head = head->next;
// free(temp);
// }
return 0;
}
```
请注意,这只是一个基础示例,实际应用中你可能需要处理更多边缘情况,如用户输入错误等,并且在处理完链表后释放内存以防止内存泄漏。
阅读全文