-1
#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 中列表的基础知识。我在这里有一个问题 - insert() 底部的第 3 行 - 这是为了什么?似乎第一个列表的元素保持为空并且数据正在保存到第二个列表中。但只有这个有效。

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

while() 不执行,因为元素为空。

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

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

数据被保存到第二个元素。

我在哪里犯错?

4

2 回答 2

1
pointer = pointer->next;

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

您可以摆脱这一行并将其下方的两行更改为阅读

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

你会得到同样的结果。

编辑:进一步研究,我看到了更多问题:

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

于 2013-01-19T15:58:15.813 回答
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结构时,其中的字段将指向看似随机的位置。

这可以通过在分配后直接设置nextandprev指针来解决:NULL

start = malloc(sizeof(node));
start->next = NULL;
start->prev = NULL;
于 2013-01-19T15:36:35.800 回答