Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中的双链表 #包括 定义表结点 { int数据; 结构节点*下一步; 结构节点*prev; }节点; 无效插入(节点*指针,整数数据) { while(指针->下一步!=NULL) { 指针=指针->下一步; } 指针->下一步=(节点*)malloc(sizeof(节点)); (指针->下一步)->上一步=指针; 指针=指针->下一步; 指针->数据=数据; 指针->下一步=空; } int main() { 节点*启动; start=(node*)malloc(sizeof(node)); int数据; scanf(“%d”和数据); 插入(开始,数据); }_C_List - Fatal编程技术网

C语言中的双链表 #包括 定义表结点 { int数据; 结构节点*下一步; 结构节点*prev; }节点; 无效插入(节点*指针,整数数据) { while(指针->下一步!=NULL) { 指针=指针->下一步; } 指针->下一步=(节点*)malloc(sizeof(节点)); (指针->下一步)->上一步=指针; 指针=指针->下一步; 指针->数据=数据; 指针->下一步=空; } int main() { 节点*启动; start=(node*)malloc(sizeof(node)); int数据; scanf(“%d”和数据); 插入(开始,数据); }

C语言中的双链表 #包括 定义表结点 { int数据; 结构节点*下一步; 结构节点*prev; }节点; 无效插入(节点*指针,整数数据) { while(指针->下一步!=NULL) { 指针=指针->下一步; } 指针->下一步=(节点*)malloc(sizeof(节点)); (指针->下一步)->上一步=指针; 指针=指针->下一步; 指针->数据=数据; 指针->下一步=空; } int main() { 节点*启动; start=(node*)malloc(sizeof(node)); int数据; scanf(“%d”和数据); 插入(开始,数据); },c,list,C,List,我想了解C语言中列表的基本知识。我有一个问题——insert()底部的第三行——这是干什么用的?看起来,如果第一个列表的元素保持为空,并且数据被保存到第二个列表中。但只有这样才能奏效 在main()中创建了第一个空元素,对吗 由于元素为null,因此不会执行while() 然后创建第二个元素。(指针->空) 指向第一个元素的指针设置为指向第二个元素(从底部开始的第三行) 数据被保存到第二个元素中 哪里出错?在您的插入功能中,您有以下任务: #include<stdio.h> typ

我想了解C语言中列表的基本知识。我有一个问题——insert()底部的第三行——这是干什么用的?看起来,如果第一个列表的元素保持为空,并且数据被保存到第二个列表中。但只有这样才能奏效

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

由于元素为null,因此不会执行while()

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

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

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

哪里出错?

在您的
插入功能中,您有以下任务:

#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);
}
这将不起作用,因为指针
指针
是通过值传递的。这意味着当函数返回时,对值的所有更改都将丢失

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

pointer = pointer->next;
或从函数返回指针:

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


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

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

node *insert(node *pointer, int data)
{
    /* ... */
    return pointer;
}
此行将我们关注的当前节点从原始列表的最后一个节点更改为新列表的新分配的最后一个节点(即原始列表最后一个节点之后的节点)。然后在接下来的两行中直接设置该节点的值

你可以去掉这一行,把下面的两行改为

pointer = pointer->next;
你会得到同样的结果

编辑:进一步研究,我发现更多问题:

1) 您需要
#包含
才能使用
malloc()


2) 需要显式设置
start->next=NULL
在调用
insert()

之前,这实际上是未定义的行为,除非我大错特错,第一次
next
将未初始化..是的,看起来数据存储在第二个元素中,问题到底是什么?你的问题是什么?你的分析是正确的。。。。当指针通过值传递时。这意味着当函数返回时,对值的所有更改都将丢失。这就是想法<代码>指针
仅用于遍历列表、到达最后一个元素并添加包含数据的新元素。
pointer = pointer->next;
pointer->next->data = data;
pointer->next->next = NULL;