读书人

求解释。简单的栈有关问题

发布时间: 2013-03-22 09:49:50 作者: rapoo

求解释。。简单的栈问题。
本帖最后由 dengluoy 于 2013-03-14 22:40:13 编辑

#include<stdio.h>
#include<stdlib.h>
#define FALSE 0
#define TRUE 1
struct Node
{
struct Node *next;
int digit;
};
int Pop(struct Node *s,int *i); //出栈函数
int InitQueue(struct Node *s); //制造一个空栈
int Push(struct Node *s,int i); //入栈函数
void conversion(int n,int d); //十进制转换函数
int EmptyQueue(struct Node *s); //判断函数
int main(void)
{
int n = 0;
int m = 0;
printf("Enter tows digit:");
scanf("%d%d",&n,&m);
conversion(n,m);
return 0;
}
int InitQueue(struct Node *s)
{
s = (struct Node *)malloc(sizeof(struct Node));
if(s == NULL)
return FALSE;
s->next = NULL;
return TRUE;
}
int Push(struct Node *s,int i)
{
struct Node *p;
p = (struct Node *)malloc(sizeof(struct Node));
p->digit = i;
p->next = s;
s = p;
return TRUE;
}
int Pop(struct Node *s,int *i)
{
struct Node *p;
p = s;
if(p == NULL)
return FALSE;
*i =p->digit;
s = p->next;
free(p);
return TRUE;
}
void conversion(int n,int d)
{
struct Node *s =NULL;
int *i = NULL;
int x;
InitQueue(s);
while(n > 0)
{
x = n % d;
Push(s,x);
n = n / d;
}
while(!EmptyQueue(s))
{
Pop(s,i);
printf("%d",*i);
}
}
int EmptyQueue(struct Node *s)
{
if(s == NULL)
return FALSE;
else
return TRUE;
}

运行错误,指针S为空,但是S栈我明明已经申请动态内存成功了。。
[解决办法]
具体不解释了,你看C语言的书就可以了
下面只帮你改下初始化函数和调用,其余部分自己看着改
初始化定义下面:
int InitQueue(struct Node **s)
{
Node *p = (struct Node *)malloc(sizeof(struct Node));
if(p == NULL) return 0;
p->next = NULL;
*s=p;
return 1;
}
调用时如下改:
struct Node *s =NULL;
InitQueue(&s);

[解决办法]
错误原因:函数InitQueue未能初始化指针,导致使用NULL指针。
int InitQueue(struct Node *s); //函数原型不对,导致 s 指向不变。
struct Node *s =NULL;
InitQueue(s);//无论InitQueue如何写,此时 s依然指向NULL

可考虑这样改函数原型:
1、int InitQueue(struct Node *&s);//使用指针的引用或二重指针,这样就可以改变 s指向。
2、struct Node *InitQueue();//函数返回指针,如果失败,则返回NULL

其他函数,也有类似问题,问题是要弄清楚概念:指针的指向与指针的引用,指向指针的指针
函数原型:int InitQueue(struct Node *s)不能改变指针的指向,但可以修改指针指向的内容。


读书人网 >C++ Builder

热点推荐