C语言高手求C语言【急!!等】

1. 编写程序实现以下功能,将程序的运行结果存入test.txt文本文件中。
(1) 创建一单链表,包含10个学生的学号、姓名以及3门课的成绩;
(2) 输出每门课的平均分,以及低于平均分学生的数量;
(3) 按学生总分进行排序(降序);
(4) 实现查找功能,如输入某一学生的学号,要求输出其相关信息,如果没有该学生信息,则输出提示信息“没有找到”;
(5) 实现添加学生信息的功能;
(6) 实现删除学生信息的功能;
现在也只可以加100分了,做了再追加!

//双链表排序,方便。单链表进行排序,是谁出的题目啊,够狠。不过已经解决了,希望能对你有所帮助。
#include "stdio.h"
#include <malloc.h>
#include <string.h>
#include <conio.h>
#include <stdlib.h>

struct node{
int ID;
char name[20];
int a1;
int a2;
int a3;
int total;
struct node *next;
};

typedef struct node NODE;
typedef NODE * NODEPTR;

float average(NODEPTR *addr,int xueke);//求学科平均值
//void insert(NODEPTR *addr,int ID,char* name,int a1,int a2,int a3);
NODE* del(NODEPTR *addr,int ID);//链表删除相同编号记录
void output(NODEPTR *addr,float arv,int xueke);//显示记录小于平均值
int getCount(NODEPTR *addr);//得到链表记录个数
void Inibegin(NODEPTR *addr,bool begin=1);//初始化
bool insert(NODEPTR *addr,NODE head,int sort,int xiu=1);//添加记录,sort排序编号,xiu>0升序

void begin();//打印表头;
void msort(NODEPTR *addr,int sort=1,int xiu=1);//排序,sort排序编号,xiu>0升序
bool mfind(NODEPTR *addr,int ID);//查询记录
bool mwrite(NODEPTR *addr);//写入文件
void putout(NODEPTR *pt,int btotal=1);//打印记录,是否打印总成绩
int main(int argc, char* argv[])
{
NODEPTR start=NULL;//链表的指针
// Inibegin(&start);
// putout(&start);

int choise,ID,xueke;
float aver[3]={0};
int i;
while(choise!=7)
{
begin();
printf("请输入你的选择?");
scanf("%d",&choise);

switch(choise)
{
case 0:
putout(&start);
break;
case 1:
Inibegin(&start,0);//以何种方式添加记录,1为连续输入方式
putout(&start);
break;
case 2:
printf("输入ID号:");
scanf("%d",&ID);
del(&start,ID);
putout(&start);
break;
case 3:
printf("\n0.按编号.\n");
printf("1.按A科成绩.\n");
printf("2.按B科成绩.\n");
printf("3.按C科成绩.\n");
printf("4.按总成绩.\n");
do
{
fflush(stdin);
printf("输入排序号(0-4):");
scanf("%d",&xueke);
}while(!(xueke==0 ||xueke==1 || xueke==2 || xueke==3 || xueke==4));
if(xueke==0)
{msort(&start,xueke+1);putout(&start);}
else
{
msort(&start,xueke+1,-1);
bool m;
if(xueke==4) m=0;
else m=1;
putout(&start,m);
}
break;
case 4:
printf("输入ID号:");
scanf("%d",&ID);
if(!mfind(&start,ID))
{
printf("没有该条记录\n");
}
break;
case 5:
printf("开始保存文件\n");
if(!mwrite(&start))
{
printf("文件保存失败\n");
}
break;
case 6:
for(i=0;i<3;i++)
{
aver[i]=average(&start,i);
}

printf("1.A成绩\n2.B成绩\n3.C成绩\n4.全部\n");
printf("请选择学科:");
scanf("%d",&xueke);
switch(xueke)
{
case 1:
output(&start,aver[0],0);
break;
case 2:
output(&start,aver[1],1);
break;
case 3:
output(&start,aver[2],2);
break;
case 4:
for(int i=0;i<3;i++)
output(&start,aver[i],i);
break;
}
break;
}
}
free(start);
return 0;
}

void putout(NODEPTR *pt,int btotal)
{
{
NODEPTR p=*pt;
if(!p)
printf("空记录\n\n");
else
{
printf("-----------------------------------------------------------\n");
while(p)
{
if(p!=0)
if(btotal) printf("%d\t%s\t%d\t%d\t%d\t\n",p->ID,p->name,p->a1,p->a2,p->a3);

else printf("%d\t%s\t%d\t%d\t%d\t%d\n",p->ID,p->name,p->a1,p->a2,p->a3,p->a1+p->a2+p->a3);
p=p->next;
}
printf("-----------------------------------------------------------\n");
}
}
};
bool mwrite(NODEPTR *addr)
{
NODEPTR p=*addr;
if(p==NULL)
return 0;
char buff[100];
FILE *file;
file=fopen("test.txt","wt");
while(p!=NULL)
{
sprintf(buff,"%d %s %d %d %d\r\n",p->ID,p->name,p->a1,p->a2,p->a3);

fwrite(buff,1,strlen(buff),file);
p=p->next;
}
fclose(file);
printf("文件写入成功\n");
return 1;
}
bool mfind(NODEPTR *addr,int ID)
{
NODEPTR p=*addr;
while(p!=NULL)
{
if(p->ID==ID)
{
printf("%d\t%s\t%d\t%d\t%d\t\n",p->ID,p->name,p->a1,p->a2,p->a3);
return 1;
}
p=p->next;
}
return 0;
}
void moving(NODEPTR* addr,NODE head,int sort=1,int xiu=1)
{
NODEPTR temp=del(addr,head.ID);
static int x=0;
// printf("DELETE%d ID=%d PT=%x\n ",x++,head.ID,temp->next);
head.next=temp->next;

if(temp!=0)
insert(addr,head,sort,xiu);

};
bool insert(NODEPTR *addr,NODE head,int sort=1,int xiu)
{
NODEPTR test,pre,current;
test=(NODEPTR)malloc(sizeof(NODE));

memcpy(test,&head,sizeof(NODE));
current=*addr;
pre=NULL;
while(current!=NULL)
{
if(test->ID==current->ID)
return 0;
current=current->next;
}
current=*addr;
if(xiu>0)
{
switch(sort)
{
case 1:
while(current!=NULL && test->ID>current->ID)
{
pre=current;
current=current->next;
}
break;
case 2:
while(current!=NULL && test->a1>current->a1)
{
pre=current;
current=current->next;
}
break;
case 3:
while(current!=NULL && test->a2>current->a2)
{
pre=current;
current=current->next;
}
break;
case 4:
while(current!=NULL && test->a3>current->a3)
{
pre=current;
current=current->next;
}
break;
case 5:
while(current!=NULL && test->total>current->total)

{
pre=current;
current=current->next;
}
break;
default:
pre=NULL;
break;
}
}
else
{
switch(sort)
{
case 1:
while(current!=NULL && test->ID<current->ID)
{
pre=current;
current=current->next;
}
break;
case 2:
while(current!=NULL && test->a1<current->a1)
{
pre=current;
current=current->next;
}
break;
case 3:
while(current!=NULL && test->a2<current->a2)
{
pre=current;
current=current->next;
}
break;
case 4:
while(current!=NULL && test->a3<current->a3)
{
pre=current;
current=current->next;
}
break;
case 5:
while(current!=NULL && test->total<current->total)

{
pre=current;
current=current->next;
}
break;
default:
pre=NULL;
break;
}
}
if(pre==NULL)
{
test->next=*addr;
*addr=test;
}
else
{
pre->next=test;
test->next=current;
}
return 1;
}
void Inibegin(NODEPTR *addr,bool begin)
{
begin? printf("程序开始运行\n"):printf("");
NODE n;
int i=0;
char select;
for(begin? i=3:i=1;i>0;)//这里都没做错误输入处理功能,自己处理。
{
memset(&n,0,sizeof(NODE));
begin? printf("\n输入第%d条记录\n",4-i):printf("");;
printf("请输入ID号:");scanf("%d",&n.ID);
printf("请输入名字:");scanf("%s",&n.name);
printf("请你输入各科成绩\n");
printf("A科成绩:");
scanf("%d",&n.a1);
printf("B科成绩:");
scanf("%d",&n.a2);
printf("C科成绩:");
scanf("%d",&n.a3);
n.total=n.a1+n.a2+n.a3;
printf("总成绩:%d\n\n",n.total);
if(begin)
{if(insert(addr,n)) i--;}
else
{

do
{
fflush(stdin);
printf("是否继续添加记录(y/n)");
scanf("%c",&select);
}while(!(select=='y' || select=='n' || select=='Y' || select=='N'));
if(select =='Y' || select=='y')
{
insert(addr,n);
}
else
{
if(insert(addr,n)) i--;
}
}
}
}
float average(NODEPTR *addr,int xuke)
{
float result=0;
NODEPTR p=*addr;
switch(xuke)
{
case 0:
while(p!=NULL)
{
result+=p->a1;
p=p->next;
}
break;
case 1:
while(p!=NULL)
{
result+=p->a2;
p=p->next;
}
break;
case 2:
while(p!=NULL)
{
result+=p->a2;
p=p->next;
}
break;
default:
break;
}
result/=getCount(addr);

return result;
}
void begin()
{
printf("*****************************************************\n");
printf("0.显示\n");
printf("1.增加\n");
printf("2.删除\n");
printf("3.排序\n");
printf("4.查询\n");
printf("5.保存\n");
printf("6.平均值\n");
printf("7.退出\n");
printf("*****************************************************\n");
}
void output(NODEPTR *addr,float arv,int xueke)
{

NODEPTR p=*addr;
if(p==NULL)
return;
printf("-----------------------------------------------------------\n");
printf("学科%d的平均分%.2f\n",xueke+1,arv);
printf("低于平均值的记录\n");
while(p!=NULL)
{
switch(xueke)
{
case 0:
if(arv>p->a1)
printf("%d\t%s\t%d\t%d\t%d\t\n",p->ID,p->name,p->a1,p->a2,p->a3);
break;
case 1:
if(arv>p->a2)
printf("%d\t%s\t%d\t%d\t%d\t\n",p->ID,p->name,p->a1,p->a2,p->a3);
break;
case 2:
if(arv>p->a3)
printf("%d\t%s\t%d\t%d\t%d\t\n",p->ID,p->name,p->a1,p->a2,p->a3);
break;

}
p=p->next;
}
printf("-----------------------------------------------------------\n");

}
void msort(NODEPTR *addr,int sort,int xiu)
{
NODEPTR pt1=*addr;
int count=getCount(addr);
for(int i=0;i<count;i++)
{
moving(addr,*pt1,sort,xiu);
pt1=pt1->next;
}

}

NODE* del(NODEPTR *addr,int ID)
{
NODEPTR pre,current,temp;
temp=NULL;
NODEPTR p=NULL;
p=*addr;
if(p==NULL)
return 0;
if(ID==(*addr)->ID)
{
temp=*addr;
*addr=(*addr)->next;
// free(temp);
return temp;
}
else
{
pre=*addr;
current=(*addr)->next;
while(current!=NULL && current->ID!=ID)
{
pre=current;
current=current->next;
}
if(current)
{
temp=current;
pre->next=current->next;
// delete temp;
return temp;
}
return temp;
}

}
int getCount(NODEPTR *addr)
{

NODEPTR temp=*addr;
int count=0;
if(temp==NULL)
return 0;
while(temp!=NULL)
{
count++;
temp=temp->next;
}
return count;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-05-29
第一条,既然学生的个数是固定的,为什么还要第5、6条?

既然学生的个数是固定的,为什么还要用链表而不用数组?

程序的运行结果,是指哪一条的运行结果???结果要求什么样的格式???本回答被提问者采纳
相似回答