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),但好像还是不行。 展开
关键是书上的函数一般是 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),但好像还是不行。 展开
1个回答
展开全部
#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循环没有意义了。
#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循环没有意义了。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询