C 使用链表的堆栈实现有什么错误?
我正在尝试使用链表实现一个堆栈。这是我的密码:C 使用链表的堆栈实现有什么错误?,c,pointers,data-structures,linked-list,stack,C,Pointers,Data Structures,Linked List,Stack,我正在尝试使用链表实现一个堆栈。这是我的密码: #include<stdio.h> //implementation of stack struct Node{ int data; struct Node* next; struct Node* prev; }; struct Stack{ struct Node* headNode; struct Node* presentNode; int size; }; struct Node*
#include<stdio.h>
//implementation of stack
struct Node{
int data;
struct Node* next;
struct Node* prev;
};
struct Stack{
struct Node* headNode;
struct Node* presentNode;
int size;
};
struct Node* newNode()
{
struct Node* node;
return node;
}
struct Stack* newStack()
{
struct Stack* stack;
stack->headNode = newNode();
stack->presentNode = stack->headNode;
stack->size=0;
return stack;
}
int isempty(struct Stack* s)
{
if(s->headNode->next != NULL)
return 0;
return 1;
}
void push(struct Stack* s,int data)
{
struct Node* node = newNode();
node->data = data;
node->next = NULL;
s->presentNode->next = node;
node->prev = s->presentNode;
s->presentNode = node;
s->size ++;
}
int pop(struct Stack*s)
{
if(isempty(s)==1)
return 0;
int data = s->presentNode->data;
s->presentNode->prev->next = NULL;
s->presentNode = s->presentNode->prev;
s->size --;
return data;
}
int main()
{
struct Stack* stack = newStack();
int data = 0,type;
printf("Enter '1' if new element to be added or '0' if the latest element is to be deleted.\n");
while(data!=-1)//unbounded stack
//takes input until data==-1
{
scanf("%d",&type);
if(type)
{
printf("Enter the element:\t");
scanf("%d",&data);
if(data==-1)
continue;
push(stack,data);
}
else
printf("%d is popped out of the list!\n",pop(stack));
}
return 0;
}
#包括
//堆栈的实现
结构节点{
int数据;
结构节点*下一步;
结构节点*prev;
};
结构堆栈{
结构节点*头节点;
结构节点*presentNode;
整数大小;
};
结构节点*newNode()
{
结构节点*节点;
返回节点;
}
结构堆栈*newStack()
{
结构堆栈*堆栈;
堆栈->头节点=新节点();
stack->presentNode=stack->headNode;
堆栈->大小=0;
返回栈;
}
int isempty(结构堆栈*s)
{
如果(s->headNode->next!=空)
返回0;
返回1;
}
void push(结构堆栈*s,int数据)
{
结构节点*Node=newNode();
节点->数据=数据;
节点->下一步=空;
s->presentNode->next=节点;
节点->上一个=s->当前节点;
s->presentNode=节点;
s->size++;
}
int-pop(结构堆栈*s)
{
如果(isempty=1)
返回0;
int data=s->presentNode->data;
s->presentNode->prev->next=NULL;
s->presentNode=s->presentNode->prev;
s->尺寸--;
返回数据;
}
int main()
{
struct Stack*Stack=newStack();
int data=0,类型;
printf(“如果要添加新元素,请输入“1”;如果要删除最新元素,请输入“0”。\n”);
while(data!=-1)//无界堆栈
//接受输入直到数据==-1
{
scanf(“%d”,类型(&T);
如果(类型)
{
printf(“输入元素:\t”);
scanf(“%d”和数据);
如果(数据==-1)
继续;
推送(堆栈、数据);
}
其他的
printf(“%d从列表中弹出!\n”,弹出(堆栈));
}
返回0;
}
但是我得到了运行时错误。由于我不熟悉指针(我是一个Java爱好者),我很困惑我的错误在哪里,尽管我确信这是由于指针造成的。您有多个问题。首先
- 在
函数中,没有newStack()
语句,因此使用返回值会导致错误return
- 您需要将内存分配给指针(即,使指针指向有效内存),然后才能实际取消引用它们。就你而言
试图使用未初始化的内存,再次导致UBstruct Stack* stack; stack->headNode
- 在
函数中,没有newStack()
语句,因此使用返回值会导致错误return
- 您需要将内存分配给指针(即,使指针指向有效内存),然后才能实际取消引用它们。就你而言
试图使用未初始化的内存,再次导致UBstruct Stack* stack; stack->headNode
- 您有多个问题。首先
struct Node* newNode()
{
struct Node* node;
return node;
}
局部变量节点
是未初始化的指针。一旦使用此函数的返回值,就有未定义的行为
编辑:
同样的问题也适用于newStack
:
struct Stack* newStack()
{
struct Stack* stack;
stack->headNode = newNode();
...
return stack;
}
一旦取消引用
堆栈
,您就有了未定义的行为。您不会为新节点分配内存:
struct Node* newNode()
{
struct Node* node;
return node;
}
局部变量节点
是未初始化的指针。一旦使用此函数的返回值,就有未定义的行为
编辑:
同样的问题也适用于newStack
:
struct Stack* newStack()
{
struct Stack* stack;
stack->headNode = newNode();
...
return stack;
}
一旦您取消引用
堆栈
,您就有了未定义的行为。复制代码时出错…忽略它…我编辑了问题。复制代码时出错…忽略它…我编辑了问题。您没有为堆栈分配任何内存(调用malloc)。在这一点上,你所得到的只是一大碗未定义的行为,因为你的指针没有指向任何东西。你在创建一个新节点时没有分配内存。请参阅struct Node*newNode()
函数。您缺少malloc()
。请将Java放在一边。学习C就像你对编程一无所知一样。除了大括号编程语言之外,这两种语言几乎没有任何共同之处。如果你过于依赖Java直觉,你只会伤到自己的脚。你没有为堆栈分配任何内存(调用malloc)。在这一点上,你所得到的只是一大碗未定义的行为,因为你的指针没有指向任何东西。你在创建一个新节点时没有分配内存。请参阅struct Node*newNode()
函数。您缺少malloc()
。请将Java放在一边。学习C就像你对编程一无所知一样。除了大括号编程语言之外,这两种语言几乎没有任何共同之处。如果你过于依赖Java直觉,你只会伤到自己的脚。如果我想要一个未绑定的堆栈,那么内存分配的大小应该是多少?因为你只在节点内部存储int
,所以sizeof(struct Node)
可能是一个很好的起点。比“我得到一个错误”更精确的东西会很有用。如果我想要一个未绑定的堆栈,内存分配的大小应该是多少?因为您只在节点中存储int
,所以sizeof(struct Node)
可能是一个很好的起点。比“我得到一个错误”更精确的东西会很有用。