免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2018 | 回复: 7
打印 上一主题 下一主题

请教一个线性表顺序存储的实现问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-05-08 10:20 |只看该作者 |倒序浏览
最近在学数据结构,我不喜欢伪码,希望有具体的实现,但是出了一点小问题
下面是我的代码

  1. #include <stdio.h>
  2. #include <malloc.h>

  3. #define MAXSIZE 1024

  4. typedef char datatype;

  5. typedef struct
  6. {
  7.   datatype data[MAXSIZE];
  8.   int last;
  9. }sequenlist;



  10. int insert (sequenlist *L, datatype x, int i)
  11. {
  12.   int j;
  13.   
  14.   if (L->last == MAXSIZE -1)
  15.     {
  16.       printf("overflow");
  17.       return 0;
  18.     }

  19.   else if ((i < 0) || (i > L->last))
  20.     {
  21.       printf("error,please input the right 'i'");
  22.       return 0;
  23.     }
  24.   
  25.   else
  26.     {
  27.       for (j = L->last; j >= i; j--)
  28.         {
  29.           L->data[j+1] = L->data[j];
  30.           L->data[i] = x;
  31.           L->last = L->last + 1;
  32.           
  33.         }
  34.     }
  35.   return 1;

  36. }


  37. int dellist (sequenlist *L, int i)
  38. {
  39.   if ((i < 0) || (i > L->last))
  40.     {
  41.       printf("error, please input the right i");
  42.       return 0;
  43.     }
  44.   
  45.   else
  46.     {
  47.       for (;i < L->last; i++)
  48.         {
  49.           L->data[i] = L->data[i+1];
  50.           L->last = L->last - 1;
  51.           return 1;
  52.         }

  53.     }


  54. }

  55. void creatlist(sequenlist *L)
  56. {
  57.   int n, i;
  58.   char tmp;
  59.   printf("请输入数据的个数:\n");
  60.   scanf("%d",&n);
  61.   
  62.   for (i = 0; i < n; i++)
  63.     {
  64.       printf("data[%d]=",i);
  65.       fflush(stdin);
  66.       scanf("%c",&tmp);
  67.       L->data[i] = tmp;
  68.     }
  69.   L->last = n-1;
  70.   printf("\n");
  71. }

  72. void printout(sequenlist *L)
  73. {
  74.   int i;
  75.   for (i = 0; i <= L->last; i++)
  76.     {
  77.       printf("data[%d]=",i);
  78.       printf("%c\n", L->data[i]);
  79.     }

  80. }

  81. main()
  82. {
  83.   sequenlist *L;
  84.   char cmd,x;
  85.   int i;
  86.   
  87.   L = (sequenlist*)malloc(sizeof (sequenlist));
  88.   creatlist(L);
  89.   printout(L);
  90.   
  91.   do
  92.     {
  93.       printf("i,I......插入\n");
  94.       printf("d,D......删除\n");
  95.       printf("q,Q......退出\n");
  96.       
  97.       do
  98.         {
  99.           fflush(stdin);
  100.           scanf("%c",&cmd);

  101.         }while((cmd != 'd') && (cmd != 'D') && (cmd != 'q') && (cmd != 'Q') && (cmd != 'i') && (cmd != 'I'));

  102.       switch (cmd)
  103.         {
  104.         case 'i':
  105.         case 'I':
  106.           printf("请输入你要插入的数据:");
  107.           fflush(stdin);
  108.           scanf("%c",&x);
  109.           printf("请输入你要插入的位置:");
  110.           scanf("%d",&i);
  111.           insert(L, x, i);
  112.           printout(L);
  113.           break;
  114.         case 'd':
  115.         case 'D':
  116.           printf("请输入你要删除元素的位置:");
  117.           fflush(stdin);
  118.           scanf("%d",&i);
  119.           dellist(L, i);
  120.           printout(L);
  121.           break;
  122.         }
  123.     }while((cmd != 'q') && (cmd != 'Q'));

  124. }
复制代码




在Linux,Windows下编译都没有什么问题,但是运行时出了点问题:

  1. data[0]=data[1]=5
复制代码

为什么“ data[0]=data[1]”连在了一起??

  1. 请输入你要插入的数据:请输入你要插入的位置:2
复制代码

“请输入你要插入的数据:请输入你要插入的位置”这两个地方也连在了一起??

我无法正常输入,

但是在Windows下编译,运行都正常,也是用的gcc编译器

在Linux下运行情况如下:


  1. ./contiguous-list
  2. 请输入数据的个数:
  3. 3
  4. data[0]=data[1]=5
  5. data[2]=
  6. data[0]=

  7. data[1]=5
  8. data[2]=

  9. i,I......插入
  10. d,D......删除
  11. q,Q......退出
  12. i
  13. 请输入你要插入的数据:请输入你要插入的位置:2
  14. data[0]=

  15. data[1]=5
  16. data[2]=

  17. data[3]=

  18. i,I......插入
  19. d,D......删除
  20. q,Q......退出
  21. q
复制代码

论坛徽章:
0
2 [报告]
发表于 2006-05-08 10:40 |只看该作者
不会吧,“请输入你要插入的数据:请输入你要插入的位置”应该不会连着才对,你已经用fflush(stdin)了,应该等你的输入才对,我手上没这环境,无法调试。关注。。。

论坛徽章:
0
3 [报告]
发表于 2006-05-08 11:17 |只看该作者
用gdb调试,问题已解决


  1. for (i = 0; i < n; i++)
  2.     {
  3.       printf("data[%d]=",i);
  4.       fflush(stdin);
  5.       scanf("%c",&tmp);
  6.       L->data[i] = tmp;
  7.     }
复制代码


问题主要在这个地方,这个地方解决了,其他的地方是同样的道理


  1. ./contiguous-list
  2. 请输入数据的个数:
  3. 3
  4. data[0]=data[1]=5
  5. data[2]=
  6. data[0]=

  7. data[1]=5
  8. data[2]=

  9. i,I......插入
复制代码


我“输入请输入数据的个数:”后面输入了 3 之后,我还输入了一个回车

这时fflush(stdin)并没有起作用,大家可以看到打印数组元素的时候,"data[0]="后面有一个空行

也就是说回车“\n”被直接读入了data[0]

代码换成了这样,就没有问题了:

  1. for (i = 0; i < n; i++)
  2.     {
  3.       printf("data[%d]=",i);
  4.       getchar();
  5.       scanf("%c",&tmp);
  6.       L->data[i] = tmp;
  7.     }
复制代码


问题虽然解决了,但仍有疑问:

1,为什么在windows下可以,
2,fflush出了什么问题,

希望有人帮忙解答

论坛徽章:
0
4 [报告]
发表于 2006-05-08 11:22 |只看该作者
不论怎样,在用输入控制时,最好在输入之前fflush(stdin);
从上面结果,Win的fflush表现正常,而Linux 的fflush表现不正常
希望达人解惑!

论坛徽章:
0
5 [报告]
发表于 2006-05-08 11:24 |只看该作者
估计关键在这个stdin上面

原帖由 tyc611 于 2006-5-8 11:22 发表
不论怎样,在用输入控制时,最好在输入之前fflush(stdin);
从上面结果,Win的fflush表现正常,而Linux 的fflush表现不正常
希望达人解惑!

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
6 [报告]
发表于 2006-05-08 12:04 |只看该作者
原帖由 kahala 于 2006-5-8 11:24 发表
估计关键在这个stdin上面


On an output stream, fflush causes any buffered but unwritten data to be written; on an input stream, the effect is undefined.

论坛徽章:
0
7 [报告]
发表于 2006-05-08 12:17 |只看该作者

论坛徽章:
0
8 [报告]
发表于 2006-05-08 16:41 |只看该作者
唉。。为什么没几个人相信 fflush(stdin) 是不可用的。。MS 害人不浅啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP