LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 981|回复: 13

求助:写了个栈的实现及应用。实现中出错。

[复制链接]
发表于 2003-7-18 20:24:15 | 显示全部楼层 |阅读模式
已经将程序改好了,但是运行的时候说是段错误。
下面是修改完毕的程序,原来的错误的已经让我删除了。

从书上抄的程序。
包括两个文件convert.c和stack.h
convert.c用来将十进制数转换为八进制数,然后输出,stack.h是用来栈的实现。不知道出现什么问题了。总是不对.

convert.c

  1. #include "stack.h"
  2. main()
  3. {
  4.         SElemType *e;
  5.         SElemType m;
  6.         void conversion()
  7.         {
  8.                 int N;
  9.                 stq s;
  10.                 InitStack(s);
  11.                 printf("Please input N:\n");
  12.                 scanf("%d",&N);
  13.                 while(N)
  14.                 {
  15.                         m.number = N%8;
  16.                         m.sex = 'f';
  17.                         Push(s,m);
  18.                         N = N%8;
  19.                 }
  20.                 while(!StackEmpty(s))
  21.                 {
  22.                         Pop(s,e);
  23.                         printf("%d",e->number);
  24.                 }
  25.         }
  26.         conversion();
  27. }
复制代码


stack.h

  1. #include <stdlib.h>
  2. #define STACK_INIT_SIZE 100
  3. #define STACKINCREMENT 10
  4. #define OVERFLOW 0
  5. #define OK 1
  6. #define ERROR 0
  7. typedef int status;
  8. typedef struct {
  9.         int number;
  10.         char sex;
  11. }SElemType;
  12. typedef struct {
  13.         SElemType *base;
  14.         SElemType *top;
  15.         int stacksize;
  16. }SqStack,*stq;

  17. /***************InitStack(stq S)*****************/
  18. status InitStack(stq S)
  19. {
  20.         S->base = (SElemType *)malloc((size_t)STACK_INIT_SIZE * sizeof(SElemType));
  21.         if(!S->base) exit(OVERFLOW);
  22.         S->top = S->base;
  23.         S->stacksize = STACK_INIT_SIZE;
  24.         return OK;
  25. }
  26. /***************GetTop(stq S,SElemType *e)*********/
  27. status GetTop(stq S,SElemType *e)
  28. {
  29.         if(S->top == S->base) return(ERROR);
  30.         *e = *(S->top - 1);
  31.         return OK;
  32. }
  33. /*************Push(stq S,SElemType *e)************/
  34. status Push(stq S,SElemType e)
  35. {
  36.         if(S->top - S->base >= S->stacksize)
  37.         {
  38.                 S->base = (SElemType *)realloc(S->base,(S->stacksize + STACKINCREMENT)*sizeof(SElemType));
  39.                 if(!S->base) exit(OVERFLOW);
  40.                 S->top = S->base + S->stacksize;
  41.                 S->stacksize += STACKINCREMENT;
  42.         }
  43.         *S->top++ = e;
  44.         return OK;
  45. }
  46. /************Pop(stq S,SElemType *e)**************/
  47. status Pop(stq S,SElemType *e)
  48. {
  49.         if(S->base == S->top) return ERROR;
  50.         --S->top;
  51.         *e = *S->top;
  52.         return OK;
  53. }
  54. /****************DestroyStack(stq S)******************/
  55. status DestroyStack(stq S)
  56. {
  57.         free(S->base);
  58.         return OK;
  59. }
  60. /***************ClearStack(stq S)*********************/
  61. status ClearStack(stq S)
  62. {
  63.         S->top = S->base;
  64.         S->stacksize = STACK_INIT_SIZE;
  65.         return OK;
  66. }
  67. /**************StackEmpty(stq S)*********************/
  68. status StackEmpty(stq S)
  69. {
  70.         if(S->base == S->top) return OK;
  71.         else return ERROR;
  72. }

复制代码


运行时提示段错误.

发表于 2003-7-18 20:48:58 | 显示全部楼层
convert.c
第一行: #include "stack.h";    不要分号

stack.h
第2-6行    都不要分号

别的一下子看不出来.
发表于 2003-7-18 21:17:54 | 显示全部楼层
奇怪,你是照什么书上抄的?
怎么把convert函数定义在main里面了。
convert里的push调用也不对,第二个参数是int,应该是结构。
 楼主| 发表于 2003-7-18 21:18:48 | 显示全部楼层
惭愧,那么低级的错误,已经改好了.编译也通过了,只是运行的时候说段错误。
 楼主| 发表于 2003-7-18 21:21:32 | 显示全部楼层
最初由 libinary 发表
奇怪,你是照什么书上抄的?
怎么把convert函数定义在main里面了。
convert里的push调用也不对,第二个参数是int,应该是结构。


我只是想把stack.h当作库函数,在应用程序里面包含就可以了。
convert.c是我按照书上的意思写的。
发表于 2003-7-18 21:29:40 | 显示全部楼层
SElemType e;
......
e.number = N % 8;
push(s, e);
......
printf("%d", e.number);
试试。

不过总觉得这个库有点不舒服,可能是和我的风格不太一样。
 楼主| 发表于 2003-7-18 22:04:41 | 显示全部楼层
已经改了,还是段错误。我把改好的程序贴在了顶楼,把以前的删除了.
发表于 2003-7-18 22:36:12 | 显示全部楼层
main里面怎么还是有个convert?
你的stack写的有问题,比如push函数,参数是结构stq S,代码应该用S.xxx,S->xxx是指针用的。
 楼主| 发表于 2003-7-18 23:28:11 | 显示全部楼层
我把conversion这个函数移到stack.h里面了,结果能够运行。
但是当我输入N值的时候系统运行的太繁忙了,以至于什么都没有反应,我只好reset了。

为什么在main函数中不能定义conversion?
我以前就出现过这样的问题,在main函数中定义两个函数,然后使用,系统说是static declaration followed non-static......什么的反正后面的记不清了。

还有我在typedef中说明了stq是指向SqStack类型的结构体,
然后stq S,所以代码用的就是S->xxxx,而没有用S.xxxx。
因为push操作中需要将SElemType类型的数据压入栈中,push的返回值代表成功与否,所以我用指针作行参的。
发表于 2003-7-19 08:03:08 | 显示全部楼层
C语言对结构化编程支持不完全,比如在PASCAL里你可以在函数内定义另一个函数,C语言不行,所有函数都是平级的。
S->xxx的问题我没看清楚,再看看。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表