C - 双重链表

时间:2016-04-07 19:31:13

标签: c

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);

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

2 个答案:

答案 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,因此您只能获得一个输出。

Step by step addition to linked list

你的追加代码应该是这样的:

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

(但我没有测试过。)