程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程綜合問答 >> c語言-C語言:在子函數中修改結構變量中元素的值

c語言-C語言:在子函數中修改結構變量中元素的值

編輯:編程綜合問答
C語言:在子函數中修改結構變量中元素的值

要寫一個處理學生成績信息的程序,使用單向鏈表,創建,遍歷已經沒有問題,但在修改結點的數據時出現問題,輸入數據後程序就停止運行。
修改的思路是先根據學號定位到指定結點,然後修改數據,修改函數如下

 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()中的要是“==”=======================================。。。。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved