第1个回答 2008-04-28
你说要链表,, 自己怎么链表是什么都不知道。。 ?
你要纯结构体的么 ?
比线性表 链表 更低级一点。 比数组 高级一点。。
你如果结构体都还不清楚的话, 建议先掌握 这些基本的东西。。
链表 线性表 基础是 结构体。
=======================================
//
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define NN 50 // 是学生人数上限 。可自己调整。
#define SCMAX 50 // 课程 数上限
int SCLoad;
typedef struct student{
char no[10];
char name[11];
double score[SCMAX];
double total;
double avg;
};
student stu[NN+1];
int display(int n,int m,int SC) //综合显示函数。
{
int i,j,temp,flag=0;
temp=n;
n>m?n=m,m=temp:1 ;
printf(" 序号 | 学 号 | 姓 名 |");
for(j=1;j<=SC;j++)
printf("课程%2d|",j);
printf(" 总 分 | 平均分 \n");
if((n==0&&m==0) || (!n&&!m))n=1,m=1;
if((n==0&&m!=0) || (n!=0&&m==0))
{ n=0?n=m:m=n;flag=stu[n].total==0?1:0;}
if(stu[1].total==0 || flag){printf("没有学生信息!");return 0;}
for(i=n;i<=m;i++)
if(stu[i].total>0)
{ printf(" %4d | %6s | %6s |",i,stu[i].no,stu[i].name);
for(j=0;j<SC;j++)
printf("%3.1lf ",stu[i].score[j]);
printf("| %3.2lf | %3.2lf \n",stu[i].total,stu[i].avg);
}
}
int searchmax(int n,int SC) //找最高分,并输出这个学生信息。
{ int i,j,k=1;
double max;
max=0;
for(i=1;i<=n;i++)
for(j=0;j<SC;j++)
if(stu[i].score[j]>max){
max=stu[i].score[j];
k=i;
}
display(k,k,SC);
printf(">>>最高分数:%3.1lf\n",max);
return k;
}
double avgsi(int n,int scorenum) //求 单科平均分
{ int i,j;
double s=0,avg;
for(i=1;i<=n;i++)s+=stu[i].score[scorenum-1];
return s/n;
}
int input(int i,int SC) //信息录入
{ int j;
flag: printf("输入第%d个学生学号:",i);
scanf("%s",stu[i].no);
printf("输入第%d个学生姓名:",i);
fflush(stdin);
gets(stu[i].name);
printf("输入第%d个学生成绩依次为(1 2 3....)空格隔开\n ",i);
stu[i].total=0;
stu[i].avg=0;
for(j=0;j<SC;j++){
scanf("%lf",&stu[i].score[j]);
//
stu[i].total+=stu[i].score[j];
}
stu[i].avg=stu[i].total/SC;
if(stu[i].no&&stu[i].name&&stu[i].total&&stu[i].avg)return 1;
else {printf("输入信息不完整,请重新输入!");goto flag;}
return 1;
}
void sortbyavg(int n) //按平均分高到低排序
{
int i,j;
student temp;
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
if(stu[i].avg<stu[j].avg){
temp=stu[i];
stu[i]=stu[j];
stu[j]=temp;
}
printf("排序完成!");
return;
}
int sortbyscid(int n,int SC) //按输入的课程名,分数从高到低排序
{
int i,j,k;
int p;
student temp;
printf("请输入排序参考课程id:");
scanf("%d",&p);
if(p>SC||p<=0){printf("无法排序,原因没有这门课!\n");
return 0;}
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
if(stu[i].score[p-1]<stu[j].score[p-1]){temp=stu[i];stu[i]=stu[j];stu[j]=temp;}
printf("排序完成!");
return 1;
}
void displaysample(int n) //显示总分和平均分
{ int i;
printf(" 序 号 | 姓 名 | 总分 | 平均分 \n");
for(i=1;i<=n;i++)
if(stu[i].total!=0)printf(" %5d %s %.2lf %.2lf\n",i,stu[i].name,stu[i].total,stu[i].avg);
return;
}
void dispsavg(int n) //显示各科的平均分
{ int i;
double k;
for(i=1;i<=SCMAX;i++){
k=avgsi(n,i);
if(k==0)return;
printf("<课程%2d > 平均分:%.2lf\n",i,k);
}
}
void help()
{
printf(" +++++++++欢迎使用本帮助!++++++++ \n");
printf(" 以下是功能菜单\n");
printf(" 在提示符\">>\"下有以下命令可用!\n");
printf(" A 显示所有信息;\n B 显示总分,平均分;\n C 平均分排序;\n D显示各科平均分;\n");
printf(" E 按输入课程名排序;\n F找最高分学生输出;\n S 将信息保存到文件;\n O 打开已存在的数据文件;\n");
printf(" I 学生信息输入;\n H 显示本帮助。\n Z 结束程序!\n");
printf("\n>>");}
int save(int n) //将信息保存在一个文件中。
{
FILE *fp;
int i;
char stu_msg[20];
printf("输入要保存的文件名:");
scanf("%s",stu_msg);
if((fp=fopen(stu_msg,"w"))==NULL)
{
printf("无法打开文件!\n");
return 0;
}
for(i=1;i<=n;i++)
if(fwrite(&stu[i],sizeof(student),1,fp)!=1)
printf("文件写入错误!");
fclose(fp);
printf("保存成功!");
}
int openf() //文件放在程序同目录下。
{
FILE *fp;
int i;
char stu_msg[20];
printf("输入要打开的文件名:");
scanf("%s",stu_msg);
if((fp=fopen(stu_msg,"r"))==NULL)
{printf("无法打开文件!\n");return 0;}
for(i=1;i<=NN;i++)
if(fread(&stu[i],sizeof(student),1,fp)!=1 )
{ SCLoad=0;
while(stu[1].score[SCLoad++]!=0);
printf("读入结束!\n");
return i;}
fclose(fp);
}
int main()
{
int i,j,n;
int SC ;
char cc,runfirst;
printf("\n\n\n\n是否从已有文件中获得学生信息?Y/N:");
runfirst=getchar();
if(runfirst=='Y'||runfirst=='y'){n=openf();SC=SCLoad-1;}
else {
flag: printf("输入学生人数( <=%d ):",NN);
scanf("%d",&n);
printf("输入课程数( <=%d ):",SCMAX);
scanf("%d",&SC);
while(n>NN){
printf("超出允许范围(<=%d),请重新输入:",NN);
scanf("%d",&n);}
for(i=1;i<=n;i++)input(i,SC);
printf("输入完毕!\n");
}
system("pause");
system("cls");
printf("\n\n\n");
help();
printf("你想进行什么操作?\n");
printf(">>");
while(cc=getchar())
{
switch(cc)
{
case 'I':case 'i':goto flag;break;
case 'A':case 'a':display(1,n,SC);break;
case 'B':case 'b':displaysample(n);break;
case 'C':case 'c':sortbyavg(n);break;
case 'D':case 'd':dispsavg(n);break;
case 'E':case 'e':sortbyscid(n,SC);break;
case 'F':case 'f':searchmax(n,SC);break;
case 'H':case 'h':help();break;
case 'S':case 's':save(n);break;
case 'O':case 'o':n=openf();SC=SCLoad-1;break;
case 'Z':case 'z':printf("谢谢!\n");return 0;
}
printf("\n>>");
fflush(stdin);
}
return 0;
}
第3个回答 2008-04-24
#include "stdio.h"
#include<stdlib.h>
#include<string.h>
#include<conio.h>
struct student
{
int number;
char name[10];
float yuwen;
float yingyu;
float shuxue;
float aver;
struct student *next;
};
typedef struct student node;
typedef node *link;
int n;
/*建立菜单*/
void menu(void)
{printf("---------------主菜单---------------\n");
printf("-------输入'1',输入学生成绩---------\n");
printf("-------输入'2',查询学生成绩---------\n");
printf("-------输入'3',修改学生成绩---------\n");
printf("-------输入'4',添加学生成绩---------\n");
printf("-------输入'5',删除学生成绩---------\n");
printf("-------输入'6',按照平均分排序-------\n");
printf("-------输入'7',显示学生成绩---------\n");
printf("-------输入'8',显示全班总平均分-----\n");
printf("-------输入'9',退出-----------------\n");
}
/*建立数据信息即链表*/
link creat(void)
{
link head,p1,p2;
head=NULL;
n=0;
p1=p2=(link)malloc(sizeof(node));
printf("请输入学号,输入'0'结束:\n");
scanf("%d",&p1->number);
while(p1->number)
{
printf("姓名:");
scanf("%s",p1->name);
printf("语文成绩:");
scanf("%f",&p1->yuwen);
printf("英语成绩:");
scanf("%f",&p1->yingyu);
printf("数学成绩:");
scanf("%f",&p1->shuxue);
p1->aver=(p1->yuwen+p1->yingyu+p1->shuxue)/3;
n++;
if(n==1)head=p1;
else p2->next=p1;
p2=p1;
p1=(link)malloc(sizeof(node));
printf("请输入学号,输入'0'结束:\n");
scanf("%d",&p1->number);
}
p2->next=NULL;
return(head);
}
/*查找并显示信息按照学号*/
void find(link head)
{
link p;
int number;
int flag=1;
char c;
if(head==NULL)printf("信息系统为空!无法查询!!!按任意键回到主菜单!\n");
else
{
while(flag)
{
printf("请输入要查询学生的学号: ");
scanf("%d",&number);
getchar();
p=head;
while(p!=NULL)
{
if(p->number==number)
{
printf("要查找的学号为%d的学生信息如下:\n",number);
printf("%-5d%-10s%-7.2f%-7.2f%-7.2f%-7.2f\n",p->number,p->name,p->yuwen,p->yingyu,p->shuxue,p->aver);
break;
}
else p=p->next;
}
if(p==NULL)printf("学号为%d的学生不存在!\n",number);
printf("是否继续查询?(y/n) ");
scanf("%c",&c);
getchar();
if(c=='n'||c=='N')
{
flag=0;
printf("按任意键回到主菜单!\n");
}
}
}
}
/*修改学生成绩信息*/
void modi(link head)
{
link p;
int number;
int tnumber;
char tname[10];
float tyuwen,tyingyu,tshuxue,taver;
int flag=1;
char c;
if(head==NULL)printf("学生成绩系统为空!无法修改!!!按任意键回到主菜单!\n");
else
{
while(flag)
{
printf("请输入要修改的学生学号: ");
scanf("%d",&number);
getchar();
p=head;
while(p!=NULL)
{
if(p->number==number)
{
printf("学号: ");
scanf("%d",&tnumber);
printf("姓名:");
scanf("%s",tname);
printf("语文成绩:");
scanf("%f",&tyuwen);
printf("英语成绩:");
scanf("%f",&tyingyu);
printf("数学成绩:");
scanf("%f",&tshuxue);
getchar();
taver=(tyuwen+tyingyu+tshuxue)/3;
printf("是否保存?(y/n) ");
scanf("%c",&c);
getchar();
if(c=='y'||c=='Y')
{
p->number=tnumber;
strcpy(p->name,tname);
p->yuwen=tyuwen;
p->yingyu=tyingyu;
p->shuxue=tshuxue;
p->aver=taver;
printf("保存成功!\n");
}
break;
}
else p=p->next;
}
if(p==NULL)printf("学号为%d的学生成绩信息不存在!!!\n",number);
printf("是否继续修改?(y/n) ");
scanf("%c",&c);
getchar();
if(c=='n'||c=='N')
{
flag=0;
printf("按任意键回到主菜单!\n");
}
}
}
}
/*插入学生信息*/
link insert(link head)
{
link p,p1;
int flag=1;
char c;
while(flag)
{
p=(link)malloc(sizeof(node));
printf("输入学号: ");
scanf("%d",&p->number);
printf("姓名:");
scanf("%s",p->name);
printf("语文成绩:");
scanf("%f",&p->yuwen);
printf("英语成绩:");
scanf("%f",&p->yingyu);
printf("数学成绩:");
scanf("%f",&p->shuxue);
getchar();
p->aver=(p->yuwen+p->yingyu+p->shuxue)/3;
if(head==NULL)head=p;
else
{
p1=head;
while(p1->next!=NULL)p1=p1->next;
p1->next=p;
}
p->next=NULL;
n++;
printf("插入学生信息如下:\n");
printf("%-5d%-10s%-7.2f%-7.2f%-7.2f%-7.2f\n",p->number,p->name,p->yuwen,p->yingyu,p->shuxue,p->aver);
printf("是否继续插入?(y/n) ");
scanf("%c",&c);
getchar();
if(c=='n'||c=='N')
{
flag=0;
printf("按任意键回到主菜单!\n");
}
}
return(head);
}
/*删除学生信息*/
link del(link head)
{
link p,p2;
int flag=1;
int number;
char c;
if(head==NULL)printf("信息系统为空!无法删除!!!按任意键回到主菜单!\n");
else
{
while(flag)
{
printf("输入要删除的学生学号: ");
scanf("%d",&number);
getchar();
p2=p=head;
while(p!=NULL)
{
if(p->number==number)
{
printf("要删除的学号为%d的学生信息如下:\n",number);
printf("%-5d%-10s%-7.2f%-7.2f%-7.2f%-7.2f\n",p->number,p->name,p->yuwen,p->yingyu,p->shuxue,p->aver);
printf("是否确定删除?(y/n) ");
scanf("%c",&c);
getchar();
if(c=='y'||c=='Y')
{
if(p==head)head=p->next;
else p2->next=p->next;
n--;
printf("删除成功!!\n");
}
break;
}
else
{
p2=p;
p=p->next;
}
}
if(p==NULL)printf("学号为%d的学生信息不存在!!!\n",number);
if(head==NULL)
{
printf("信息系统为空,无法继续删除!\n");
getchar();
break;
}
printf("是否继续删除?(y/n )");
scanf("%c",&c);
getchar();
if(c=='n'||c=='N')flag=0;
printf("按任意键回到主菜单!\n");
}
}
return(head);
}
/*输出学生成绩信息*/
void print(link head)
{
link p;
if(head==NULL)printf("信息系统为空!!!按任意键回到主菜单!\n");
else
{
printf("一共有%d个学生的信息:\n",n);
p=head;
while(p)
{
printf("%-5d%-10s%-7.2f%-7.2f%-7.2f%-7.2f\n",p->number,p->name,p->yuwen,p->yingyu,p->shuxue,p->aver);
p=p->next;
}
printf("按任意键回到主菜单!\n");
}
}
/*用选择法排序*/
link sort(link head)
{
link beforep,p,p1,k,beforek,temp;
if(head==NULL)printf("信息系统为空!!!按任意键回到主菜单!\n");
else
{p=head;
while(p->next!=NULL)
{
k=p;
p1=p->next;
while(p1!=NULL)
{
if(k->aver<p1->aver)k=p1;
p1=p1->next;
}
if(k!=p)
{
beforek=head;
while(beforek->next!=k)beforek=beforek->next;
if(p==head)head=k;
else beforep->next=k;
beforek->next=p;
temp=k->next;
k->next=p->next;
p->next=temp;
p=k;
}
beforep=p;
p=p->next;
}
printf("排序成功,按任意键回到主菜单!\n");
}
return(head);
}
/*求全班总平均分并显示*/
void average(link head)
{
float toaver,sum=0;
int num=0;
link p;
if(head==NULL)printf("信息系统为空!!!按任意键回到主菜单!\n");
else
{
p=head;
while(p!=NULL)
{
sum+=p->aver;
num++;
p=p->next;
}
toaver=sum/num;
printf("全班总平均分是:%7.2f\n",toaver);
printf("按任意键回到主菜单!\n");
}
}
void main()
{
int k;
int flag=1;
link head=NULL;
while(1)
{
menu();
flag=1;
while(flag)
{
printf("请输入:(1~9) ");;
scanf("%d",&k);
getchar();
if(k>=1&&k<=9)flag=0;
else printf("输入错误!\n");
}
switch(k)
{
case 1:head=creat();break;
case 2:find(head);break;
case 3:modi(head);break;
case 4:head=insert(head);break;
case 5:head=del(head);break;
case 6:head=sort(head);break;
case 7:print(head);break;
case 8:average(head);break;
case 9:return;
}
getch();
}
}