我正在尝试使用链表实现堆栈。这是我的代码:
#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;
}
但我得到了run-time error
。由于我是新手指针(我是一个Java人员),我很困惑我的错误在哪里,虽然我确定这是由于指针。
答案 0 :(得分:3)
您没有为新节点分配内存:
struct Node* newNode()
{
struct Node* node;
return node;
}
局部变量node
是未初始化的指针。只要使用此函数的返回值,就会出现“未定义的行为”。
编辑:
同样的问题适用于newStack
:
struct Stack* newStack()
{
struct Stack* stack;
stack->headNode = newNode();
...
return stack;
}
一旦取消引用stack
,就会有未定义的行为。
答案 1 :(得分:0)
你有多个问题。对于初学者来说
在newStack()
函数中,您没有return
语句,因此使用返回值会导致undefined behavior。
在实际取消引用它们之前,需要为指针分配内存(即指向指向有效内存的指针)。在你的情况下
struct Stack* stack;
stack->headNode
是尝试使用未初始化的内存,这又会导致UB。