编程实现一个简易学生信息管理系统,按如下步骤分别用自定义函数实现:
(1) 根据输入信息创建单链表。每个学生的信息包括姓名和成绩(成绩以升序输入);
(2) 输入一个学生的姓名,将所有同名学生信息/结点删除;
(3) 输出上述两步处理之后的简易学生信息管理系统/单链表的所有学生/结点信息。
输入格式:
根据输入的若干个学生信息创建单链表。每一行代表一个学生信息,以成绩-1作为输入的结束;最后一行为将删除的学生姓名。
输出格式:
每个学生信息占一行,姓名和成绩之间以空格分隔,成绩保留一位小数。
输入样例1:
在这里给出一组输入。例如:
Cai 61.2
Cai 64.6
Cheng 68.4
Xiao 71.2
Zhang 83.2
Liu 90.4
Xiao 92.6
Cai 96.8
xx -1
Cai
输出样例1:
在这里给出相应的输出。例如:
Cheng 68.4
Xiao 71.2
Zhang 83.2
Liu 90.4
Xiao 92.6
输入样例2:
在这里给出一组输入。例如:
xx -1
Cai
输出样例2:
在这里给出相应的输出。例如:
-1
代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct stu
{
char name[10];
float score;
struct stu* next;
};
struct stu* creat();
struct stu* del(struct stu* head);
void print(struct stu* head);
int main()
{
struct stu* p1;
p1 = creat();
struct stu* p2 = del(p1);
print(p2);
return 0;
}
struct stu* creat()
{
struct stu* head = NULL;//注意这里的head指针和tail指针要置空
struct stu* tail = NULL;
struct stu* pnew;
pnew = (struct stu*)malloc(sizeof(struct stu));
scanf("%s%f", pnew->name, &pnew->score);
while(pnew->score != -1)
{
if(head == NULL)
{
head = pnew;
tail = pnew;
}
else
{
tail->next = pnew;
tail = pnew;
}
pnew = (struct stu*)malloc(sizeof(struct stu));
scanf("%s%f", pnew->name, &pnew->score);
}
return head;
}
struct stu* del(struct stu* head)
{
char dname[10];
scanf("%s", dname);
struct stu* p1, *p2;
p1 = p2 = head;
while(p1 != NULL)//遍历链表
{
if(strcmp(p1->name, dname) == 0)//遇到要删除的数据时
{
if(p1 == head)//要删除的数据刚好在头节点
{
head = head->next;//头指针向后指
free(p1);//释放掉要删除的节点
p1 = head;//注意此时p1指针要重新指向头结点
continue;
}
else//要删除的数据不在头节点
{
p2->next = p1->next;//p2的next区指向(链接)p1所指向的节点的后一个
free(p1);
p1 = p2->next;//注意释放掉p1所指向的节点后,p1要指向p2的后一个节点
continue;
}
}
p2 = p1;//p2为前驱指针(即p2指向要删除的节点的前一个节点)
p1 = p1->next;//p1往后移动
}
return head;
}
void print(struct stu* head)
{
struct stu* cur = head;
if(cur == NULL)
{
printf("-1");
}
else
{
while(cur)
{
printf("%s %.1f\n", cur->name, cur->score);
cur = cur->next;
}
}
}