2014-05-15 3 views
-2

Я пытаюсь распечатать значения дважды связанного кругового списка, но моя функция printAll по какой-либо причине выводит содержимое первого узла ,Печать содержимого двунаправленного кругового списка в c выводит только первый узел

#include<stdlib.h> 
#include<stdio.h> 

struct clientsOn 
{ 
    int id; 
    char filename[20]; 
    struct clientsOn* next; 
    struct clientsOn* prev; 
}; 

struct clientsList 
{ 
    int count; 
    struct clientsOn* head; 
}; 

void printAll(struct clientsList* list); 
void add(struct clientsList *list,struct clientsOn *newC); 
struct clientsList* createList(); 
struct clientsOn* createNode(char* profile); 

main() 
{ 
struct clientsList* people = malloc(sizeof(struct clientsList)); 
people = createList(); 
printf("Number of people currently on: %d\n",people->count); 

struct clientsOn* pers1, *pers2, *pers3; 

char boy[20],boy2[20],boy3[20]; 
printf("String: \n"); 
scanf("%s",boy); 
printf("String: \n"); 
scanf("%s",boy2); 
printf("String: \n"); 
scanf("%s",boy3); 

pers1 = createNode(boy); 
pers2 = createNode(boy2); 
pers3 = createNode(boy3); 

add(people,pers1); 
add(people,pers2); 
add(people,pers3); 
printf("people count: %d", people->count); 

printAll(people); 
} 

struct clientsList* createList() 
{ 
    struct clientsList* list = malloc(sizeof(struct clientsList)); 
    if(list){ 
     list->head = NULL; 
     list->count = 0; 
    } 
    return list; 
} 

struct clientsOn* createNode(char* profile) 
{ 
    struct clientsOn* clients = malloc(sizeof(struct clientsOn)); 

    if(clients){ 
     clients->next = clients; 
     clients->prev = clients; 
     strcpy(clients->filename,profile); 
    } 
    return clients; 
} 

void add(struct clientsList *list,struct clientsOn *newC) 
{ 

    if(newC){ 
    if(list->head == NULL){ 
     list->head = newC; 
    }else{ 
     list->head->prev = newC; 
     newC->prev = list->head->prev; 
     newC->prev->next = newC; 
     newC->next = list->head; 
    } 
    list->count++; 
    } 
} 

void printAll(struct clientsList* list) 
{ 
    struct clientsOn* node = list->head; 

    if(node != NULL){ 
     do{ 
      printf("list content is: %s",node->filename); 
      node = node->next; 
     }while(node!=list->head); 
    } 
} 

Моя добавь функция добавляет узлы в самом конце списка, и когда я выходной отсчет список

printf("people count: %d", people->count); 

он показывает количество элементов добавляется в список, однако при попытке печати

printAll(people); 

не выходит за пределы первого узла. Кто-нибудь когда-либо испытывал что-то подобное?

+0

«* он не выходит за пределы ... когда-либо испытывает что-либо подобное *« Да, любопытное, пока играешь с молодыми лошадьми ... ;-) – alk

ответ

1

В вашей функции add() есть проблема, которая не создает список соответствующим образом.

list->head->prev = newC; //sets head->prev to newC 
newC->prev = list->head->prev; //here setting newC->prev to head->prev which is NewC 
newC->prev->next = newC; //here newC->prev->next is actually newC->next is set to newC 

Попробуйте использовать gdb или какой-либо другой отладчик, чтобы проверить вашу логику.

+0

1+, по крайней мере, за предложение использовать отладчик! – alk

+0

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

0

функция попытается использовать эту логику. Я думаю, это должно сработать.

if(newC){ 
    if(list->head == NULL){ 
     list->head = newC; 
    }else{ 
     newC->next = list->head; 
     newC->prev = list->head->prev; 
     list->head->prev->next = newC; 
     list->head->prev = newC; 
    } 
    list->count++; 
    } 

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

+0

Спасибо за подсказку. Я попробую использовать GDB, чтобы лучше понять с этого момента. – user3640687