gpt4 book ai didi

C - 双向链表

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

ConsoleInfo         *CI_new(const char *name, const char *ip, ConsoleInfo *prev, ConsoleInfo *next)
{
ConsoleInfo *list;
if ((list = malloc(sizeof(ConsoleInfo))))
{
list->name = strdup(name);
list->ip = strdup(ip);
list->prev = !prev ? NULL : prev;
list->next = !next ? NULL : next;
}
return (list);
}

bool CIL_is_empty(ConsoleInfoList *list)
{
return (list->count == 0);
}

ConsoleInfoList *CIL_append(ConsoleInfoList *list, const char *name, const char *ip)
{
if (CIL_is_empty(list))
{
list->head = list->tail = CI_new(name, ip, NULL, NULL);
}
else
{
ConsoleInfo *new = CI_new(name, ip, list->tail, list->head);
list->tail = new;
list->head = new->next;
}
list->count++;
return (list);
}

typedef 和 co..

    typedef struct ConsoleInfo ConsoleInfo;
typedef struct ConsoleInfoList ConsoleInfoList;

struct ConsoleInfoList {
size_t count;
ConsoleInfo *head;
ConsoleInfo *tail;
};

struct ConsoleInfo {
char *name;
char *ip;
ConsoleInfo *next;
ConsoleInfo *prev;
};

typedef struct ConsoleName
{
char value[256];
} ConsoleName;

typedef struct ConsoleIp
{
char value[256];
} ConsoleIp;

现在,为什么我这样做:

ConsoleInfoList     *CIL_new(void)
{
ConsoleInfoList *list;

if ((list = malloc(sizeof(ConsoleInfoList))))
{
list->count = 0;
list->head = NULL;
list->tail = NULL;
}
return (list);
}


ConsoleInfoList *cil = CIL_new();
if (!cil)
return (NULL);
ConsoleName name;
ConsoleIp ip;
for (int i = 0; i < GetNumberOfConsoles(); ++i)
{
GetConsoleInfo(i, &name, &ip);
cil = CIL_append(cil, name.value, ip.value);
}
for (ConsoleInfo *ci = cil->head; ci; ci = ci->next)
CI_print(ci);

仅显示第一个元素。
我知道这是一个非常业余的问题,我确信答案将非常简单,但我无法解决问题。

最佳答案

下图显示了链接列表追加操作所发生情况的逐步 segmentation 。

基本上,第一次循环的 head 和 tail 指向具有 NULL prev 和 next 指针的新元素。

第二次循环时,头部指向旧项目,尾部指向新项目。新项目的上一个和下一个设置为现有项目。只有 prev 应该指向旧项目,next 应该为 NULL。您还必须更新旧项目的下一个指针以指向您尚未完成的新项目。

就目前情况而言,旧元素仍然是列表中的第一个元素,并且下一个指针仍然为 NULL,因此您只能得到一个输出。

Step by step addition to linked list

您的附加代码可能应该是这样的:

ConsoleInfo *new = CI_new(name, ip, list->tail, NULL);
list->tail->next = new;
list->tail = new;

(但我还没有测试过。)

关于C - 双向链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36485512/

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