C语言数据结构的栈部分一些疑问
本人c菜鸟
前几天看了数据结果就写了一些关于栈的代码
后来就顺便写了一个测试的程序:10进制转8进制
但是编译通过却没办法运行...请各位大大帮帮忙
#include <stdio.h>
#include <stdlib.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef struct stacknode
{
int *top; //栈顶指针
int *base;//栈底指针
int stacksize; //堆栈长度
}snode;
snode *InitStack(void)//创建一个空的堆栈
{
snode *s;
s=(snode *)malloc(sizeof(snode));
s->base=(int *)malloc(sizeof(int)*STACK_INIT_SIZE);
s->top=s->base;
return(s);
}
void DestroyStack(snode *p)//销毁堆栈
{
snode *s;
s=p;
p=s=NULL;
free(s);
}
void ClearStack(snode *p)//把p置为空栈
{
snode *s;
s=p;
if(s->top==0) printf("空栈");
else
{
s->top=s->base;
}
}
void GetTop(snode *p,int *e)//堆栈不空的话e返回栈顶元素
{
snode *s;
s=p;
if(s->top==0) printf("空栈");
*e=*(s->top-1);
}
void Push(snode *p,int e)//插入e为新元素
{
snode *s;
s=p;
if((int)(s->top-s->base)>=s->stacksize)//堆栈已满
{
s->base=(int *)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(int));
if(!s->base) printf("没有空间分配堆栈");
s->top=s->base+s->stacksize;//重新确定top的位置
s->stacksize+=STACKINCREMENT;//累加,重新分配堆栈的长度
}
*s->top=e;
++s->top;
}
void Pop(snode *p,int *e)//删除栈顶元素
{
snode *s;
s=p;
if(s->top==0) printf("空栈");
*e=*(--s->top);
}
int StackEmpty(snode *p)//判断堆栈是否为空
{
snode *s;
if(s->top==0) return(1);
else return(0);
}
int main()//将10进制数转为8进制数
{
snode *head;
int n;
int *m;
head=InitStack();
n=getchar();
while(n)
{
Push(head,n%8);
n=n/8;
}
while(!StackEmpty(head))
{
Pop(head,m);
printf("%d",*m);
}
getch();
return(0);
}
问题点数:20、回复次数:7Top
1 楼BtInside(咸鱼的梦想)回复于 2006-03-14 20:25:34 得分 0
涉及较多指针的...这正是菜鸟的心头大患啊...
众高手指点一下吧Top
2 楼ykzhujiang(朱朱)回复于 2006-03-14 20:26:50 得分 0
你这个代码问题很多Top
3 楼BtInside(咸鱼的梦想)回复于 2006-03-14 20:31:33 得分 0
我知道...所以才放在网上
希望得到大家的指点Top
4 楼BtInside(咸鱼的梦想)回复于 2006-03-14 20:43:08 得分 0
没有人吗?....Top
5 楼ykzhujiang(朱朱)回复于 2006-03-14 20:44:02 得分 20
简单改了一下,你可以对照一下看看你的问题
#include <stdio.h>
#include <stdlib.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef struct stacknode
{
int *top; //栈顶指针
int *base;//栈底指针
int stacksize; //堆栈长度
}snode;
snode *InitStack(void)//创建一个空的堆栈
{
snode *s;
s=(snode *)malloc(sizeof(snode));
s->base=(int *)malloc(sizeof(int)*STACK_INIT_SIZE);
s->top=s->base;
s->stacksize=STACK_INIT_SIZE;
return(s);
}
void DestroyStack(snode *p)//销毁堆栈
{
snode *s;
s=p;
p=s=NULL;
free(s);
}
void ClearStack(snode *p)//把p置为空栈
{
snode *s;
s=p;
if(s->top==0) printf("空栈");
else
{
s->top=s->base;
}
}
void GetTop(snode *p,int *e)//堆栈不空的话e返回栈顶元素
{
snode *s;
s=p;
if(s->top==0) printf("空栈");
*e=*(s->top-1);
}
void Push(snode *p,int e)//插入e为新元素
{
snode *s;
s=p;
if((int)(s->top-s->base)>=s->stacksize)//堆栈已满
{
s->base=(int *)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(int));
if(!s->base) {
printf("没有空间分配堆栈");
return;
}
s->top=s->base+s->stacksize;//重新确定top的位置
s->stacksize+=STACKINCREMENT;//累加,重新分配堆栈的长度
}
*s->top=e;
++s->top;
}
void Pop(snode *p,int *e)//删除栈顶元素
{
snode *s;
s=p;
if(s->top==s->base)
{
printf("空栈");
return;
}
*e=*(--s->top);
}
int StackEmpty(snode *p)//判断堆栈是否为空
{
snode *s;
s=p;
if(s->top==s->base) return(1);
else return(0);
}
int main()//将10进制数转为8进制数
{
snode *head;
int n;
int m;
head=InitStack();
//n=getchar();
scanf("%d",&n);
while(n)
{
Push(head,n%8);
n=n/8;
}
while(!StackEmpty(head))
{
Pop(head,&m);
printf("%d",m);
}
getchar();
return(0);
}
Top
6 楼ykzhujiang(朱朱)回复于 2006-03-14 20:45:27 得分 0
有些函数我没有给你改,因为程序中没有用到,不过不代表他们没有问题,我抛一块砖,等待楼主来寻玉了
多思考才会有进步~加油Top
7 楼BtInside(咸鱼的梦想)回复于 2006-03-14 20:49:24 得分 0
感谢...我会继续努力的 ^_^ 好心人Top




