2016-04-07 6 views
-1
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); 
} 

ЬурейеЕ и Ко ..C - Вдвойне связанный список

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

Вы должны показать определение 'CIL_new()', ' ConsoleName' и 'ConsoleIp'. В идеале [sscce] (http://sscce.org/). – tinman

+0

Правильно, я отредактировал :) –

+0

Спасибо за добавление определений, но в идеале вы должны вставить небольшой компилируемый пример проблемы, чтобы у вас было больше шансов для людей заинтересоваться. – tinman

ответ

1

На приведенном ниже рисунке показано пошаговое разбиение того, что происходит с вашим списком ссылок.

В основном первый круглый круг головы и хвоста указывает на новый элемент, который имеет NULL prev и следующие указатели.

Во второй раз вокруг головы указывает на старый предмет, а хвост указывает на новый предмет. Новый элемент имеет как prev, так и следующий для существующего элемента. Только предыдущий должен указывать на старый элемент, следующий должен быть NULL. Вы также должны обновить старый указатель следующего пункта, чтобы указать на новый элемент, который вы еще не сделали.

Поскольку он стоит, старый элемент по-прежнему первый в списке, а следующий указатель по-прежнему равен NULL, поэтому вы получаете только один выход.

Step by step addition to linked list

Ваш код Append должен, вероятно, будет так:

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

(Но я не проверял это.)

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

Я counldn't проверить это, так как Я не уверен, как заставить ваш код работать.

+0

спасибо, что он работает! –

Смежные вопросы