#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
中是指向struct node的指针,该节点被初始化为NULL。
如果q为NULL,我在这里看到第一个。如果它为null,那么我正在分配堆内存,数据和下一个指针,这样q现在是一个取消引用第一个数据的指针。如果q不是NULL,那么我接受一个临时指针指向一个由q指向的结构节点,所以直到temp变为NULL temp转到temp-&gt; next,然后它分配堆内存,放入数据和下一个指针为NULL。
但它没有为我的显示功能显示任何内容,请在此更正我,以及如何在链表中使用堆栈和堆内存。
答案 0 :(得分:3)
回想一下,C语句中的参数是按值传递,包括指针参数。
当q == NULL
时,您正在分配内存并将该内存分配给q
,但此不会更改q
以外的功能:只有1}} 内部的副本将被更改。
为了更改参数q
指向的内容,并将这些更改反映在函数之外,您需要将指针传递给指针,例如:
q
并改变您使用void insert(struct node **q, int num)
的方式,例如
q
此外,在你的情况下,你应该循环到if (*q == NULL)
*q = (struct node *) malloc(sizeof(struct node));
,然后添加你的新节点:
temp->next == NULL
答案 1 :(得分:1)
更改
insert( struct node *q,int num)
至insert( struct node **q,int num)
并在main()
内,更改
insert( a,13)
至insert( &a,13)
您需要修改实际参数而非正式参数,因此请使用按地址传递而不是传递值,
表示在insert()
内向q
分配值时,它不会反映到a
,因为您只是传递了a的值,以便将更改反映为通过一个地址。
也,
还有一个问题位于else
的{{1}}块内
将insert()
更改为while( temp != NULL)
答案 2 :(得分:1)
您必须在insert()
函数处使用指向指针的指针,因为您使用malloc()
分配新内存,但指针仍将指向NULL。因此,要修改指针本身,如果使用参数进行操作,则必须使用指向指针的指针。恕我直言,如果你返回指针会好得多。
答案 3 :(得分:1)
您需要返回在insert中分配的指针。
在main中,a是指向NULL的指针。在第一次插入之后,a仍然是指向NULL的指针,因为q具有指针,而不是。
a的值是您可以找到结构节点的地址。 q是a的值的副本,因此是NULL。当你malloc()时,它为q赋值,这是一个结构节点的地址但是它不会改变一个!
或者:
/* a has a value and it doesn't malloc q */ main() { struct node a = {0}; insert(&a, 13); }
或
/* you return the value of q (address of struct node) and assign it to a */ struct node *insert(struct node *q, int num) { blah blah return q; } main() { struct node *a = NULL; a = insert(a, 13); }
或
/* I'm finding this hard to explain because of 2 redirections */ void insert( struct node **q, int num ) { if ( *q == NULL ) { *q = malloc() etc etc } } main() { struct node *a = NULL; insert(&a, 13); }
但是你在插入的后半部分也犯了类似的错误。您需要分配内存并将其分配给下一个,而不是相反。
答案 4 :(得分:0)
看起来问题是你迭代了列表的末尾。所以,当temp变为null时,你说,嘿,我已经找到了结局。然后你创建一个新节点。但是,您永远不会将上一个节点指向新节点。
我会改变这个:
while( temp != NULL)
对此:
while( temp->next != NULL)
所以当你到达目的地时,你仍然会有一个对你的清单的引用。然后,您需要相应地更改其余逻辑,但至少可以这样做。
正如其他人所说,你的功能对初始节点也不起作用。我会考虑使用一个单独的函数来初始化一个空列表。但这主要是一种风格选择。
答案 5 :(得分:0)
将此代码替换为您的代码:
while( temp != NULL)
{
temp = temp->next;
}
temp = (struct node*)malloc(sizeof(struct node));
temp->data = num;
temp->next = NULL;
通过
while( temp->next != NULL)
{
temp = temp->next;
}
temp->next = (struct node*)malloc(sizeof(struct node));
temp->next->data = num;
temp->next->next = NULL;
答案 6 :(得分:0)
这是您程序的固定版本。问题是指针被复制到函数按值,所以当你的函数退出时,在这种情况下传入a
的指针不会分配给任何东西。你唯一要做的就是泄露内存,通过分配一些而不是free
来实现它。
解决方案是通过引用传递指针,而使用指向指针的指针传递指针。
#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);
free(a->next); //de-alloc memory
free(a);
return 0;
}
答案 7 :(得分:0)
您可以通过两种方式解决此问题。