1
#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,我会看到第一个。如果它为空,那么我将分配堆内存、数据和下一个指针,这样 q 现在是一个指向第一个数据的指针。如果 q 不为 NULL,那么我使用一个 temp 指针,它指向一个 q 所指向的结构节点,所以直到 temp 变为 NULL temp 转到 temp->next,然后它分配堆内存,将数据和下一个指针指向空值。

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

4

8 回答 8

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));

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

temp->next = (struct node*) malloc(sizeof(struct node));
于 2012-06-22T17:22:17.413 回答
1

改变

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

在里面main(),改变

insert( a,13)insert( &a,13)

您需要修改实际参数而不是形式参数,因此使用按地址传递而不是按值传递
这意味着,insert()当您为其赋值时,内部q不会反映到a,因为您只是传递 a 的值,以便更改反映到 pass a 的地址。

此外,还有
一个问题是在else块内 insert()
更改while( temp != NULL)while( temp->next != NULL)

于 2012-06-22T17:21:17.017 回答
1

您必须在函数处使用指向指针的指针insert(),因为您使用 分配新内存malloc(),但指针仍将指向 NULL。因此,要修改指针本身,如果您使用参数进行修改,则必须使用指向指针的指针。恕我直言,如果您返回指针会更好。

于 2012-06-22T17:23:10.673 回答
1

您需要返回在插入中分配的指针。

在 main 中,a 是指向 NULL 的指针。在第一次插入之后,a 仍然是指向 NULL 的指针,因为 q 有指针,而不是 a。

a 的值是您可以找到结构节点的地址。q 是 a 值的副本,NULL 也是如此。当你 malloc() 它为 q 分配一个值,这是一个结构节点的地址,它不会改变 a!

任何一个:

/* a 有一个值,它不 malloc q */
主要的() {
   结构节点 a = {0};

   插入(&a, 13);
}

或者

/* 你返回 q 的值(结构节点的地址)并将它分配给一个 */
结构节点*插入(结构节点*q,int num){
   胡说八道

   返回q;
}

主要的() {
   结构节点 *a = NULL;

   一=插入(一,13);
}

或者

/* 由于 2 个重定向,我发现这很难解释 */
无效插入(结构节点**q,int num){

   如果 ( *q == NULL ) {
   *q = malloc() 等等
   }
}

主要的() {
   结构节点 *a = NULL;

   插入(&a, 13);
}

但是你在插入的后半部分也犯了类似的错误。您需要分配内存并将其分配给下一个,而不是相反。

于 2012-06-22T17:29:51.253 回答
0

看起来问题在于您迭代了列表的末尾。因此,当 temp 变为 null 时,您会说,嘿,我找到了终点。然后创建一个新节点。但是你永远不会将前一个节点指向你的新节点。

我会改变这个:

while( temp != NULL)

对此:

while( temp->next != NULL)

因此,当您到达末尾时,您仍然可以参考您的列表。然后,您将需要相应地更改其余逻辑,但至少这是可能的。

正如其他人所说,您的功能也不适用于初始节点。我会考虑有一个单独的函数来初始化一个空列表。但这主要是一种风格选择。

于 2012-06-22T17:23:00.937 回答
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;
于 2012-06-22T17:24:18.257 回答
0

这是您的程序的固定版本。问题是指针是按 value复制到函数中的,所以当你的函数退出时,a在这种情况下传入的指针不会分配给任何东西。你所做的唯一一件事就是通过分配一些而不是free'ing它来泄漏内存。

解决方案是通过引用传递指针,并且在 C 中使用指针指向指针来完成。

#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;
}
于 2012-06-22T17:26:07.647 回答
0

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

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