c - 我在 C 中创建了一个 push 和 pop 函数,但不知道如何按顺序打印它们

标签 c linked-list stack

我最近研究了链表并尝试创建一个推送和弹出功能。

我已经成功创建了一个看起来像这样的。

#include <stdio.h>
#include <stdlib.h>

struct node{
  int data;
  struct node *next;
};

struct node* buffer = NULL;

void push(int elem){
  struct node *new_element = (struct node*)malloc(sizeof(struct node));
  new_element->next = buffer;
  new_element->data = elem;
  buffer = new_element;
}

int pop(void){
  int elem = buffer->data;
  struct node *eliminate = buffer;
  buffer = eliminate->next;
  free(eliminate);
  return elem;
}

后来我尝试用这种方式打印它们:

int main(void) {
  push(5);
  push(7);
  push(8);
  pop();
  printf("%d %d", buffer->data, buffer->next->data);
}

但是,结果是 7 5 而不是 5 7。我的推送功能有问题吗?

最佳答案

之后:

push(5);
push(7);
push(8);

您有以下链表:

5 <- 7 <- 8 <- 缓冲区

弹出后你有:5 <- 7 <- buffer

这就是为什么 buffer->data 为 7 而 buffer->next->data 为 5 的原因。

为了以正确的顺序打印列表,您需要一个指向第一个节点的指针。在你的情况下是 5。同样,你的方法应该使它成为一个双链表。

struct node{
  int data;
  struct node *next;
};

struct node* start = NULL;
struct node* buffer = NULL;

void push(int elem){
  struct node *new_element = (struct node*)malloc(sizeof(struct node));
  new_element->next = buffer;
  new_element->data = elem;
  if (buffer == NULL) start = new_element; // this is the magic
  buffer = new_element;
}

关于c - 我在 C 中创建了一个 push 和 pop 函数,但不知道如何按顺序打印它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65185356/

相关文章:

c - 使 struct Array 指向另一个 struct Array

c - 从一个简单的 c 单元测试开始

c - 打印链接列表仅打印 C 中最新的数据条目

c - C 中链表的逻辑错误

在用户输入 C 时更改用户控制台输入

c - GtkFileChooserDialog gtk_file_chooser_get_filename() 返回 null,即使输入了文件名?

c - 单向链表删除最后一个元素

Java:LinkedList 类作为堆栈和队列

C 编程堆栈

c++ - 后缀表示法计算器 (RPN) 问题 C++