C中的双重链表

时间:2013-01-19 15:31:03

标签: c list

#include<stdio.h>

typedef struct Node
{
        int data;
        struct Node *next;
        struct Node *prev;
} node;

void insert(node *pointer, int data)
{
        while(pointer->next!=NULL)
        {
                pointer = pointer -> next;
        }
        pointer->next = (node *)malloc(sizeof(node));
        (pointer->next)->prev = pointer;
        pointer = pointer->next;
        pointer->data = data;
        pointer->next = NULL;
}

int main()
{
        node *start;
        start = (node *)malloc(sizeof(node));
        int data;
        scanf("%d",&data);
        insert(start,data);
}

好吧,我正在尝试理解C中列表的基础知识。我在这里有一个问题 - 插入()底部的第3行 - 这是为了什么?看起来好像第一个列表的元素保持为空并且数据被保存到第二个列表中。但只有这样才行。

在main()中创建了第一个空元素,对吧?

while()未执行,因为该元素为null。

然后正在创建第二个元素。 (指针 - &GT;空)

指向第一个元素的指针设置为指向第二个元素(从底部开始的第3行)

数据正在保存到第二个元素。

我在哪里犯错?

2 个答案:

答案 0 :(得分:1)

pointer = pointer->next;

此行将我们正在集中的当前节点从原始列表的最后一个节点更改为新列表的新分配的最后一个节点(即原始列表的最后一个节点之后的节点)。然后,我们直接在接下来的两行中设置该节点的值。

你可以摆脱这一行并改变它下面的两行来阅读

pointer->next->data = data;
pointer->next->next = NULL;

你会得到相同的结果。

编辑:展望未来,我看到更多问题:

1)您需要#include <stdlib.h>才能使用malloc() 2)在致电start->next = NULL;之前,您需要明确设置insert()

答案 1 :(得分:0)

insert函数中,您有以下作业:

pointer = pointer->next;

这不起作用,因为指针pointer是按值传递的。这意味着当函数返回时,对值的所有更改都将丢失。

您可以通过引用传递指针:

void insert(node **pointer, int data)
{
    /* ... */
    *pointer = (*pointer)->next;
    /* ... */
}

或者从函数返回指针:

node *insert(node *pointer, int data)
{
    /* ... */
    return pointer;
}

<击>


还有一个问题是您没有初始化node结构中的指针。这意味着当您分配node结构时,其中的字段将指向看似随机的位置。

只需在分配后直接将nextprev指针设置为NULL即可解决此问题:

start = malloc(sizeof(node));
start->next = NULL;
start->prev = NULL;