编程实现一个简易学生信息管理系统,按如下步骤分别用自定义函数实现: (1) 根据输入信息创建单链表。每个学生的信息包括姓名和成绩(输入保持成绩升序); (2) 输入一个新增的学生信息,将其插入链表中并使链表保持升序; (3) 输出新增之后简易学生信息管理系统/单链表的所有学生/结点信息。 输入格式: 根据输入的若干个学生信息创建单链表。每一行代表一个学生信息,以成绩-1作为输入的结束;最后一行为将插入的学生信息。 输出格式: 每个学生信息占一行,姓名和成绩之间以空格分隔,成绩保留一位小数。用c语言
时间: 2023-06-02 07:07:06 浏览: 199
来实现该系统,你需要进行如下步骤:
1. 定义结构体类型,包含学生姓名和成绩两个字段;
2. 定义单链表结构体,包含一个指向头结点的指针;
3. 定义创建单链表的函数,根据输入信息创建单链表,并使链表按成绩升序排列;
4. 定义插入新节点的函数,将输入的新增学生信息插入链表,并使链表仍然保持成绩升序排列;
5. 定义输出所有节点信息的函数,按要求输出简易学生信息管理系统/单链表的所有学生/节点信息;
6. 在main函数中调用上述函数实现该系统。
下面是具体的C代码实现:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//定义学生结构体类型
typedef struct student{
char name[20]; //姓名
float score; //成绩
}Student;
//定义单链表结构体
typedef struct node{
Student stu; //学生信息
struct node* next; //指向下一个节点的指针
}Node, *LinkList;
//创建单链表,返回指向链表头结点的指针
LinkList CreateList(){
LinkList head = (LinkList)malloc(sizeof(Node)); //创建头结点
head->next = NULL; //头结点next字段设为NULL
Node *p = head; //p指向尾节点
Student stu;
while(1){ //循环输入学生信息
scanf("%f", &stu.score);
if(stu.score == -1) break; //输入-1表示结束
scanf("%s", stu.name);
//在链表尾部插入新节点,并使链表保持升序排序
Node *s = (Node*)malloc(sizeof(Node)); //创建新节点
s->stu = stu; //赋值学生信息
s->next = NULL; //新节点next字段设为NULL
while(p->next && p->next->stu.score < stu.score){
p = p->next; //找到链表中第一个score大于stu.score的结点前的结点
}
s->next = p->next; //插入新节点
p->next = s;
p = head; //重置p指向头结点
}
return head;
}
//插入新节点,将学生信息stu插入到链表head中,并使链表按成绩升序排列
void InsertNode(LinkList head, Student stu){
Node *s = (Node*)malloc(sizeof(Node)); //创建新节点
s->stu = stu; //赋值学生信息
s->next = NULL; //新节点next字段设为NULL
Node *p = head;
while(p->next && p->next->stu.score < stu.score){
p = p->next; //找到链表中第一个score大于stu.score的结点前的结点
}
s->next = p->next; //插入新节点
p->next = s;
}
//输出链表中所有节点的信息
void PrintList(LinkList head){
Node *p = head->next; //从头节点的下一个节点开始遍历
printf("简易学生信息管理系统/单链表的所有学生/结点信息:\n");
while(p){
printf("%s %.1f\n", p->stu.name, p->stu.score);
p = p->next;
}
}
int main(){
LinkList head = CreateList(); //创建链表
Student stu;
scanf("%f", &stu.score);
scanf("%s", stu.name);
InsertNode(head, stu); //插入新节点
PrintList(head); //输出链表中所有节点的信息
return 0;
}
阅读全文