user-0 提问: 球球各位大神看看吧！为什么while(p21)里面的循环执行不了

回复:
user: user-0
content: 解决了！谢谢

user: user-1
content: 修正5#楼的错误，change()函数还是实现修改功能的，我忘了修改后是没保存的，见代码：#include <stdio.h> #include <stdlib.h> #include <string.h>  struct message {     char   name[10];//用户     char   use[50];//用途     double income;//收入     double spend;//支出     char   time[10];//使用时间     double sum;//余额     struct message *next; };  struct message *Findfile(struct message *head1)//将文件信息存到链表中 {     struct message *head;     FILE *fp1;     struct message *p1,*p2;      if((fp1=fopen("money.in","r"))==NULL){         printf("cannot open file\n");         return 0;     }     if (head1 == NULL){         head1=(struct message* )malloc(sizeof(struct message));//生成头节点         head = head1;         head1->next=NULL;     }else{         for(head=head1;head->next!=NULL;head=head->next);//找到节点尾部     }     p2 = head;     while(1){         p1=(struct message* )malloc(sizeof(struct message));         if(fscanf(fp1,"%s %s %lf %lf %s %lf\n",p1->name,p1->use,&p1->income,                                              &p1->spend,p1->time,&p1->sum)!=6)break;         p1->next=NULL;                        //从文件里读入信息的各参数顺序和结构体里定义的顺序一样         if(head==NULL) head->next=p1;         //文件保存时也必须是按此顺序排列。         else p2->next=p1;         p2=p1;     }     fclose(fp1);     return head1; }  void Correct(struct message *head3) {     struct message *p31=head3,*p32=p31->next;     while(p31&&p32)     {         p32->sum=(p31->sum)+(p32->income)-(p32->spend);         p31=p31->next;         p32=p31->next;     } }  void Change(struct message *head2)  //修改 {     int k=0,choice;     struct message *p21,*p22=head2,*p23,*p24=head2;     p21=head2;     char name[10];     printf("请输入要修改的人的名字：");     scanf("%s",name);     while(p21)     {         if(strcmp(p21->name,name)==0)         {             k++;             printf("[%d] %s %.2f %.2f %.2f %s %s\n",k,p21->name,                      p21->income,p21->spend,p21->sum,p21->use,p21->time);         }         p21=p21->next;     }     if(k!=0)     {         printf("选择要修改的账户信息的序号：");         scanf("%d",&k);         while(k)         {             if(strcmp(p22->name,name)==0)             {                 k--;                 p23=p22;                 p22=p22->next;             }             else             {                 p23=p22;                 p22=p22->next;             }         }         printf("选择要修改的账户信息的项目序号(1:姓名,2:收入金额,3:支出金额,4:用途,5:使用时间)：");         scanf("%d",&choice);         //while(choice) //这里的while造成死循环,这里是想实现多项目多次的修改吗 ？         //{         switch(choice)             {             case 1:                 {                     printf("请输入更正后的姓名：");                     scanf("%s",p23->name);                     printf("修改成功\n");                     break;                 }             case 2:                 {                     printf("请输入更正后的收入金额：");                     scanf("%lf",&p23->income);                     printf("修改成功\n");                     break;                 }             case 3:                 {                     printf("请输入更正后的支出金额：");                     scanf("%lf",&p23->spend);                     printf("修改成功\n");                     break;                 }             case 4:                 {                     printf("请输入更正后的用途：");                     scanf("%s",p23->use);                     printf("修改成功\n");                     break;                 }             case 5:                 {                     printf("请输入更正后的使用时间：");                     scanf("%s",p23->time);                     printf("修改成功\n");                     break;                 }             case 0:break;             default:                    printf("请输入正确的序号：");                    break;             }         if(choice==2||choice==3)         {            if(p24==p23)            {               p24->sum=p23->income-p23->spend;            }            else              {                while(p24->next!=p23)                 {                   p24=p24->next;                 }                Correct(p24);              }          }         //}     }     else     {         printf("查无此人！");     } }  int main() {    struct message *head=NULL,*p;    head = Findfile(head);     for(p = head->next;p!= NULL; p=p->next)    //这里加两句，输出看看文件读入的情况，调试好可以删除        printf("%s %s %f %f %s %f\n",p->name,p->use,p->income,p->spend,p->time,p->sum);            int power=1;    if(power)    {        Change(head);    }     for(p = head->next;p!= NULL; p=p->next)            printf("%s %s %f %f %s %f\n",p->name,p->use,p->income,p->spend,p->time,p->sum);     system("pause");    return 0; }    //1111 gz 300.000000 100.000000 20210316 200.000000 //1122 gz 300.000000 100.000000 20210316 200.000000 //1133 gz 300.000000 100.000000 20210316 200.000000 //1144 gz 300.000000 100.000000 20210316 200.000000 //请输入要修改的人的名字：1111 //[1] 1111 300.00 100.00 200.00 gz 20210316 //选择要修改的账户信息的序号：1 //选择要修改的账户信息的项目序号(1:姓名,2:收入金额,3:支出金额,4:用途,5:使用时间)：1 //请输入更正后的姓名：5555 //修改成功 //5555 gz 300.000000 100.000000 20210316 200.000000 //1122 gz 300.000000 100.000000 20210316 200.000000 //1133 gz 300.000000 100.000000 20210316 200.000000 //1144 gz 300.000000 100.000000 20210316 200.000000 //请按任意键继续. . .

user: user-1
content: 调通代码，但修改函数Change（）的功能没实现目标呢，似乎楼主考虑得太复杂了，其他问题见代码，供参考：#include <stdio.h> #include <stdlib.h> #include <string.h>  struct message {     char   name[10];//用户     char   use[50];//用途     double income;//收入     double spend;//支出     char   time[10];//使用时间     double sum;//余额     struct message *next; };  struct message *Findfile(struct message *head1)//将文件信息存到链表中 {     struct message *head;     FILE *fp1;     struct message *p1,*p2;      if((fp1=fopen("money.in","r"))==NULL){         printf("cannot open file\n");         return 0;     }     if (head1 == NULL){         head1=(struct message* )malloc(sizeof(struct message));//生成头节点         head = head1;         head1->next=NULL;     }else{         for(head=head1;head->next!=NULL;head=head->next);//找到节点尾部     }     p2 = head;     while(1){         p1=(struct message* )malloc(sizeof(struct message));         if(fscanf(fp1,"%s %s %lf %lf %s %lf\n",p1->name,p1->use,&p1->income,                                              &p1->spend,p1->time,&p1->sum)!=6)break;         p1->next=NULL;                        //从文件里读入信息的各参数顺序和结构体里定义的顺序一样         if(head==NULL) head->next=p1;         //文件保存时也必须是按此顺序排列。         else p2->next=p1;         p2=p1;     }     fclose(fp1);     return head1; }  void Correct(struct message *head3) {     struct message *p31=head3,*p32=p31->next;     while(p31&&p32)     {         p32->sum=(p31->sum)+(p32->income)-(p32->spend);         p31=p31->next;         p32=p31->next;     } }  void Change(struct message *head2)  //修改 {     int k=0,choice;     struct message *p21,*p22=head2,*p23,*p24=head2;     p21=head2;     char name[10];     printf("请输入要修改的人的名字：");     scanf("%s",name);     while(p21)     {         if(strcmp(p21->name,name)==0)         {             k++;             printf("[%d] %s %.2f %.2f %.2f %s %s\n",k,p21->name,                      p21->income,p21->spend,p21->sum,p21->use,p21->time);         }         p21=p21->next;     }     if(k!=0)     {         printf("选择要修改的账户信息的序号：");         scanf("%d",&k);         while(k)                       //这段的算法没成功，就是不能实现下面的对信息的修改定位         {             if(strcmp(p22->name,name)==0)             {                 k--;                 p23=p22;                 p22=p22->next;             }             else             {                 p23=p22;                 p22=p22->next;             }         }         printf("选择要修改的账户信息的项目序号(1:姓名,2:收入金额,3:支出金额,4:用途,5:使用时间)：");         scanf("%d",&choice);         //while(choice) //这里的while多余了，造成死循环         //{         switch(choice)             {             case 1:                 {                     printf("请输入更正后的姓名：");                     scanf("%s",p23->name);                     printf("修改成功");                     break;                 }             case 2:                 {                     printf("请输入更正后的收入金额：");                     scanf("%lf",&p23->income);                     printf("修改成功");                     break;                 }             case 3:                 {                     printf("请输入更正后的支出金额：");                     scanf("%lf",&p23->spend);                     printf("修改成功");                     break;                 }             case 4:                 {                     printf("请输入更正后的用途：");                     scanf("%s",p23->use);                     printf("修改成功");                     break;                 }             case 5:                 {                     printf("请输入更正后的使用时间：");                     scanf("%s",p23->time);                     printf("修改成功");                     break;                 }             case 0:break;             default:                    printf("请输入正确的序号：");                    break;             }         if(choice==2||choice==3)         //这段的算法和上面同样问题         {            if(p24==p23)            {               p24->sum=p23->income-p23->spend;            }            else              {                while(p24->next!=p23)                 {                   p24=p24->next;                 }                Correct(p24);              }          }         //}     }     else     {         printf("查无此人！");     } }  int main() {    struct message *head=NULL,*p;    head = Findfile(head);     for(p = head->next;p!= NULL; p=p->next)    //这里加两句，输出看看文件读入的情况，调试好可以删除        printf("%s %s %f %f %s %f\n",p->name,p->use,p->income,p->spend,p->time,p->sum);            int power=1;    if(power)    {        Change(head);    }    system("pause");    return 0; }  //下面是试运行的结果：  //1111 gz 300.000000 100.000000 20210316 200.000000 //1122 gz 300.000000 100.000000 20210316 200.000000 //1133 gz 300.000000 100.000000 20210316 200.000000 //1144 gz 300.000000 100.000000 20210316 200.000000 //请输入要修改的人的名字：1111 //[1] 1111 300.00 100.00 200.00 gz 20210316 //选择要修改的账户信息的序号：1 //选择要修改的账户信息的项目序号(1:姓名,2:收入金额,3:支出金额,4:用途,5:使用时间)：1 //请输入更正后的姓名：2211 //修改成功请按任意键继续. . .  这里运行时虽然显示修改成功，但再次读入时没有变化

user: user-2
content: #include <stdio.h> #include <stdlib.h> #include <string.h>  struct message {     char name[10];//用户     char use[50];//用途     double income;//收入     double spend;//支出     char time[10];//使用时间     double sum;//余额     struct message *next; };  struct message *Findfile(struct message *head1)//将文件信息存到链表中 {     struct message *head=NULL;     FILE *fp1;     //char c;     int c;     struct message *p1,*p2;     char name[10];//用户     char use[50];//用途     double income;//收入     double spend;//支出     char time[10];//使用时间     double sum;//余额      if((fp1=fopen("money.in","r"))==NULL)     {         printf("cannot open file\n");         return 0;     }     //while((c=fgetc(fp1))!=EOF)     while((c=fgetc(fp1))!=EOF)  //c表示不了EOF,因此要用int定义c     {         fseek(fp1,-1,SEEK_CUR);    //这儿的操作似乎没有意义～         p1=(struct message* )malloc(sizeof(struct message));         fscanf(fp1,"%s%lf%lf%lf%s%s\n",name,&income,&spend,&sum,use,time);         strcpy(p1->name,name);         strcpy(p1->use,use);         p1->income=income;         p1->spend=spend;         strcpy(p1->time,time);         p1->sum=sum;         p1->next=NULL;         if(head==NULL)             head=p1;         else             p2->next=p1;         p2=p1;     }      fclose(fp1);     return head1; } void Correct(struct message *head3) {     struct message *p31=head3,*p32=p31->next;     while(p31&&p32)     {         p32->sum=(p31->sum)+(p32->income)-(p32->spend);         p31=p31->next;         p32=p31->next;     } } void Change(struct message *head2) {     int k=0,choice;     struct message *p21,*p22=head2,*p23,*p24=head2;     p21=head2;     char name[10];     printf("请输入要修改的人的名字：");     scanf("%s",name);     while(p21)     {         if(strcmp(p21->name,name)==0)         {             k++;             printf("[%d] %s %.2f %.2f %.2f %s %s\n",k,p21->name,p21->income,p21->spend,p21->sum,p21->use,p21->time);             break;//这儿是不是应该跳出         }         p21=p21->next;     }     if(k!=0)     {         printf("选择要修改的账户信息的序号：");         scanf("%d",&k);         while(k)         {             //if(strcmp(p22->name,name)==0) //比较有什么意义？if和else执行了基本上相同的逻辑除了k--             if(strcmp(p22->name,name)==0) //比较有什么意义？if和else执行了基本上相同的逻辑除了k--             {                 k--;                 p23=p22;                 p22=p22->next;             }             else             {                 p23=p22;                 p22=p22->next;             }         }         printf("选择要修改的账户信息的项目序号：");         scanf("%d",&choice);         while(choice)         {             switch(choice)             {                 case 1:                     {                         printf("请输入更正后的姓名：");                         scanf("%s",p23->name);    //此时的p23是否为你要找的节点，我看不一定，可能是NULL                         printf("修改成功");                         break;                     }                 case 2:                     {                         printf("请输入更正后的收入金额：");                         scanf("%lf",&p23->income);                         printf("修改成功");                         break;                     }                 case 3:                     {                         printf("请输入更正后的支出金额：");                         scanf("%lf",&p23->spend);                         printf("修改成功");                         break;                     }                 case 4:                     {                         printf("请输入更正后的用途：");                         scanf("%s",p23->use);                         printf("修改成功");                         break;                     }                 case 5:                     {                         printf("请输入更正后的使用时间：");                         scanf("%s",p23->time);                         printf("修改成功");                         break;                     }                 case 0:break;                 default:                        printf("请输入正确的序号：");                        break;              }             if(choice==2||choice==3)             {                 if(p24==p23)                 {                     p24->sum=p23->income-p23->spend;                 }                 else                 {                     while(p24->next!=p23)                     {                         p24=p24->next;                     }                     Correct(p24);                 }              }         }     }     else     {         printf("查无此人！");     } } int main() {     struct message *head=NULL;     head=Findfile(head);     int power=1;     if(power)     {         Change(head);     }     return 0;  }  问题比较多，楼主的问题只是其中一个。建议楼主在Findfile函数执行完把创建的链表打印出来，确保进入Change函数里的链表是正常的。

user: user-1
content: 修正#2楼的，第43，44行之间插入一行：fclose(fp1);（得把打开的文件关闭了）

user: user-1
content: 供参考：#include <stdio.h> #include <stdlib.h> #include <string.h>  struct message {     char name[10];//用户     char use[50];//用途     double income;//收入     double spend;//支出     char time[10];//使用时间     double sum;//余额     struct message *next; };  struct message *Findfile(struct message *head1)//将文件信息存到链表中 {     struct message *head;     FILE *fp1;     struct message *p1,*p2;      if((fp1=fopen("money.in","r"))==NULL)     {         printf("cannot open file\n");         return 0;     }     if (head1 == NULL){         head1=(struct message* )malloc(sizeof(struct message));//生成头节点         head = head1;         head1->next=NULL;     }else{         for(head=head1;head->next!=NULL;head=head->next);//找到节点尾部     }     p2 = head;     while(1){         p1=(struct message* )malloc(sizeof(struct message));         if(fscanf(fp1,"%s%lf%lf%lf%s%s\n",p1->name,&p1->income,                      &p1->spend,&p1->sum,p1->use,p1->time)!=6)break;         p1->next=NULL;         if(head==NULL) head->next=p1;         else p2->next=p1;         p2=p1;     }     return head1; }  void Correct(struct message *head3) {     struct message *p31=head3,*p32=p31->next;     while(p31&&p32)     {         p32->sum=(p31->sum)+(p32->income)-(p32->spend);         p31=p31->next;         p32=p31->next;     } }  void Change(struct message *head2) {     int k=0,choice;     struct message *p21,*p22=head2,*p23,*p24=head2;     p21=head2;     char name[10];     printf("请输入要修改的人的名字：");     scanf("%s",name);     while(p21)     {         if(strcmp(p21->name,name)==0)         {             k++;             printf("[%d] %s %.2f %.2f %.2f %s %s\n",k,p21->name,                      p21->income,p21->spend,p21->sum,p21->use,p21->time);         }         p21=p21->next;     }     if(k!=0)     {         printf("选择要修改的账户信息的序号：");         scanf("%d",&k);         while(k)         {             if(strcmp(p22->name,name)==0)             {                 k--;                 p23=p22;                 p22=p22->next;             }             else             {                 p23=p22;                 p22=p22->next;             }         }         printf("选择要修改的账户信息的项目序号：");         scanf("%d",&choice);         while(choice)         {             switch(choice)             {             case 1:                 {                     printf("请输入更正后的姓名：");                     scanf("%s",p23->name);                     printf("修改成功");                     break;                 }             case 2:                 {                     printf("请输入更正后的收入金额：");                     scanf("%lf",&p23->income);                     printf("修改成功");                     break;                 }             case 3:                 {                     printf("请输入更正后的支出金额：");                     scanf("%lf",&p23->spend);                     printf("修改成功");                     break;                 }             case 4:                 {                     printf("请输入更正后的用途：");                     scanf("%s",p23->use);                     printf("修改成功");                     break;                 }             case 5:                 {                     printf("请输入更正后的使用时间：");                     scanf("%s",p23->time);                     printf("修改成功");                     break;                 }             case 0:break;             default:             printf("请输入正确的序号：");             break;              }             if(choice==2||choice==3)             {                 if(p24==p23)                 {                     p24->sum=p23->income-p23->spend;                 }                 else                 {                     while(p24->next!=p23)                     {                         p24=p24->next;                     }                     Correct(p24);                 }              }         }     }     else     {         printf("查无此人！");     } }  int main() {    struct message *head=NULL;    head = Findfile(head);    int power=1;    if(power)    {        Change(head);    }    return 0; }

user: user-3
content: 数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633