gpt4 book ai didi

C链表无法正确向链表添加数据

转载 作者:行者123 更新时间:2023-11-30 21:24:18 24 4
gpt4 key购买 nike

问题有点长,请耐心等待。我正在尝试使用虚拟节点作为头在 C 中创建一个双向链表。然而,无论出于何种原因,列表仅保存我读入其中的最后一个节点,并将上一个节点指针和下一个节点指针链接到最后一个节点,因此,如果我尝试迭代列表,它就会陷入无限循环。

这是我的节点头文件和 C 文件。链表实现并不意味着是一个完整的链表实现,因此我只包含了我需要的函数:

节点.h:

#ifndef _node_h
#define _node_h

#include "task_block.h"
#include <stdio.h>

typedef struct node {
task_block_type *data;
struct node *next;
struct node *prev;
}node_t;

node_t *node_new(task_block_type *data);
void add(node_t *new, node_t *head);
#endif

节点.c:

#include "node.h"
#include "task_block.h"
#include <stdlib.h>

node_t *node_new(task_block_type *data) {
node_t *node = NULL;

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

return node;
}

void add(node_t *new, node_t *head) {
node_t *current = head;

if (head->next == NULL) {
head->next = new;
head->next->prev = head;
return;
}

while(current->next != NULL) {
current = current->next;
}

current->next = new;
current->next->prev = current;

return;
}

最后,main.c 中困惑的代码:

    while (j < numTasks) {
if (tasks[j].taskID == currentID) {
*newTask = *task_block_new(tasks[j].taskID, tasks[j].period);
newTask->startTime = starts[i];
newTask->deadline = deadlines[i];
newTask->executionTime = executions[i];
*nodeNew = *node_new(newTask);
add(nodeNew, eventQueue);
}

我已经测试过我的新任务 block 类型从文本文件中获取了正确的数据,并且我创建的新节点已使用任务 block 正确初始化。然而,一旦我用 add() 将它读入我的列表,它就会变得困惑。任何帮助将不胜感激,因为我已经尝试解决这个问题几个小时了,但仍然没有找到解决方案

编辑:

自包含示例:*node_new 是我的节点对象的构造函数,并且应该返回指向节点对象的指针。例如,假设我有一个包含 int 的节点,而不是像上面那样包含 task_block_type 的节点。如果我想用值 5 来初始化它,我会调用

*newNode = (node_t *)malloc(sizeof(node_t));*newNode = *node_new(5);

希望有帮助

最佳答案

更改此:

*nodeNew = *node_new(newTask);

对此:

nodeNew = node_new(newTask);

您的原始代码将 node_new() 返回的(取消引用的)复制到(取消引用)*处的节点新。因此,指针 nodeNew 永远不会被 node_new() 创建的新节点的地址更新。 .因此,您不断覆盖 *nodeNew 处的值,同时将其不变的地址传递给 add()

并且你会遇到内存泄漏。您有责任free()释放malloc()返回给您的每个指针。但在这里,出于与上面给出的相同原因,您没有保留返回指针的副本来启用此功能...只是一遍又一遍地链接到 nodeNew

在将指针传递给 add() 之前,您需要使用每个新节点的位置来更新指针 nodeNew。然后,您实际上将链接不同节点,并链接到它们的原始地址,而不是以泄漏的方式将它们复制到同一地址并将其无限地链接到自身。

您还需要在使用完毕后free()动态分配的所有内存,例如通过在“析构函数”函数中或在程序末尾扫描链接列表。否则你就会泄漏内存。这是一个基本错误,即使它不会阻止程序运行,也会浪费用户的 RAM,这是他们不喜欢的!

我强烈建议您在继续尝试编写这样的代码之前多研究一下指针和动态分配。

关于C链表无法正确向链表添加数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38163629/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com