上网百度的程序居然有14错误!!!我弄到头大了!
#include <stdio.h>#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#define ERROR 0 //错误;
#define OK 1 //正确;
#define false //是;
#define true //否;
#define EQUAL 1 //相等;
typedef int Status;
typedef struct{
char name[20]; //姓名;
int num; //学号;
int team; //学期;
float s1,s2,s3,s; //成绩A,B,C及平均成绩;
}ElemType;
typedef struct Node{
ElemType data; //数据;
struct Node *next; //指向下一结点;
}*Link;
typedef struct
{
Node *head; //头指针;
int length; //定义线性表长度;
}SqLinkList;
void InitList(SqLinkList &L); //初始化线性表;
void EmptyLinkList(SqLinkList &L); //清空线性表;
int ScanE(ElemType &e); //输入一个学生的成绩数据结点。返回0为无效结点数据,1为有效结点数据;
Status SqLinkListAppend(SqLinkList &L,ElemType e); //追加一个结点到线性表中;
Link SearchNode(SqLinkList L,int NUM); //查找学号为NUM的学生记录;
void SearchTeam(SqLinkList L,int team); //查找team学期的学生记录并全部输出;
void SearchUnpass(SqLinkList L,int s1,int s2,int s3); //查找挂科的学生记录并全部输出;
void SqLinkListSearch(SqLinkList L); //分类查询学生信息;
void inputData(SqLinkList &L); //输入学生成绩;
void SqLinkListTraverse(SqLinkList L); //学生成绩列表;
void PrintE(ElemType e); //格式输出学生的信息;
void DeletData(SqLinkList &L); //删除某个学生成绩;
int SqLinkListDele(SqLinkList &L,int i); //从列表中删除学号为i的结点;
void SortData(SqLinkList &L); //学生成绩排名;
int comp(Node *p1,Node *p2); //比较二个结点的成绩大小,返回1-大于,0-相等,-1-小于 ;
void swap(SqLinkList &L,Node *p1,Node *p2); //交换二个相邻结点;
void Total(SqLinkList L); //求学生总数;
void main()
{
SqLinkList student;
InitList(student);
//初始化学生信息的线性表;
int Reg=-1; //选择命令;
while(Reg) //命令为0则程序结束;
{
printf("欢迎使用学生成绩管理系统\n");
printf("================================================================\n");
printf(" 1--输入学生成绩或对已存在学生成绩进行修改\n");
printf(" 2--列出所有的学生成绩\n");
printf(" 3--删除单个的学生成绩\n");
printf(" 4--清空整个系统的成绩记录\n");
printf(" 5--学生的平均成绩排名\n");
printf(" 6--已录入的学生总人数\n");
printf(" 7--分类查询\n");
printf(" 0--退出\n");
printf("================================================================\n");
printf("请输入命令代码(0-7):");
scanf("%d",&Reg); //键入命令代码;
switch (Reg)
//输入的命令代码与case语句中相同执行相关语句调用函数;
{
case 1:inputData(student);break; //输入数据;
case 2:SqLinkListTraverse(student);break; //信息列表;
case 3:DeletData(student);break; //删除学生记录;
case 4:EmptyLinkList(student);break; //清空管理系统;
case 5:SortData(student);break; //成绩排名;
case 6:Total(student);break; //学生人数记录;
case 7:SqLinkListSearch(student);break; //查询;
case 0:printf("您请求退出,程序结束。\n");break;
default:printf("您的输入有误请重新输入。\n");
} //end switch;
printf("--------END--------\n\n");
} //end while;
}
void InitList(SqLinkList &L) {
// 构造一个空的线性表L;
L.head = 0; //头指针为空;
L.length = 0; //长度初始为0;
}
void EmptyLinkList(SqLinkList &L){
//入口参数为整个线性表的数据,功能为清空线性表;
Node *p;
if(!L.head)printf("系统中不存在记录。\n");
//头指针为空时没有学生录入;
else {
while (L.head){
//每个循环将下一结点赋值给头指针,并释放本结点空间,直至线性表清空;
p=L.head;
L.head=p->next;
free(p);
} //end while;
L.length=0; //长度为0;
printf("该管理系统学生信息已清空。\n");
}//end else;
}
int ScanE(ElemType &e){
//输入一个学生的成绩数据结点。返回0为无效结点数据,1为有效结点数据;
printf("\n学号:");
scanf("%d",&e.num);
if(e.num==0){
//学号为0输入不合法,重新输入;
printf("学号输入不合法.\n");
return 0;
}
printf("\n姓名:");
scanf("%s",&e.name);
printf("\n学期:");
scanf("%d",&e.team);
while(e.team>12){
//系统只记录小于12的学期数;
printf("输入的学期不能大于12,请重新输入:");
scanf("%d",&e.team);
}
printf("\n成绩A:");
scanf("%f",&e.s1);
printf("\n成绩B:");
scanf("%f",&e.s2);
printf("\n成绩C:");
scanf("%f",&e.s3);
return OK;
}
Status SqLinkListAppend(SqLinkList &L,ElemType e){
//追加一个结点到线性表中;
Node *p;
p=SearchNode(L,e.num);
//查找学号为e.num的记录并将其地址赋给指针p;
if (p==0){
//若不存在添加学号相同的结点,追加一个结点;
p=(Node *)malloc(sizeof(Node));
if (!p) return ERROR;
memcpy(&(p->data),&e,sizeof(ElemType));
p->next=L.head ;
L.head=p;
//追加的一个结点为首结点;
L.length++; //表长度加1;
}
else { //如果该学号记录已存在,则进行修改操作;
memcpy(&(p->data),&e,sizeof(ElemType));
printf("该学生记录已经存在,已完成修改操作。\n");
}
return OK;
}
Link SearchNode(SqLinkList L,int NUM){
//查找学生记录,该学生的学号为NUM;
Node *p;
p=L.head; //p先指在头结点;
while (p&& p->data.num !=NUM ) p=p->next;
//如果该学生的学号不为NUM则查找下一个结点;
return p;
}
void SearchTeam(SqLinkList L,int team){
//按学期查找并输出所有该学期存在的记录;
Node *p;
p=L.head;
int n,sum=0;
//sum记录该学期的学生总人数;
printf("请输入您要查询的学生的学期:");
scanf("%d",&n);
printf("\n学号 姓名 学期 成绩A 成绩B 成绩C 平均成绩\n");
while(p&&p->next){
//如果p结点和它的下一结点不为空,且该结点的学期等于要查找学期,则格式输出所有该学期学生信息;
if(p->data.team==n){
PrintE(p->data);
sum++;
//查找到一个该学期的学生记录计数加1;
}
p=p->next;
//转向下一结点;
} //end while;
if(p->data.team==n){
//如果p的下一结点为空,且本结点学期为n,则格式输出该结点信息;
sum++;
PrintE(p->data);
}
if(sum==0)printf("没有这学期的记录。\n");
if(sum)printf("该学期共有%d人的记录.\n",sum);
}
void SearchUnpass(SqLinkList L,float s1,float s2,float s3){
//查找并输出有挂科的学生信息;
Node *p;
p=L.head;
int sum=0;
//sum计数挂科总人数,初始为0;
printf("以下是有一门以上不及格科目的学生的成绩:\n");
printf("\n学号 姓名 学期 成绩A 成绩B 成绩C 平均成绩\n");
while(p&&p->next){
//如果p及其下一结点为真,且该结点有一门以上科目分数低于60则输出该结点成绩并使sum计数加1;
if((p->data.s1<60)||(p->data.s2<60)||(p->data.s3<60))
{
PrintE(p->data);
sum++;
} //end if;
p=p->next;
//转到下一结点;
} //end while;
if((p->data.s1<60)||(p->data.s2<60)||(p->data.s3<60)){
//查看最后一个结点,若有挂科,sum加1并格式输出结点信息;
sum++;
PrintE(p->data);
}
if(sum==0)printf("没有不及格的记录。\n");
if(sum)printf("共有%d人的挂科记录.\n",sum);
}
void SqLinkListSearch(SqLinkList L){
//分类查找学生记录;
Node *p;
p=L.head;
int n,reg; //reg为查询方式的指令;
printf("1--按学号查询\n2--按学期查询\n3--挂科学生信息列表\n");
printf("请您输入查询方式:");
scanf("%d",®);
if(L.length){
if(reg>3)printf("对不起没有您要求的选项。\n");
//若reg>3则输入不合法;
else if(reg==1){
//reg==1按学号查询;
printf("请输入您要查询的学生的学号:");
scanf("%d",&n);
while(p&&p->next&& p->data.num !=n) p=p->next;
//当p和他下一结点为真时且结点数据不为要查找数据时转向下一结点;
if(p->data.num==n){
//找到所要查询结点,格式输出;
printf("\n学号 姓名 学期 成绩A 成绩B 成绩C 平均成绩\n");
PrintE(p->data);
}
else printf("没有您要查找的学号。\n");
} //end reg==1 if ;
else if(reg==2)SearchTeam(L,p->data.team);
//reg==2,调用SearchTeam函数按学期查询并输出;
else if(reg==3)SearchUnpass(L,p->data.s1,p->data.s2,p->data.s3);
//reg==3,调用SearchUnpass函数,输出全部有挂科记录的学生信息;
}//end if;
else printf("系统中无记录.\n");
}
void inputData(SqLinkList &L){
//请求输入学生成绩,则追加一个结点并输入;
ElemType e;
if (ScanE(e)) SqLinkListAppend(L,e); //输入数据,追加一个结点;
}
void SqLinkListTraverse(SqLinkList L){
//所有学生信息列表输出;
Node *p;
char c;
p=L.head;
if(p) //非空表;
{
printf("\n学号 姓名 学期 成绩A 成绩B 成绩C 平均成绩\n");
for (p=L.head ;p;p=p->next )PrintE(p->data);
//从第一个结点开始输出所有信息直到结点为空;
}
else printf("系统中无记录。\n");
//空表;
c=getchar();
}
void PrintE(ElemType e){
//输出各科成绩和平均成绩;
printf("%d\t%s\t%d\t%f\t%f\t%f\t%f\n",e.num,e.name,e.team,e.s1,e.s2,e.s3,(e.s1+e.s2+e.s3)/3);
//格式输出学生的学号、姓名、学期、A、B、C三门成绩以及平均成绩;
}
void DeletData(SqLinkList &L){
//删除学生记录;
int i=0;
Node *p;
printf("\n你要删除哪个学生(学号):");
scanf("%d",&i);
p=SearchNode(L,i);
//查找要删除的记录;
if(p){
SqLinkListDele(L,i); //删除结点;
printf("\n已完成删除\n");
}
else printf("不存在您要删除的学号。\n");
}
int SqLinkListDele(SqLinkList &L,int i){ //从列表中删除学号为i的结点;
Node *p,*q;
if (i<=0) return ERROR; //学号为大于等于零的整数;
p=q=L.head;
while (p!=0 && p->data.num!=i){
//若当前结点为真且结点学号不为i则转向下一结点;
q=p;
p=p->next;
}
if (p==0) return ERROR; //结点为空返回0值;
if (p==q) L.head=p->next;
//若第1结点为所删除结点,则将下一结点指定为头指针;
else q->next=p->next; //将结点p从线性表中删除;
free(p); //释放结点空间;
L.length--; //删除结点p后长度减1;
return OK;
}
void SortData(SqLinkList &L){ //学生成绩排名;
Node *p1,*p2,*q=0; //q是上次最后一次交换的地点;
bool s=true; //是否发生了交换;
int t=1;
if(L.length){
//当线性表不为空时进行排序;
while (s){ //优化冒泡排序法;
s=false;
p1=L.head;
p2=p1->next;
while (p2!=0 && p1!=q){
if (comp(p1,p2)==-1){
//比较两结点平均分数的大小,若p1小于p2则交换两结点的位置;
swap(L,p1,p2);
s=true; //发生了交换;
q=p2; //q记录当前发生交换的位置;
p2=p1->next;
}
else{
//若未发生交换,则p2赋值给p1,p2指向下一结点;
p1=p2;
p2=p1->next;
}
}
}
SqLinkListTraverse(L);
//发生交换后按成绩从高到低列表;
Node *p;
p=L.head;
while(p&&p->next){
//若当前结点和他的下一结点不为空则输出他的名次;
printf("第%d名是%d号\n",t,p->data.num);
t++;
//t记录名次;
p=p->next;
}
if(!p->next)printf("第%d名是%d号\n",t,p->data.num);
//输出最后一个结点的名次;
}// end if;
else printf("系统中无记录。\n");
}
int comp(Node *p1,Node *p2){
//比较二个结点的成绩大小,返回1-大于,0-相等,-1-小于 ;
p1->data.s=(p1->data.s1+ p1->data.s2+ p1->data.s3)/3;
p2->data.s=(p2->data.s1+p2->data.s2+p2->data.s3)/3 ;
//s为s1,s2,s3的平均分;
if (p1->data.s>p2->data.s)return 1; //大于
if (p1->data.s==p2->data.s) return 0; //等于
if (p1->data.s<p2->data.s) return -1; //小于
}
void swap(SqLinkList &L,Node *p1,Node *p2){
//交换两个相邻的结点;
Node *q;
q=L.head;
if (q==p1){
//发生交换的结点为首结点,交换p1,p2并使p2结点为首结点;
L.head=p2;
p1->next=p2->next;
p2->next=p1;
}
else{
//发生交换的结点为非首结点,交换p1,p2并使q的下一结点为p2;
while (q->next!=p1) q=q->next; //直到q的下一结点为p1为止;
q->next=p2;
p1->next=p2->next;
p2->next=p1;
}
}
void Total(SqLinkList L){
//求学生总数;
char c;
printf("\n共有%d个学生的记录。\n",L.length );
//线性表长度即为学生总数;
c=getchar();
}