c语言建立一个链表,每个结点包括姓名和成绩,求C语言几道题的答案~~拜托了~~...
#include
#include
#include
#include
#include
#include
void pause();
typedef struct STUDENT
{
char studentNumber[20]; //學生學號
char studentName[20]; //學生姓名
char className[20]; //班級名稱
float chinese; //語文績
float maths; //數學成績
float english; //外語成績
float total;
float average; //平均值
struct STUDENT *next; //指向下個數據
struct STUDENT *last; //指向上個
}STUDENT;
static STUDENT *first=NULL; //鏈表頭
static STUDENT *end=NULL;
STUDENT *Malloc(void)
{
STUDENT *p;
p=(STUDENT*)malloc(sizeof(STUDENT));
if(p==NULL)
return NULL;
memset(p->studentNumber,' ',20);
memset(p->studentName,' ',20);
memset(p->className,' ',20);
p->chinese=0。
0;
p->maths=0。0;
p->english=0。0;
p->total=0。0;
p->average=0。0;
p->next=NULL;
p->last=NULL;
return p;
}
void Insert(STUDENT *t) //鏈表插入
{
STUDENT *p;
if (first==NULL)
first=t;
else
{ p=first;
while (p->next)
p=p->next;
p->next=t;
t->last=p;
end=t;
}
}
void loaddatabase() //加載數據
{
FILE *fp;
STUDENT *p;
fp=fopen("student。
txt","r");
if(!fp)
{
printf("打開文件出錯
");
pause();
return;
}
p=Malloc();
//first=p;
while(fscanf(fp,"%s%s%s%f%f%f%f%f",
p->studentNumber,p->studentName,p->className,
&(p->chinese),&(p->maths),&(p->english),&(p->total),&(p->average))>0)
{
Insert(p);
p=Malloc();
}
fclose(fp);
printf(" 歡迎使用學生成績管理系統
");
printf("
數據加載成功
");
system("pause");
system("cls");
}
void savedata() //保存數據
{
FILE *fp;
STUDENT *p;
if (first==NULL )
{
printf("沒有學生記錄
");
pause();
//return;
}
fp=fopen("student。
txt","w ");
if(!fp)
{
printf("打開文件出錯
");
pause();
return;
}
p=first;
while(p)
{
fprintf(fp,"%s %s %s %f %f %f %f %f
",p->studentNumber,p->studentName,p->className,
p->chinese,p->maths,p->english,p->total,p->average);
p=p->next;
}
fclose(fp);
printf("數據保存成功
");
}
void add() //添加記錄
{
STUDENT *p;
STUDENT *newstudent=Malloc();
printf("請輸入學號:");
scanf("%s",newstudent->studentNumber);
printf("請輸入姓名:");
scanf("%s",newstudent->studentName);
printf("請輸入班級名稱:");
scanf("%s",newstudent->className);
printf("請輸入語文成績:");
scanf("%f",&newstudent->chinese);
printf("請輸入數學成績:");
scanf("%f",&newstudent->maths);
printf("請輸入外語成績:");
scanf("%f",&newstudent->english);
newstudent->total=newstudent->chinese newstudent->maths newstudent->english;
newstudent->average=(newstudent->total)/3;
Insert(newstudent);
}
void pause()
{
system("pause");
system("cls");
}
void printall() //打印全部記錄
{
STUDENT *p;
p=first;
printf("
");
printf("學號姓名班級語文數學外語總分平均分
");
while (p)
{
printf("%s%s%s%3。
1f%3。1f%3。1f%3。1f%3。1f
",p->studentNumber,p->studentName,p->className,
p->chinese,p->maths,p->english,p->total,p->average);
p=p->next;
}
printf("
");
}
void findbyname() //按姓名查詢
{ int i=0;
STUDENT *p;
char buf[20];
p=first;
printf("請輸入學生姓名:");
scanf("%s",buf);
while (p)
{
if (strcmp(p->studentName,buf)==0)
{ printf("%s %s %s %3。
1f %3。1f %3。1f %3。1f %3。1f
",
p->studentNumber,p->studentName,p->className,
p->chinese,p->maths,p->english,p->total,p->average);
i ;
break;
}
p=p->next;
}
if (i==0)
printf("sorry,沒找到改學生記錄
");
}
void findbynumber() //按學號查詢
{
int i=0;
STUDENT *p;
char buf[20];
p=first;
printf("請輸入學生學號:");
scanf("%s",buf);
while (p)
{
if (strcmp(p->studentNumber,buf)==0)
{ printf("%s %s %s %3。
1f %3。1f %3。1f %3。1f %3。1f
",
p->studentNumber,p->studentName,p->className,
p->chinese,p->maths,p->english,p->total,p->average);
i ;
}
p=p->next;
}
if (i==0)
printf("sorry,沒找到改學生記錄
");
}
void findbyclass() //按班級名查詢
{ int i=0;
STUDENT *p;
char buf[20];
p=first;
printf("請輸入班級名:");
scanf("%s",buf);
while (p)
{
if (strcmp(p->className,buf)==0)
{ printf("%s %s %s %3。
1f %3。1f %3。1f %3。1f %3。1f
",
p->studentNumber,p->studentName,p->className,
p->chinese,p->maths,p->english,p->total,p->average);
i ;
}
p=p->next;
}
if (i==0)
printf("sorry,沒找到改學生記錄
");
}
int collect(){ //統計分數
int totalstudentnum=0;
double totalch=0。
0,totalmh=0。0,totalen=0。0;
double totalscore=0。0;
STUDENT *p;
p=first;
while (p)
{
totalscore=totalscore p->total;
totalch=totalch p->chinese;
totalmh=totalmh p->maths;
totalen=totalen p->english;
totalstudentnum ;
p=p->next;
}
printf("人數:%d 整體總分:%。
1f 整體平均分:%。1f
",
totalstudentnum,totalscore,(totalscore/totalstudentnum));
printf("語文:%。
1f 數學:%。1f 外語:%。1f
",totalch,totalmh,totalen);
printf("語文平均分:%。1f 數學平均分:%。1f 外語平均分:%。1f
",
(totalch/totalstudentnum),(totalmh/totalstudentnum),(totalen/totalstudentnum));
}
int delbyname()
{ int i=0;
STUDENT *p,*pnext,*pbuf,*plast;
char buf[20];
p=first;
printf("請輸入需刪除人員的姓名:");
scanf("%s",buf);
while (p)
{
if (strcmp(p->studentName,buf)==0)
{
i ;
if (first==p)
{
pbuf=first;
if (first->next==NULL) end=NULL;
first=first->next;
if (first) first->last=NULL;
free(pbuf);
printf("刪除成功
");
return 0;
}
plast->next=p->next;
if (p->next=NULL) end=p->last;
free(p);
printf("刪除成功
");
}
plast=p;
p=p->next;
}
if (i==0)
printf("sorry,沒找到該學生記錄
");
}
int delbynumber()
{ int i=0;
STUDENT *p,*pnext,*pbuf,*plast;
char buf[20];
p=first;
printf("請輸入需刪除人員的學號:");
scanf("%s",buf);
while (p)
{
if (strcmp(p->studentNumber,buf)==0)
{
i ;
if (first==p)
{
pbuf=first;
if (first->next==NULL) end=NULL;
first=first->next;
//first->last=NULL;
if (first) first->last=NULL;
free(pbuf);
printf("刪除成功
");
return 0;
}
plast->next=p->next;
if (p->next=NULL) end=p->last;
free(p);
printf("刪除成功
");
}
plast=p;
p=p->next;
}
if (i==0)
printf("sorry,沒找到該學生記錄
");
}
void changebynumber()
{
int i=0;
STUDENT *p;
char buf[20];
p=first;
printf("請輸入需修改人員的學號:");
scanf("%s",buf);
while (p)
{
if (strcmp(p->studentNumber,buf)==0)
{
printf("請輸入學號:");
scanf("%s",p->studentNumber);
printf("請輸入姓名:");
scanf("%s",p->studentName);
printf("請輸入班級名稱:");
scanf("%s",p->className);
printf("請輸入語文成績:");
scanf("%f",&p->chinese);
printf("請輸入數學成績:");
scanf("%f",&p->maths);
printf("請輸入外語成績:");
scanf("%f",&p->english);
p->total=p->chinese p->maths p->english;
p->average=(p->total)/3;
printf("修改成功");
i ;
return;
}
p=p->next;
}
if (i==0)
printf("sorry,沒找到改學生記錄
");
}
void changebyname()
{
int i=0;
STUDENT *p;
char buf[20];
p=first;
printf("請輸入需修改人員的姓名:");
scanf("%s",buf);
while (p)
{
if (strcmp(p->studentName,buf)==0)
{
printf("請輸入學號:");
scanf("%s",p->studentNumber);
printf("請輸入姓名:");
scanf("%s",p->studentName);
printf("請輸入班級名稱:");
scanf("%s",p->className);
printf("請輸入語文成績:");
scanf("%f",&p->chinese);
printf("請輸入數學成績:");
scanf("%f",&p->maths);
printf("請輸入外語成績:");
scanf("%f",&p->english);
p->total=p->chinese p->maths p->english;
p->average=(p->total)/3;
printf("修改成功
");
i ;
return;
}
p=p->next;
}
if (i==0)
printf("sorry,沒找到改學生記錄
");
}
void sortbychinese() //排序
{
STUDENT *p,*p1,*p2,*plast=NULL,*pnext=NULL;
for(p1=end->last;p1;p1=p1->last)
{
// printf("外層 %f
",p1->chinese);
// printall();
// if (p1->next==NULL) p1=p1->last;
for(p2=first,p=first->next;p2!=p1->next;p=p->next,p2=p2->next) //p指向P2后面一個數據
{
// printf("調整之前p=%f p2=%f
",p->chinese,p2->chinese);
if ((p->chinese)-(p2->chinese)>0)
{
//printf("1
");
plast=p2->last; //保存前節點
pnext=p->next; //保存后節點
if (plast) plast->next=p; //前節點接后面
else
{ first=p;
p->last=NULL;}
if (pnext) pnext->last=p2; //后節點接前面
else
{end=p2;
p2->next=NULL;
}
if (p1==p) p1=p2; //外層指針校正
else if (p1==p2)
p1=p;
// printf("2
");
p->next=p2; //節點交換
p2->last=p;
p2->next=pnext;
// printf("3
");
p->last=plast;
// printf("4
");
// else
//p->last=NULL;
p2=p;
p=p2->next;
//if (p==NULL) break;
//printf("3
");
//if (p->last==first) break;
// printall();
//printf ("5
");
// printf("調整之后p=%f p2=%f
",p->chinese,p2->chinese);
}
}
}
//printall();
}
void sortbymaths() //排序
{
STUDENT *p,*p1,*p2,*plast=NULL,*pnext=NULL;
for(p1=end->last;p1;p1=p1->last)
{
// if (p1->next==NULL) p1=p1->last;
for(p2=first,p=first->next;p2!=p1->next && p;p=p->next,p2=p2->next) //p指向P2后面一個數據
{
if ((p->maths)-(p2->maths)>0)
{
//printf("1
");
plast=p2->last; //保存前節點
pnext=p->next; //保存后節點
if (plast) plast->next=p; //前節點接后面
else
{ first=p;
p->last=NULL;}
if (pnext) pnext->last=p2; //后節點接前面
else
{end=p2;
p2->next=NULL;
}
if (p1==p) p1=p2; //外層指針校正
else if (p1==p2)
p1=p;
// printf("2
");
p->next=p2; //節點交換
p2->last=p;
p2->next=pnext;
// printf("3
");
p->last=plast;
// printf("4
");
// else
//p->last=NULL;
p2=p;
p=p2->next;
//if (p==NULL) break;
//printf("3
");
//if (p->last==first) break;
// printall();
// printf ("5
");
}
}
}
//printall();
}
void sortbyenglish() //排序
{
STUDENT *p,*p1,*p2,*plast=NULL,*pnext=NULL;
for(p1=end->last;p1;p1=p1->last)
{
// if (p1->next==NULL) p1=p1->last;
for(p2=first,p=first->next;p2!=p1->next && p;p=p->next,p2=p2->next) //p指向P2后面一個數據
{
if ((p->english)-(p2->english)>0)
{
//printf("1
");
plast=p2->last; //保存前節點
pnext=p->next; //保存后節點
if (plast) plast->next=p; //前節點接后面
else
{ first=p;
p->last=NULL;}
if (pnext) pnext->last=p2; //后節點接前面
else
{end=p2;
p2->next=NULL;
}
if (p1==p) p1=p2; //外層指針校正
else if (p1==p2)
p1=p;
// printf("2
");
p->next=p2; //節點交換
p2->last=p;
p2->next=pnext;
// printf("3
");
p->last=plast;
// printf("4
");
// else
//p->last=NULL;
p2=p;
p=p2->next;
//if (p==NULL) break;
//printf("3
");
//if (p->last==first) break;
// printall();
// printf ("5
");
}
}
}
}
void sortbytotal() //排序
{
STUDENT *p,*p1,*p2,*plast=NULL,*pnext=NULL;
for(p1=end->last;p1;p1=p1->last)
{
// if (p1->next==NULL) p1=p1->last;
for(p2=first,p=first->next;p2!=p1->next && p;p=p->next,p2=p2->next) //p指向P2后面一個數據
{
if ((p->total)-(p2->total)>0)
{
// printf("1
");
plast=p2->last; //保存前節點
pnext=p->next; //保存后節點
if (plast) plast->next=p; //前節點接后面
else
{ first=p;
p->last=NULL;}
if (pnext) pnext->last=p2; //后節點接前面
else
{end=p2;
p2->next=NULL;
}
if (p1==p) p1=p2; //外層指針校正
else if (p1==p2)
p1=p;
// printf("2
");
p->next=p2; //節點交換
p2->last=p;
p2->next=pnext;
// printf("3
");
p->last=plast;
// printf("4
");
// else
//p->last=NULL;
p2=p;
p=p2->next;
//if (p==NULL) break;
//printf("3
");
//if (p->last==first) break;
//printall();
// printf ("5
");
}
}
}
}
void exit_free()
{
STUDENT *p,*p1;
p=first;
while (p)
{
p1=p;
free(p1);
p=p->next;
}
}
void ver()
{
system("cls");
printf("
");
printf(" 學生成績管理系統 v1。
0");
printf("
");
printf("作者 風中的紙屑
");
}
int menu(void)
{
int choose;
//system("cls");
printf("
");
printf(" 1: 顯示所有學生的信息 |");
printf(" 2: 按姓名查詢 |
");
printf(" 3: 按學號查詢 |");
printf(" 4: 按班級查詢 |
");
printf(" 5: 通過姓名刪除學生 | ");
printf(" 6:按學號刪除學生 |
");
printf(" 7: 按學號修改學生成績 |");
printf(" 8: 按姓名修改學生成績 |
");
printf(" 9: 添加 |");
printf(" 10: 語文排序 |
");
printf(" 11: 數學排序 |");
printf(" 12: 外語排序 |
");
printf(" 13: 總分排序 |");
printf(" 14:匯總 |
");
printf(" 15:保存所有學生信息 |");
printf(" 16:清屏 |
");
printf(" 17: 版本 |");
printf(" 18: 退出 |
");
printf("
");
printf(" ");
printf(" 請輸入對應數字:");
scanf("%d",&choose);/*取得用戶的選擇*/
switch(choose)
{
case 1:
system("cls");
printall();/*顯示所有學生的信息*/
printf("
");
collect();
break;
case 2:
findbyname();
break;
case 3:
findbynumber();/*根據用戶輸入的學號顯示該學生的信息*/
break;
case 4:
findbyclass();
break;
case 5:
printall();
delbyname();
break;
case 6:
printall();
delbynumber();
break;
case 7:
printall();
changebynumber();/*根據用戶輸入的學號修改學生成績*/
break;
case 8:
printall();
changebyname();/*保存數據*/
break;
case 9:
add();
break;
case 10:
system("cls");
sortbychinese();
printall();
break;
case 11:
system("cls");
sortbymaths();
printall();
break;
case 12:
system("cls");
sortbyenglish();
printall();
break;
case 13:
system("cls");
sortbytotal();
//sortbytotal();
printall();
break;
case 14:
collect();
break;
case 15:
savedata();
break;
case 16:
system("cls");
break;
case 17:
system("cls");
ver();
break;
case 18:
exit_free();
exit(1);
break;
default: system("cls"); break;
}
}
int main()
{
loaddatabase();
while (1)
menu();
}
這是我以前寫得,基本符合樓主要求,貼上來了。
全部
總結
以上是生活随笔為你收集整理的c语言建立一个链表,每个结点包括姓名和成绩,求C语言几道题的答案~~拜托了~~...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 托马斯微积分和微积分学教程_为什么微积分
- 下一篇: 字体文件解析 c语言,如何正确地从C语言