【问题标题】:What is wrong in the stack implementation using linked lists?使用链表的堆栈实现有什么问题?
【发布时间】:2017-09-16 16:49:40
【问题描述】:

我正在尝试使用链表实现堆栈。这是我的代码:

#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 人),我很困惑我的错误在哪里,尽管我确信这是由于指针。

【问题讨论】:

  • 您没有为堆栈分配任何内存(调用 malloc)。此时,您所拥有的只是一大碗未定义的行为,因为您的指针指向任何内容。
  • 创建新节点时没有分配内存。请参阅您的 struct Node* newNode() 函数。你错过了malloc()
  • 把Java放在一边。学习 C 就好像你对编程一无所知。除了花括号编程语言之外,两者几乎没有任何共同之处。如果你过分依赖 Java 直觉,只会自取其辱。

标签: c pointers data-structures linked-list stack


【解决方案1】:

您没有为新节点分配内存:

struct Node* newNode()
{
  struct Node* node;
  return node;
}

局部变量node 是一个未初始化的指针。一旦你使用这个函数的返回值,你就有了未定义的行为。

编辑: newStack 也是同样的问题:

struct Stack* newStack()
{
    struct Stack* stack;
    stack->headNode = newNode();
...
    return stack;
}

一旦你取消引用stack,你就有了未定义的行为。

【讨论】:

  • 如果我想要一个未绑定的堆栈,内存分配的大小应该是多少?
  • 由于您只在节点中存储intsizeof(struct Node) 可能是一个很好的起点。
  • 比“我得到一个错误”更精确的东西会很有用。
【解决方案2】:

您有多个问题。对于初学者

  • 在您的newStack() 函数中,您没有return 语句,因此使用返回值会导致undefined behavior

  • 您需要先为指针分配内存(即,使指针指向有效内存),然后才能真正取消引用它们。你的情况

    struct Stack* stack;
    stack->headNode
    

    尝试使用未初始化的内存,再次导致 UB。

【讨论】:

  • 复制代码时出错....忽略它....我已经编辑了问题。
猜你喜欢
  • 2011-07-29
  • 2022-01-25
  • 1970-01-01
  • 2013-03-17
  • 1970-01-01
  • 2013-08-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多