链接列表插入节点不显示任何内容

时间:2012-06-22 17:17:34

标签: 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中是指向struct node的指针,该节点被初始化为NULL。

如果q为NULL,我在这里看到第一个。如果它为null,那么我正在分配堆内存,数据和下一个指针,这样q现在是一个取消引用第一个数据的指针。如果q不是NULL,那么我接受一个临时指针指向一个由q指向的结构节点,所以直到temp变为NULL temp转到temp-&gt; next,然后它分配堆内存,放入数据和下一个指针为NULL。

但它没有为我的显示功能显示任何内容,请在此更正我,以及如何在链表中使用堆栈和堆内存。

8 个答案:

答案 0 :(得分:3)

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

q == NULL时,您正在分配内存并将该内存分配给q,但此不会更改q以外的功能:只有内部的副本将被更改。

为了更改参数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)

您可以通过两种方式解决此问题。

  1. 在函数中传递q的地址。
  2. 将返回类型从void更改为node。每次插入新节点后返回根节点(此方法很简单但不可取)。