要寫一個處理學生成績信息的程序,使用單向鏈表,創建,遍歷已經沒有問題,但在修改結點的數據時出現問題,輸入數據後程序就停止運行。
修改的思路是先根據學號定位到指定結點,然後修改數據,修改函數如下
void Correct(float *a,float *b,float *c,float *d,float *e,float *f)
{
printf("請依次輸入學生正確的的英語 數學 物理 C語言成績\n");
scanf("%f%f%f%f",a,b,c,d);
*e=*a+*b+*c+*d;
*f=*e/4;
}
程序執行到上面時總是出現問題,不知道是什麼原因,也嘗試過其他修改的方法:只傳結點的地址,同樣出現問題;查找與修改函數合並,找到結點直接修改也是有問題,不知道為什麼,代碼有些長,還希望有人可以指導一下,非常感謝。
完整代碼如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct stu{
char num[15];
char name[20];
float EngSco;
float MathSco;
float PhySco;
float CSco;
float TotalSco;
float AveSco;
int GoOn;
struct stu * next;
};
void PrtMenu();
void CreatList(struct stu **headp);/*創建鏈表並輸入數據*/
void PrtInf(struct stu *headp);/*輸出鏈表中的某些數據*/
void Correct(float *a,float *b,float *c,float *d,float *e,float *f);/*修改鏈表中某結點元素的數據*/
void PrtData(struct stu *headp);/*輸出鏈表中的某些數據*/
struct stu* Search(struct stu *headp);/*定位需要修改的結點的地址*/
int main()
{
int choice;
struct stu *head=NULL,*revise=NULL;
Order:
PrtMenu();
scanf("%d",&choice);
if(choice<0||choice>5){
printf("指令錯誤,請重新輸入指令\n");
goto Order;
}
else
switch(choice)
{
case 0:
system("CLS");
break;
case 1:
CreatList(&head);break;
case 2:
PrtInf(head);break;
case 3:
revise=Search(head);
Correct(&(revise->EngSco),&(revise->MathSco),&(revise->PhySco),&(revise->CSco),&(revise->TotalSco),&(revise->AveSco));break;
case 4:
PrtData(head);break;
case 5:
return 0;
}
goto Order;
return 0;
}
void PrtMenu()
{
printf("-----功能選擇-----\n");
printf("0.清屏並顯示菜單\n");
printf("1.輸入學生信息\n");
printf("2.輸出學生各項信息\n");
printf("3.修改學生指定數據項的內容\n");
printf("4.輸出各位同學的學號、姓名、四門課的總成績和平均成績\n");
printf("5.退出系統\n");
printf("------------------\n");
printf("請輸入指令前的序號\n");
}
void CreatList(struct stu **headp)
{
struct stu *loc_head=NULL,*tail;
loc_head=(struct stu*)malloc(sizeof(struct stu));
printf("請輸入學生的學號\n");
scanf("%s",loc_head->num);
printf("請輸入學生的姓名\n");
scanf("%s",loc_head->name);
printf("請依次輸入學生的英語 數學 物理 C語言成績\n");
scanf("%f%f%f%f",&loc_head->EngSco,&loc_head->MathSco,&loc_head->PhySco,&loc_head->CSco);
loc_head->TotalSco=loc_head->EngSco+loc_head->MathSco+loc_head->PhySco+loc_head->CSco;
loc_head->AveSco=loc_head->TotalSco/4;
tail=loc_head;
printf("繼續輸入請按1,輸入完成請按0\n");
scanf("%d",&tail->GoOn);
if(tail->GoOn==0)
goto end;
else
while(1)
{
tail->next=(struct stu*)malloc(sizeof(struct stu));
tail=tail->next;
printf("請輸入學生的學號\n");
scanf("%s",tail->num);
printf("請輸入學生的姓名\n");
scanf("%s",tail->name);
printf("請依次輸入學生的英語 數學 物理 C語言成績\n");
scanf("%f%f%f%f",&tail->EngSco,&tail->MathSco,&tail->PhySco,&tail->CSco);
tail->TotalSco=tail->EngSco+tail->MathSco+tail->PhySco+tail->CSco;
tail->AveSco=tail->TotalSco/4;
printf("繼續輸入請按1,輸入完成請按0\n");
scanf("%d",&tail->GoOn);
if(!tail->GoOn)
break;
}
end:
tail->next=NULL;
*headp=loc_head;
}
void PrtInf(struct stu *headp)
{
struct stu *current=headp;
printf("學號\t姓名\t英語\t高數\t物理\tC語言\t\n");
while(current)
{
printf("%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\t\n",current->num,current->name,current->EngSco,current->MathSco,current->PhySco,current->CSco);
current=current->next;
}
}
void Correct(float *a,float *b,float *c,float *d,float *e,float *f)
{
printf("請依次輸入學生正確的的英語 數學 物理 C語言成績\n");
scanf("%f%f%f%f",a,b,c,d);
*e=*a+*b+*c+*d;
*f=*e/4;
}
void PrtData(struct stu *headp)
{
struct stu *current=headp;
printf("學號\t姓名\t總分\t平均分\t\n");
while(current)
{
printf("%s\t%s\t%.2f\t%.2f\t\n",current->num,current->name,current->TotalSco,current->AveSco);
current=current->next;
}
}
struct stu* Search(struct stu *headp)
{
struct stu *current=headp;
char aim[15];
int flag;
printf("請輸入要修改數據的學生的學號\n");
scanf("%s",aim);
while(current)
{
flag=strcmp(current->num,aim);
if(flag=0)
break;
else current=current->next;
}
return current;
}
是前面Search()函數出的問題,if()中的要是“==”=======================================。。。。