c - 链表插入节点什么都不显示

标签 c memory pointers linked-list heap-memory

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

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

void insert( struct node *q,int num)
{
    struct node *temp;

    if( q == NULL)
    {
        q = (struct node*)malloc(sizeof(struct node));
        q->data = num;
        q->next = NULL;
    }
    else
    {
        temp = q;
        while( temp != NULL)
        {
            temp = temp->next;
        }
        temp = (struct node*)malloc(sizeof(struct node));
        temp->data = num;
        temp->next = NULL;
    }
}

void display(struct node *q)
{
    struct node *temp;
    temp = q;
    while(temp != NULL)
    {
        printf("%d",temp->data);
        temp = temp->next;
    }
}



int main()
{
    struct node *a;
    a = NULL;
    insert( a,13);
    insert( a,13);
    display(a);
    return 0;
}

insert 函数中,q 是一个指向结构节点的指针,它被初始化为 NULL。

如果 q 是否为 NULL,我会看到 1st。如果它为空,那么我正在分配堆内存、数据和下一个指针,这样 q 现在是一个指针,它正在取消引用第一个数据。如果 q 不为 NULL,那么我取一个指向 q 指向的结构节点的临时指针,所以直到 temp 变为 NULL temp 转到 temp->next,然后它分配堆内存,将数据和下一个指针指向空值。

但它对我的显示功能没有任何显示,请纠正我这一点,以及如何在链表中使用堆栈和堆内存。

最佳答案

回想一下,在 C 中参数是按值传递,包括指针参数。

q == NULL 时,您正在分配内存并将该内存分配给 q,但这不会改变q 在您的函数之外:只有q 您的函数中的副本会被更改。

为了改变参数q指向的内容,并让这些改变反射(reflect)在你的函数之外,你需要传递一个指向指针的指针,例如:

void insert(struct node **q, int num)

并改变您使用q的方式,例如

if (*q == NULL)
    *q = (struct node *) malloc(sizeof(struct node));

此外,在您的其他情况下,您应该循环直到 temp->next == NULL,然后添加您的新节点:

temp->next = (struct node*) malloc(sizeof(struct node));

关于c - 链表插入节点什么都不显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11161086/

相关文章:

objective-c - 如何在 UILabel 中只显示有效小数?

c程序可以 `uint8_t`指向一个大小为32位的地址

c++ - C++ 中带指针参数的函数

c++ - 为什么分配的二维 int 数组与普通数组具有不同的内存地址序列?

c - 为什么这个 If 语句不执行代码?

c++ - 将指针数组初始化为 NULL

c - stderr 和 stdout - 未缓冲与缓冲?

python - 如何限制堆大小?

node.js - Meteor 在 Windows 10 上构建失败 - 进程内存不足

c - 程序编译没有错误,但执行期间出现段错误