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 and 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);
仅显示第一个元素。
我知道这是一个非常业余的问题,我确信这将是一个非常简单的答案,但我无法解决问题。
答案 0 :(得分:1)
我不是C专家,但这部分对链接列表没有意义:
ConsoleInfo *new = CI_new(name, ip, list->tail, list->head);
list->tail = new;
list->head = new->next;
应该是
ConsoleInfo *new = CI_new(name, ip, list->tail, NULL);
list->tail->next = new
list->tail = new;
我没有对此进行测试,因为我不确定如何让代码运行。
答案 1 :(得分:1)
下图显示了您的链接列表附加操作所发生的一步一步的细分。
基本上第一次将head和tail指向具有NULL prev和next指针的新元素。
第二次将头部指向旧项目,尾部指向新项目。新项目的prev和next都设置为现有项目。只有prev应指向旧项,next应为NULL。您还必须更新旧项目下一个指针,指向您尚未完成的新项目。
现在,旧元素仍然是列表中的第一个,下一个指针仍为NULL,因此您只能获得一个输出。
你的追加代码应该是这样的:
ConsoleInfo *new = CI_new(name, ip, list->tail, NULL);
list->tail->next = new;
list->tail = new;
(但我没有测试过。)