使用链表的堆栈实现有什么问题?

时间:2017-04-20 07:31:45

标签: 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* 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人员),我很困惑我的错误在哪里,虽然我确定这是由于指针。

2 个答案:

答案 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。