user-0 提问: C语言版数据结构——栈的初始化问题

回复:
user: user-1
content: [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++;     } }

user: user-2
content: 引用 3 楼 huiguimoyu 的回复:引用 2 楼 zhaokai115 的回复:明显的S野指针，没初始化就用上了请问下该怎么改呢？谢谢 第25行简单地改成     SqStack S;    // SqStack *S;

user: user-3
content: 引用 9 楼 huiguimoyu 的回复:[quote=引用 7 楼 buyong 的回复:] [quote=引用 6 楼 huiguimoyu 的回复:] [quote=引用 5 楼 user-7 的回复:] [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取地址。

user: user-4
content: 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; }

user: user-0
content: 引用 7 楼 buyong 的回复:[quote=引用 6 楼 huiguimoyu 的回复:] [quote=引用 5 楼 user-7 的回复:] [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,这不也是传个地址进去吗？

user: user-5
content: S->base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType)); S 是野指针的，进去这样用会有问题的！ 最好给S 一个有效的地址先！（初始化下）

user: user-6
content: 引用 6 楼 huiguimoyu 的回复:[quote=引用 5 楼 user-7 的回复:] [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);    //看看能不能输出来   }

user: user-0
content: 引用 5 楼 user-7 的回复:[quote=引用 4 楼 huiguimoyu 的回复:] [quote=引用 1 楼 jerry_dqh 的回复:] 在发生问题后，看一下在哪儿断住的  	S->base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType)); 这一句断掉了[/quote]  s 初始化了吗？[/quote]我没搞懂啊。但是书上就是这么干的啊。。。请问要怎么初始化，S指向谁呢，我就是想初始化S，InitStack()函数就是用来初始化S的啊。。。

user: user-7
content: 引用 4 楼 huiguimoyu 的回复:[quote=引用 1 楼 jerry_dqh 的回复:] 在发生问题后，看一下在哪儿断住的  	S->base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType)); 这一句断掉了[/quote]  s 初始化了吗？

user: user-0
content: 引用 1 楼 jerry_dqh 的回复:在发生问题后，看一下在哪儿断住的  	S->base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType)); 这一句断掉了

user: user-0
content: 引用 2 楼 zhaokai115 的回复:明显的S野指针，没初始化就用上了请问下该怎么改呢？谢谢

user: user-2
content: 明显的S野指针，没初始化就用上了

user: user-3
content: 在发生问题后，看一下在哪儿断住的