读书人

销毁栈的时分崩溃

发布时间: 2013-01-18 10:22:42 作者: rapoo

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

#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]);
}

读书人网 >C语言

热点推荐