标题:上网百度的程序居然有14错误!!!我弄到头大了!
取消只看楼主
youaadd
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2010-1-13
结帖率:50%
已结贴  问题点数:20 回复次数:2 
上网百度的程序居然有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",&reg);
 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();
}
搜索更多相关主题的帖子: 上网 百度 
2010-03-04 23:13
youaadd
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2010-1-13
得分:0 
额。。。。我会重写,不过要一份来参考
2010-03-05 09:22
youaadd
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2010-1-13
得分:0 
加在哪里?没发现!!
2010-03-05 12:52



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-298590-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020479 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved