C语言版数据结构——栈的初始化问题

GPU小码农 2013-10-12 08:54:42
不知为什么,程序一运行就异常停止。求大神帮看看哪里不对啊!!
#define FLASE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define STACK_INIT_SIZE 100
#define STACKCREMENT 10
typedef int SElemType;
typedef int Status;
typedef struct
{
SElemType * base;
SElemType * top;
int stacksize;
}SqStack;
//////////////////////////////////////////////
Status InitStack(SqStack *S);
Status Push(SqStack *S, SElemType e);
Status Pop(SqStack *S, SElemType *e);
void Print(SqStack *S);
//////////////////////////////////////////////
void main()
{
int N = 4;
SqStack *S;
InitStack(S);//初始化一个栈
Push(S,5); //放一个数字5进去
Print(S); //看看能不能输出来

}
Status InitStack(SqStack *S) //初始化一个空栈
{
S->base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
if(!S->base)exit(OVERFLOW);
S->top = S->base;
S->stacksize = STACK_INIT_SIZE;
return OK;
}
Status Push(SqStack *S, SElemType e)//压栈操作
{
if(S->top - S->base >= S->stacksize)
{
S->base = (SElemType *)malloc((S->stacksize + STACKCREMENT) * sizeof(SElemType));
if(!S->base)exit(OVERFLOW);
S->top = S->base + S->stacksize;//
S->stacksize += STACKCREMENT;
}
printf("xx");//debug
*(S->top) = e;
printf("%d",*(S->top));
S->top++;
return OK;
}
Status Pop(SqStack *S, SElemType *e)//出栈
{
if(S->base == S->top)return ERROR;
*e = *(S->top);
--S->top;
return OK;
}
void Print(SqStack *S)//打印
{
int *p;
p=S->base;
if(S->base == S->top)
{
printf("\n空栈!没有数据用来输出!\n");
exit(FLASE);
}
else
{
printf("%d");
p++;
}
}
...全文
827 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
coincidenceWQ 2014-02-12
  • 打赏
  • 举报
回复
[color=#FF0000]我把pint函数修改了下[/color] #include <stdio.h> #include <stdlib.h> #define FLASE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 #define STACK_INIT_SIZE 100 #define STACKCREMENT 10 typedef struct { int * base; int * top; int stacksize; }SqStack; ////////////////////////////////////////////// int InitStack(SqStack *S); int Push(SqStack *S, int e); int Pop(SqStack *S, int *e); void Print(SqStack *S); ////////////////////////////////////////////// int main() { int N = 4; SqStack *S; InitStack(S);//初始化一个栈 Push(S,5); //放一个数字5进去 Print(S); //看看能不能输出来 system("pause"); return 0; } int InitStack(SqStack *S) //初始化一个空栈 { S->base = (int *)malloc(STACK_INIT_SIZE * sizeof(int)); if(!S->base)exit(OVERFLOW); S->top = S->base; S->stacksize = STACK_INIT_SIZE; return OK; } int Push(SqStack *S, int e)//压栈操作 { if(S->top - S->base >= S->stacksize) { S->base = (int *)malloc((S->stacksize + STACKCREMENT) * sizeof(int)); if(!S->base)exit(OVERFLOW); S->top = S->base + S->stacksize;// S->stacksize += STACKCREMENT; } // printf("xx");//debug *(S->top) = e; printf("%d\n",*(S->top)); S->top++; return OK; } int Pop(SqStack *S)//出栈 { if(S->base == S->top)return ERROR; int e = *(S->top); --S->top; return OK; } void Print(SqStack *S)//打印 { int *p; p=S->base; if(S->base == S->top) exit(ERROR); /*{ printf("\n空栈!没有数据用来输出!\n"); exit(FLASE); }*/ while(p != S->top) { printf("%d \n",*p); p++; } }
zhaokai115 2013-10-14
  • 打赏
  • 举报
回复
引用 3 楼 huiguimoyu 的回复:
引用 2 楼 zhaokai115 的回复:
明显的S野指针,没初始化就用上了
请问下该怎么改呢?谢谢
第25行简单地改成
    SqStack S;    // SqStack *S;
碼上道 2013-10-13
  • 打赏
  • 举报
回复
引用 9 楼 huiguimoyu 的回复:
[quote=引用 7 楼 buyong 的回复:] [quote=引用 6 楼 huiguimoyu 的回复:] [quote=引用 5 楼 AnYidan 的回复:] [quote=引用 4 楼 huiguimoyu 的回复:] [quote=引用 1 楼 jerry_dqh 的回复:] 在发生问题后,看一下在哪儿断住的
S->base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType)); 这一句断掉了[/quote] s 初始化了吗?[/quote]我没搞懂啊。但是书上就是这么干的啊。。。请问要怎么初始化,S指向谁呢,我就是想初始化S,InitStack()函数就是用来初始化S的啊。。。[/quote] 把你的书扔了吧。 S没有初始化,居然就S->base 看来你可以这样试试: void main() { int N = 4; SqStack S; InitStack(&S);//初始化一个栈 Push(&S,5); //放一个数字5进去 Print(&S); //看看能不能输出来 }[/quote]但是写成&S会报错啊,因为形参的类型是*S,这不也是传个地址进去吗? [/quote] 可以的,&s取地址。
lm_whales 2013-10-13
  • 打赏
  • 举报
回复

Status Push(SqStack *S, SElemType e)//压栈操作
{
    if(S->top - S->base >= S->stacksize)
    {
        S->base = (SElemType *)malloc((S->stacksize + STACKCREMENT) * sizeof(SElemType));
        if(!S->base)exit(OVERFLOW);
        S->top = S->base + S->stacksize;//
        S->stacksize += STACKCREMENT;        
    }
    printf("xx");//debug
    *(S->top) = e;
    printf("%d",*(S->top));
    S->top++;
    return OK;
}
改成

Status Push(SqStack *S, SElemType e)//压栈操作
{
#define USE_REALLOC 1
    if(S->top - S->base >= S->stacksize)
    {
        //申请一块更大的内存
#if USE_REALLOC
        // realloc 重新申请更大内存。会自动搬迁数据。
       
        SElemType * p  =(SElemType *)realloc(S->base,(S->stacksize + STACKCREMENT) * sizeof(SElemType));
        if( !p ){ free(S->base); exit(OVERFLOW);} 
        S->base = p;

 #else //if USE_MALLOC
        //malloc 版重新申请更大内存,自己搬迁数据。
        
        SElemType * p  = (SElemType *)malloc((S->stacksize + STACKCREMENT) * sizeof(SElemType));
        if(!S->base){
           free(S->base);
           exit(OVERFLOW);
        }
        memcpy(p,S->base,S->stacksize * sizeof(SElemType));
        free(S->base);
        S->base = p;   
#endif
   
        S->top = S->base + S->stacksize;//
        S->stacksize += STACKCREMENT;        
    }
    printf("xx");//debug
    *(S->top) = e;
    printf("%d",*(S->top));
    S->top++;
    return OK;
#undef USE_REALLOC
}

void PrintElem(const SElemType *e)
{
      printf("%d ",*e);
}

void Print(SqStack *S)//打印
{
    SElemType *p;
    p=S->base;
    if(S->base == S->top)
    {
        printf("\n空栈!没有数据用来输出!\n");
        exit(FLASE);
    }
    else
    { //printf("%d"); 开玩笑,这能输出啥子??缺少参数 %d,格式需要一个整形参数。
      //  p++;
       while(p!= S->top)
          PrintElem(p++);  //输出栈里存放的所有数。     
    }
}
添加一个函数,释放内存。
Destroy(SqStack *S){
free(S->base);
}
//修改main,释放内存。
int main()
{
    int N = 4;
    SqStack S;
    InitStack(&S);//初始化一个栈
    Push(&S,5);    //放一个数字5进去
    Print(&S);    //看看能不能输出来
    Destroy(&S);  //释放内存
    return 0;
}
GPU小码农 2013-10-12
  • 打赏
  • 举报
回复
引用 7 楼 buyong 的回复:
[quote=引用 6 楼 huiguimoyu 的回复:] [quote=引用 5 楼 AnYidan 的回复:] [quote=引用 4 楼 huiguimoyu 的回复:] [quote=引用 1 楼 jerry_dqh 的回复:] 在发生问题后,看一下在哪儿断住的
S->base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType)); 这一句断掉了[/quote] s 初始化了吗?[/quote]我没搞懂啊。但是书上就是这么干的啊。。。请问要怎么初始化,S指向谁呢,我就是想初始化S,InitStack()函数就是用来初始化S的啊。。。[/quote] 把你的书扔了吧。 S没有初始化,居然就S->base 看来你可以这样试试: void main() { int N = 4; SqStack S; InitStack(&S);//初始化一个栈 Push(&S,5); //放一个数字5进去 Print(&S); //看看能不能输出来 }[/quote]但是写成&S会报错啊,因为形参的类型是*S,这不也是传个地址进去吗?
max_min_ 2013-10-12
  • 打赏
  • 举报
回复
S->base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType)); S 是野指针的,进去这样用会有问题的! 最好给S 一个有效的地址先!(初始化下)
buyong 2013-10-12
  • 打赏
  • 举报
回复
引用 6 楼 huiguimoyu 的回复:
[quote=引用 5 楼 AnYidan 的回复:] [quote=引用 4 楼 huiguimoyu 的回复:] [quote=引用 1 楼 jerry_dqh 的回复:] 在发生问题后,看一下在哪儿断住的
S->base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType)); 这一句断掉了[/quote] s 初始化了吗?[/quote]我没搞懂啊。但是书上就是这么干的啊。。。请问要怎么初始化,S指向谁呢,我就是想初始化S,InitStack()函数就是用来初始化S的啊。。。[/quote] 把你的书扔了吧。 S没有初始化,居然就S->base 看来你可以这样试试: void main() { int N = 4; SqStack S; InitStack(&S);//初始化一个栈 Push(&S,5); //放一个数字5进去 Print(&S); //看看能不能输出来 }
GPU小码农 2013-10-12
  • 打赏
  • 举报
回复
引用 5 楼 AnYidan 的回复:
[quote=引用 4 楼 huiguimoyu 的回复:] [quote=引用 1 楼 jerry_dqh 的回复:] 在发生问题后,看一下在哪儿断住的
S->base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType)); 这一句断掉了[/quote] s 初始化了吗?[/quote]我没搞懂啊。但是书上就是这么干的啊。。。请问要怎么初始化,S指向谁呢,我就是想初始化S,InitStack()函数就是用来初始化S的啊。。。
AnYidan 2013-10-12
  • 打赏
  • 举报
回复
引用 4 楼 huiguimoyu 的回复:
[quote=引用 1 楼 jerry_dqh 的回复:] 在发生问题后,看一下在哪儿断住的
S->base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType)); 这一句断掉了[/quote] s 初始化了吗?
GPU小码农 2013-10-12
  • 打赏
  • 举报
回复
引用 1 楼 jerry_dqh 的回复:
在发生问题后,看一下在哪儿断住的
S->base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType)); 这一句断掉了
GPU小码农 2013-10-12
  • 打赏
  • 举报
回复
引用 2 楼 zhaokai115 的回复:
明显的S野指针,没初始化就用上了
请问下该怎么改呢?谢谢
zhaokai115 2013-10-12
  • 打赏
  • 举报
回复
明显的S野指针,没初始化就用上了
碼上道 2013-10-12
  • 打赏
  • 举报
回复
在发生问题后,看一下在哪儿断住的

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧