A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 瑾❤ 中级黑马   /  2014-6-12 23:25  /  1177 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 瑾❤ 于 2014-6-13 22:50 编辑
  1. /*
  2. *使用单链表结构存储所有人的信息
  3. */
  4. #include <stdio.h>
  5. #include <string.h>

  6. typedef struct Person
  7. {
  8.    char name[50];
  9.    struct Person *nextPer; //指向下一个人
  10. }PersonInfo;

  11. //定义头指针结构体
  12. typedef struct
  13. {
  14.    int count;                    
  15.    struct Person *nextPer; //指向下一个人
  16. }PerHead;

  17. //添加人并输出处理结果
  18. void addPer(PerHead *source)
  19. {
  20.         //存储待添加的人
  21.         PersonInfo per;
  22.         PersonInfo *temp;

  23.         //提示/输入姓名
  24.     printf("Input the name:");
  25.     scanf("%s",per.name);
  26.         getchar();

  27.         //将人存入source链表中,并将计数器加一
  28.     source->count++;
  29.     per.nextPer=source->nextPer;
  30.     source->nextPer=&per;
  31.     printf("\nAdd student:%s",per.name);

  32.         //打印全部人
  33.     printf("\n_________ALL_________\n");
  34.         printf("have %d person\n",source->count);
  35.     temp=source->nextPer;
  36.         while(temp!=NULL)
  37.         {
  38.                 printf("person:%s\n",temp->name);
  39.                 temp=temp->nextPer;
  40.         }
  41. }

  42. int main()
  43. {
  44.         //定义变量用于存储所有人
  45.         PerHead AllPerson={0,NULL};

  46.     while(1)
  47.     {
  48.         char command;
  49.         printf("\n^^^^^^^^^^^^^^^^^^^^^^^^\n");
  50.         printf("A(Add)   Q(Quit)\n");//提示用户输入对应的命令字符(A、Q)
  51.         scanf("%c",&command);
  52.                 getchar();
  53.         switch(command)//根据命令的不同执行不同操作
  54.         {
  55.                         case 'Q':            //退出
  56.                 return 0;
  57.              case'A':            //添加
  58.                addPer(&AllPerson);
  59.                break;
  60.             default:                        //其他非法字符时不做处理
  61.                break;
  62.         }
  63.     }
  64.     return 0;
  65. }
复制代码
程序功能:从控制台循环输入人的信息并存入一个单链表AllPerson中
问题描述:第一次添加人员时一切正常,第二次添加人员后,输出全部人员时进入死循环,并打印的是同一个人,这是什么原因呢?

result.JPG (40.29 KB, 下载次数: 13)

result.JPG

评分

参与人数 1技术分 +1 收起 理由
傘が咲く + 1

查看全部评分

2 个回复

倒序浏览
学习了啊
回复 使用道具 举报
找到原因了:  由于退出addPer方法时,局部变量per被回收,重新进入时,又给per分配了与先前一样的存储空间,导致指针指向异常
解决方案:
  1. //添加人并输出处理结果
  2. void addPer(PerHead *source)
  3. {
  4.         //存储待添加的人
  5.         PersonInfo *per=(PersonInfo *)malloc(sizeof(PersonInfo));//动态分配内存空间
  6.         PersonInfo *temp;

  7.         //提示/输入姓名
  8.         printf("Input the name:");
  9.         scanf("%s",per->name);
  10.         getchar();


  11.         //将人存入source链表中,并将计数器加一
  12.         source->count++;
  13.         per->nextPer=source->nextPer;
  14.         source->nextPer=per;
  15.         printf("\nAdd student:%s",per->name);


  16.         //打印全部人
  17.         printf("\n_________ALL_________\n");
  18.         printf("have %d person\n",source->count);
  19.         temp=source->nextPer;
  20.         while(temp!=NULL)
  21.         {
  22.                 printf("person:%s\n",temp->name);
  23.                 temp=temp->nextPer;
  24.         }
  25. }
复制代码


回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马