vc关于指针的问题!

写一个关于连栈的代码。但是却不能运行。里面的函数基本都是照着书来打的(《数据结构》清华大学,徐孝凯)。关键是书上的函数一般是func(structsNode**HS)这样... 写一个关于连栈的代码。但是却不能运行。里面的函数基本都是照着书来打的(《数据结构》清华大学,徐孝凯)。

关键是书上的函数一般是 func(struct sNode **HS)这样来定义。引用时,则是func(&HS)。(hs是一个结构体)

但我尝试着,发现一调试就会出错:类型不匹配,不能从*转换成**.

于是我就改为 func(struct sNode **HS)这样定义,引用时则是func(&HS),但好像还是不行。

以下是代码:

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>

typedef int ElemType;

struct sNode{
ElemType data;
struct sNode* next;
};

void InitStack(struct sNode *HS) //初始化链栈为空
{
HS=NULL; //将链栈置空
}

void Push(struct sNode *HS, ElemType x) //向链栈中插入一个元素
{
//为插入元素获取动态结点
struct sNode *newp;
newp=(struct sNode *)malloc(sizeof(struct sNode));
if(newp==NULL){
printf("内存动态空间用完,退出运行!\n");
exit(1);
}
//给新分配的结点赋值
newp->data=x;
//向栈顶插入新结点
newp->next=HS;
HS=newp;
}

ElemType Pop(struct sNode *HS) //从链栈中删除一个元素并返回它
{
struct sNode* p;
ElemType temp;
//对于空栈则退出运行
if(HS==NULL){
printf("栈空无法删除!\n");
exit(1);
}
//暂存栈顶结点指针,并使栈顶指针指向下一结点
p=HS; HS=p->next;
//暂存原栈顶元素以便返回,同时回收原栈顶结点
temp=p->data; free(p);
//返回原栈顶元素
return temp;
}

int EmptyStack(struct sNode *HS) //检查链栈是否为空
{
if(HS==NULL) return 1;else return 0;
}

void main()
{
struct sNode s;
int i,k,y;
InitStack(&s);

printf("How many number do you want to insert?");
scanf("%d",&k);

printf("\nplese put the insert number:\n");
for(i=1;i<=k;i++){
scanf("%d",&y);
Push(&s,y);
printf("\n");
}

printf("now how many number do you want to pop?");
scanf("%d",&k);
printf("\n");
for(i=1;i<=k;i++){
while(!EmptyStack(&s))
printf("%d",Pop(&s));
}
printf("\n");
}
写一个关于连栈的代码。但是却不能运行。里面的函数基本都是照着书来打的(《数据结构》清华大学,徐孝凯)。
<br>
<br>关键是书上的函数一般是 func(struct sNode **HS)这样来定义。引用时,则是func(&HS)。(hs是一个结构体)
<br>
<br>但我尝试着,发现一调试就会出错:类型不匹配,不能从*转换成**.
<br>
<br>于是我就改为 func(struct sNode *HS)这样定义,引用时则是func(&HS),但好像还是不行。
展开
 我来答
liuxinling_06
推荐于2016-03-15 · TA获得超过1289个赞
知道小有建树答主
回答量:345
采纳率:100%
帮助的人:425万
展开全部
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>

typedef int ElemType;

struct sNode{
ElemType data;
struct sNode* next;
};

void InitStack(struct sNode **HS) //初始化链栈为空
{
*HS=NULL; //将链栈置空
}

void Push(struct sNode **HS, ElemType x) //向链栈中插入一个元素
{
//为插入元素获取动态结点
struct sNode *newp;
newp=(struct sNode *)malloc(sizeof(struct sNode));
if(newp==NULL){
printf("内存动态空间用完,退出运行!\n");
exit(1);
}
//给新分配的结点赋值
newp->data=x;
//向栈顶插入新结点
newp->next=*HS;
*HS=newp;
}

ElemType Pop(struct sNode **HS) //从链栈中删除一个元素并返回它
{
struct sNode* p;
ElemType temp;
//对于空栈则退出运行
if(*HS==NULL){
printf("栈空无法删除!\n");
exit(1);
}
//暂存栈顶结点指针,并使栈顶指针指向下一结点
p=*HS; *HS=p->next;
//暂存原栈顶元素以便返回,同时回收原栈顶结点
temp=p->data; free(p);
//返回原栈顶元素
return temp;
}

int EmptyStack(struct sNode **HS) //检查链栈是否为空
{
if(*HS==NULL) return 1;else return 0;
}

void main()
{
struct sNode* s;
int i,k,y;
InitStack(&s);

printf("How many number do you want to insert?");
scanf("%d",&k);

printf("\nplese put the insert number:\n");
for(i=1;i<=k;i++){
scanf("%d",&y);
Push(&s,y);
printf("\n");
}

printf("now how many number do you want to pop?");
scanf("%d",&k);
printf("\n");
for(i=1;i<=k;i++){
while(!EmptyStack(&s))
printf("%d",Pop(&s));
}
printf("\n");
}

想把指针的值带值返回就必须用**,之所以你的代码有问题是因为你的main的第三行没有定义为指针。
void main()
{
struct sNode s; //这个地方错误

补充一点:我不明白你这个for循环有什么意义?
for(i=1;i<=k;i++){
while(!EmptyStack(&s))
printf("%d",Pop(&s));
}
由于第二个while循环,所有的数都会出栈,for循环没有意义了。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式