首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

销毁栈的时分崩溃

2013-01-18 
销毁栈的时候崩溃#include stdio.h#include malloc.h#include math.h#define STACK_INIT_SIZE 10#de

销毁栈的时候崩溃
销毁栈的时分崩溃

#include <stdio.h>  
#include <malloc.h>  
#include <math.h>  
  
#define STACK_INIT_SIZE 10  
#define STACK_INCREMENT_SIZE 10  
  
typedef char ElemType;  
  
typedef struct   
{  
    ElemType *base;  
    ElemType *top;  
    int stackSize;  
}stack;  
  
void initStack(stack *s)  
{  
    s->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));  
    if(!(s->base)) return;  
    s->top = s->base;  
    s->stackSize = STACK_INIT_SIZE;  
}  
  
void pushStack(stack *s, ElemType e)  
{  
    if((s->top - s->base) >= s->stackSize)  
    {  
        s->base = (ElemType *)realloc(s->base, (s->stackSize + STACK_INCREMENT_SIZE) * sizeof(ElemType));  
        if(!(s->base)) return;  
        s->top = s->base + s->stackSize;  
        s->stackSize = s->stackSize + STACK_INCREMENT_SIZE;  
    }  
  
    *(s->top) = e;  
    (s->top)++;  
}  
  
void popStack(stack *s, ElemType *e)  
{  
    if(s->base == s->top) return;  
    *e = *(--(s->top));  
}  
  
int stackLen(stack s)  
{  
    return (s.top - s.base);  
}  
  
void destroyStack(stack *s)  
{  
    free(s->base);  
    s->base = s->top = NULL;  
    s->stackSize = 0;  
}  
  
//void destroyStack(stack *s)  
//{  
//  int i, len;  
//  len = s->stackSize;  
//  for(i = 0; i < len; i++)  
//  {  
//      free(s->base);  
//      s->base++;  
//  }  
//  
//  s->base = s->top = NULL;  
//  s->stackSize = 0;  
//}  
  
int power(int n)  
{  
    int i;  
    int product = 1;  
    for(i = 1; i <= n; i++)  


    {  
        product = product * 2;  
    }  
  
    return product;  
}  
  
void main()  
{  
    stack binaryToDecimalStack;  
    int i, len, decimal = 0;  
    ElemType pushBinary, popBinary;  
  
    initStack(&binaryToDecimalStack);  
    printf("请输入二进制数,以“;”结束:\n");  
    scanf("%c", &pushBinary);  
    while(pushBinary != ';')  
    {  
        pushStack(&binaryToDecimalStack, pushBinary);  
        scanf("%c", &pushBinary);  
    }  
      
    len = stackLen(binaryToDecimalStack);  
  
    for(i = 0; i < len; i++)  
    {  
        popStack(&binaryToDecimalStack, &popBinary);  
        while(popBinary != '0' && popBinary != '1')  
        {  
            printf("不好意思,您输入的不是二进制数据!:\n");  
            return;  
        }  
  
        decimal = decimal + (popBinary - 48) * power(i);  
    }  
  
    for(i = 0; i < len; i++)  
    {  
        printf("%c", *(binaryToDecimalStack.base++));  
    }  
  
    printf("转换成的二进制为:%d\n", decimal);  
  
    //destroyStack(&binaryToDecimalStack);  
}  


无论我用哪一个destroyStack都会崩溃,提示我说没有分配s->base,可我初始化的时候明明分配了呀?请各位帮我看看!
[解决办法]

 for(i = 0; i < len; i++)  
    {  
        printf("%c", *(binaryToDecimalStack.base++));  //这句base++,base已经指向其它地方了,原因是你Pop的时候stack size没有--
    }  

[解决办法]
应该改作如下:

 for(i = 0; i < len; i++)  
    {  
        printf("%c", binaryToDecimalStack.base[i]); 
    }  

热点排行