c - 我在 C 语言中使用链表实现堆栈数据结构时被困在这里

标签 c linked-list stack singly-linked-list

我正在使用 C 语言中的 Linked_list 实现堆栈。我已经成功创建了第一个节点。当我尝试在第一个位置动态添加更多节点时,因为堆栈遵循 LIFO 原则,我相信我没有正确链接指针,因此链接列表的顺序保持不变。代码非常简单,如下所示,我只需要理解,当我尝试打印整个链表时,它只打印第一个节点的数据。看起来整个链在第一个节点之后就断裂了。我哪里出错了?

// Implementation of stack using a linked-list
#include<stdio.h>
#include<stdlib.h>

typedef struct sllnode
{
int data;
struct sllnode *next;
}
stack;

void create(stack *head, int elem)
{
head -> data = elem;
head -> next = NULL;
}

void insert(stack *head, int elem)
{
stack *newNode = malloc( sizeof(stack) );
newNode -> data = elem;
newNode -> next = head;
head = newNode;
}

void display(stack *head)
{
if( head == NULL )
{
    printf(" NULL value returned \n");
}
stack *ptr = head;
while(ptr != NULL)
{
    printf("%d \n", ptr -> data);
    ptr = ptr -> next;
}
}

int main(void)
{
stack *head = malloc( sizeof(stack) );
create(head, 10);
insert(head, 15);
insert(head, 25);
insert(head, 26);
insert(head, 27);
insert(head, 28);
display(head);
}

最佳答案

这个函数:

void insert(stack *head, int elem) {
    stack *newNode = malloc( sizeof(stack) );
    newNode -> data = elem;
    newNode -> next = head;
    head = newNode;
}

修改 head 的本地副本。

应该是:

void insert(stack **head, int elem) {
    stack *newNode = malloc( sizeof(stack) );
    newNode -> data = elem;
    newNode -> next = *head;
    *head = newNode;
}

并调用为insert(&head,elem);

为了更清楚为什么不:

void create(stack **head){
   *head=NULL;
}

而不是在代码主体中分配空间。

还有

void destroy(stack** head){
    while(*head!=NULL){
        stack* next=(*head)->next;
        free(*head);
        *head=next;
    }
}

关于c - 我在 C 语言中使用链表实现堆栈数据结构时被困在这里,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48262143/

相关文章:

c - C 字符串的默认编码是什么?

C++ 类 - 我的程序有什么问题?

.net - 如何获取现有.NET线程的堆栈大小

c++ - 隐式字段初始化规则

c# - MichaelJordan 在 .NET 堆栈上创建了多少个 ValueType 实例?

c - 插入排序时保持最小最大 - 链表

c - 为什么只有 2 个线程处于事件状态时 pthread_create() 会失败?

python - 为什么 "conv1d"在C代码、python和pytorch中不同

java - 为什么从 LinkedList 的末尾获取值比从开始要慢得多?

java - 从泛型参数的构造函数中获取对象类型?