user-0 提问: 单链表做班级成绩单，要求设置菜单，但是r值好像改变不了，无法运行其他选项

回复:
user: user-1
content: #include <stdio.h> #include <stdlib.h>  struct grade_list {     char number[15];     char name[20];     int English;     int math;     int physics;     int c;     struct grade_list *next; }; void input(struct grade_list *head,int n); void output(struct grade_list *head,int n); void modification(struct grade_list *head,int n); void statistics(struct grade_list *head,int n); void output_all(struct grade_list *head,int n);  int main() {     int n,i;     struct grade_list *head=NULL,*p;     head=(struct grade_list *)malloc(sizeof(struct grade_list));     if (!head)         exit(0);      p=head;     printf("input the number of students\n");     scanf("%d",&n);     for(i=0;i<n;i++)     {         p->next = (struct grade_list *)malloc(sizeof(struct grade_list));         if (!p->next)             exit(0);         p = p->next;     }     int r;     while(1)     {         r=0;         printf("r=0\t输入每个学生的各项信息\nr=1\t输出每个学生的各项信息\nr=2\t修改指定学生的指定数据项的内容\n");         //printf("r=3\t统计每个学生的平均成绩（保留2位小数）\nr=4\t输出各位学生的学号、姓名、4门课程的总成绩和平均成绩\n\输入r：");         printf("r=3\t统计每个学生的平均成绩（保留2位小数）\nr=4\t输出各位学生的学号、姓名、4门课程的总成绩和平均成绩\n输入r：");         scanf("%d",&r);         if(r==0)             input(head,n);         else if(r==1)             output(head,n);         else if(r==2)             modification(head,n);         else if(r==3)             statistics(head,n);         else if(r==4)             output_all(head,n);         else             printf("error,please input r again:\n");     }     return 0; } void input(struct grade_list *head,int n) {     struct grade_list *p=head;     int i;     printf("input number,name,the grade of English,math,physics and c,please:\n");     for(i=0;i<n;i++)     {         //scanf("%s%s%d%d%d",p->number,p->name,&p->English,&p->math,&p->physics,&p->c);         scanf("%s%s%d%d%d%d", p->number, p->name, &p->English,&p->math,&p->physics,&p->c);         getchar();         p=p->next;     } } void output(struct grade_list *head,int n) {     struct grade_list *p=head;     int i;     for(i=0;i<n;i++)     {         printf("number=%s\tname\%s\tEnglish=%d\tmath=%d\tphycics=%d\tc=%d\n",\                 p->number,p->name,p->English,p->math,p->physics,p->c);         //p->next;         p = p->next;     } } void modification(struct grade_list *head,int n) {     struct grade_list *p=head;     int i,x;     printf("input the student's number:\n");     scanf("%d",&x);     for(i=1;i<x;i++)         p=p->next;     printf("input the item you want to modify\tnumber:1\tname:2\tEglish:3\tmath:4\tphysics:5\tc:6\n");     scanf("%d",&i);     printf("the right date:\n");     switch(i)     {         case 1:scanf("%s",p->number);break;         case 2:scanf("%s",p->name);break;         case 3:scanf("%d",&p->English);break;         case 4:scanf("%d",&p->math);break;         case 5:scanf("%d",&p->physics);break;         case 6:scanf("%d",&p->c);break;         default:printf("input error\n");break;     } }  void statistics(struct grade_list *head,int n) {     struct grade_list *p=head;     //int i,sum[i];     int i, *sum;     //float ave[n];     float *ave;      sum = (int *)malloc(sizeof(int) * n);     if (!sum)         exit(0);      ave = (float *)malloc(sizeof(float) * n);     if (!ave)         exit(0);      for(i=0;i<n;i++)     {         sum[i]=p->English+p->math+p->physics+p->c;         p=p->next;     }     p=head;     for(i=0;i<n;i++)     {         ave[i]=sum[i]/4.0;         p=p->next;     }     p=head;     for(i=0;i<n;i++)     {         //printf("%s\t%s\t%d\t%d\t%d\t%.2f\t%d\t",p->number,         printf("%s\t%s\t%d\t%d\t%d\t%d\t%.2f\t%d\t\n",p->number,\                 p->name,p->English,p->math,p->physics,p->c,ave[i],sum[i]);         p=p->next;     }   free(sum);     free(ave); } void output_all(struct grade_list *head,int n) {     struct grade_list *p=head;     //int i,sum[i];     int i, *sum;     //float ave[n];     float *ave;      sum = (int *)malloc(sizeof(int) * n);     if (!sum)         exit(0);      ave = (float *)malloc(sizeof(float) * n);     if (!ave)         exit(0);     for(i=0;i<n;i++)     {         sum[i]=p->English+p->math+p->physics+p->c;         p=p->next;     }     //p=head;     for(i=0;i<n;i++)     {         ave[i]=sum[i]/4.0;         //p=p->next;     }     p=head;     for(i=0;i<n;i++)     {         printf("number=%s\tname\%s\tEnglish=%d\tmath=%d\tphycics=%d\tc=%d\tsum=%d\tave=%.2f\n",\                 p->number,p->name,p->English,p->math,p->physics,p->c,sum[i],ave[i]);         p=p->next;     }     free(sum);     free(ave); }  供参考～  建议把sum, ave加到数据结构里（结构体），这样没必要每次都申请空间了。  楼主对sum, ave用静态数组（定义）是错误的。所以我改成动态了。  代码除了一些错误之外，还有需要优化的地方，建议楼主结合代码比对，找出自己的问题，并做进一步的优化