#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/