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
    语句,因此使用返回值会导致错误

  • 您需要将内存分配给指针(即,使指针指向有效内存),然后才能实际取消引用它们。就你而言

    struct Stack* stack;
    stack->headNode
    
    试图使用未初始化的内存,再次导致UB


    • 您有多个问题。首先

      • newStack()
        函数中,没有
        return
        语句,因此使用返回值会导致错误

      • 您需要将内存分配给指针(即,使指针指向有效内存),然后才能实际取消引用它们。就你而言

        struct Stack* stack;
        stack->headNode
        
        试图使用未初始化的内存,再次导致UB


      您不为新节点分配内存:

      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)
      可能是一个很好的起点。比“我得到一个错误”更精确的东西会很有用。