问题描述
请设计一个简单的学生成绩管理系统,要求系统实现以下功能:
学生信息包括学号、姓名、性别、语文、数学、英语。
插入学生信息:
Insert id name sex x y z 其中的参数分别为学号、姓名、性别、三门课的成绩,成绩为浮点数。如果链表中已经存在相同学号的学生信息,插入失败。
输出所有学生信息:
List
按照学号从小到大的顺序输出所有学生的信息,每行一位学生的信息。每行的格式如下:
id name sex x y z
数据之间用一个空格分隔,成绩保留1位小数。
查找学生信息:
Find id
查找学号为id的学生信息。
修改学生信息:
Change id newname,newx,newy,newz
把学号为id的学生信息修改为newname,newx,newy,newz(学号保持不变)
删除学生信息:
Delete id
删除学号为id的学生信息
退出程序:
Quit或者Exit
输入
输入有多行,每行一条指令,指令格式如下:
Insert id name sex x y z
插入学生信息,分别为学号、姓名、性别和三门课的成绩。
List
按照学号从小到大的输出所有学生信息。
Find id
查找学号为id的学生信息。
Change id newname,newx,newy,newz
把学号为id的学生信息修改为newname,newx,newy,newz(学号保持不变)
Delete id
删除学号为id的学生信息
Quit或者Exit
输出"Good bye!"后结束程序。
输出
输出有多行,对应命令的输出如下:
Insert id name sex x y z
插入后先在单独的一行输出"Insert:"。
第二行中显示信息如下:如果链表中已经存在相同学号的学生信息,插入失败,显示"Failed"。否则插入并显示学生信息,数据之间用一个空格分开,成绩保留1位小数。
List
第一行输出"List:",接下来按照学号从小到大的顺序输出所有学生的信息,每行一位学生的信息。每行的格式如下:
id name sex x y z
数据之间一个空格,成绩保留1位小数。
Find id
第一行显示”Find:",第二行显示格式如下:
如果找到学号为id的学生,则在单独一行中显示学生信息,格式如List。否则在单独一行显示"Failed"。
Change id newname,newx,newy,newz
第一行显示"Change:"。如果链表中不存在学号为id的学生,显示"Failed"。否则修改该学生信息并在单独一行中显示该生信息,显示格式如List命令。
Delete id
第一行显示"Delete:"。如果链表中不存在学号为id的学生,显示"Failed"。否则修改该学生信息并在单独一行中显示"Deleted"
Quit或者Exit
在单独一行中输出"Good bye!"后结束程序。
输入样列
Insert 0911002 zhaoliu F 97 90 55
Insert 0911001 zhangsan F 87 78 65
Insert 0911001 zhangsan F 87 78 65
Insert 0911003 Lisi F 77 72 55
Change 0911001 Zhangsan M 77 78 65
Change 0911004 Wangwu M 77 78 65
Insert 0911004 Wangwu F 68 56 95
Find 0911004
List
Delete 0911004
Delete 0911004
List
Quit
输出样例
Insert:
0911002 zhaoliu F 97.0 90.0 55.0
Insert:
0911001 zhangsan F 87.0 78.0 65.0
Insert:
Failed
Insert:
0911003 Lisi F 77.0 72.0 55.0
Change:
0911001 Zhangsan M 77.0 78.0 65.0
Change:
Failed
Insert:
0911004 Wangwu F 68.0 56.0 95.0
Find:
0911004 Wangwu F 68.0 56.0 95.0
List:
0911001 Zhangsan M 77.0 78.0 65.0
0911002 zhaoliu F 97.0 90.0 55.0
0911003 Lisi F 77.0 72.0 55.0
0911004 Wangwu F 68.0 56.0 95.0
Delete:
Deleted
Delete:
Failed
List:
0911001 Zhangsan M 77.0 78.0 65.0
0911002 zhaoliu F 97.0 90.0 55.0
0911003 Lisi F 77.0 72.0 55.0
Good bye!
#include<bits/stdc++.h>
using namespace std;
typedef struct Student{
char id[20];
char name[20];
char sex[2];
double x,y,z;
struct Student *next;
}Student;
void inputSingle(Student *s)
{
int j;
scanf("%s %s %s",s->id,s->name,s->sex);
scanf("%lf %lf %lf",&s->x,&s->y,&s->z);
}
void outputSingle(Student *s)
{
int j;
printf("%s %s %s ",s->id,s->name,s->sex);
printf("%.1f %.1f %.1f\n",s->x,s->y,s->z);
}
Student* createList()
{
Student *L;
L=(Student *)malloc(sizeof(Student));
L->next=NULL;
return L;
}
void insert(Student *L,Student *S,char id[])
{
Student *pre,*p,*s;
pre=L;
p=L->next;
while(p!=NULL&&p->id<id){
pre=p;
p=p->next;
}
s->next=pre->next;
pre->next=s;
}
void outputList(Student *L)
{
Student *p;
p=L->next;
while(p!=NULL){
outputSingle(p);
p=p->next;
}
}
int Find(Student *L,char id[])
{
Student *pre,*p;
pre=L;
p=L->next;
while(p!=NULL&&strcmp(p->id,id)!=0){
pre=p;
p=p->next;
}
if(p==NULL){
puts("Failed");
return 0;
}
else{
outputSingle(p);
return 1;
}
}
int Change(Student *L,char id[],char name[],char sex[],double x,double y,double z)
{
Student *pre,*p;
pre=L;
p=L->next;
while(p!=NULL&&strcmp(p->id,id)!=0){
pre=p;
p=p->next;
}
if(p==NULL){
puts("Failed");
return 0;
}
else if(strcmp(p->name,name)!=0||strcmp(p->sex,sex)!=0||p->x!=x||p->y!=y||p->z!=z){
strcpy(p->name,name);
strcpy(p->sex,sex);
p->x=x,p->y=y,p->z=z;
outputSingle(p);
return 1;
}
}
int Delete(Student *L,char id[])
{
Student *pre,*p;
pre=L;
p=L->next;
while(p!=NULL&&strcmp(p->id,id)!=0){
pre=p;
p=p->next;
}
if(p==NULL){
puts("Failed");
return 0;
}
else{
pre->next=p->next;
free(p);
puts("Deleted");
return 1;
}
}
int main()
{
string order;
Student *L,*s;
L=createList();
char id[20];
char name[20];
char sex[2];
double x,y,z;
while(1){
cin>>order;
if(order=="Insert"){
puts("Insert:");
cin>>id;
s=(Student *)malloc(sizeof(Student));
inputSingle(s);
outputSingle(s);
insert(L,s,id);
}
else if(order=="List"){
puts("List:");
outputList(L);
}
else if(order=="Find"){
puts("Find:");
cin>>id;
Find(L,id);
}
else if(order=="Change"){
puts("Change:");
cin>>id>>name>>sex>>x>>y>>z;
Change(L,id,name,sex,x,y,z);
}
else if(order=="Delete"){
puts("Delete:");
cin>>id;
Delete(L,id);
}
else{
printf("Good bye!\n");
break;
}
}
return 0;
}
最开始用的是尾插法,那时没出什么问题,但是要求学号排序后我插入改用了按指定位置插入节点的法子,但是出错了T T