2017-10-16 4 views
2

이중 연결 목록을 되돌리려 고 시도하고 있습니다. 반대로하면 목록이 비어있는 것 같습니다.이중 연결 목록 문제 취소

#include <stdio.h> 
#include <malloc.h> 
#include <stdlib.h> 
typedef struct Item Item; 
typedef struct DLL DLL; 

struct Item { 
    int value; 
    Item* next; 
    Item* prev; 
}; 

struct DLL { 
    Item* head; 
    Item* tail; 
    int size; 
    void(*add)(DLL*, int); 
    void(*addToTail)(DLL*, int); 
}; 

void add(DLL* list, int val) { 
    Item* new_item = (Item*) malloc(sizeof(Item)); 
    if (new_item == NULL) { 
     exit(-1); 
    } 
    new_item->value = val; 
    new_item->next = list->head->next; 
    list->head->next = new_item; 
    new_item->prev = list->head; 
    list->size++; 
} 

void addToTail(DLL* list, int val) { 
    Item* new_item = (Item*) malloc(sizeof(Item)); 
    if (new_item == NULL) { 
     exit(-1); 
    } 
    new_item->value = val; 
    new_item->prev = list->tail->prev; 
    list->tail->prev = new_item; 
    new_item->next = list->tail; 
    list->size++; 
} 

Item* find(DLL* list, int val) { 
    Item* iter = list->head->next; 
    while (iter != list->tail) { 
     if (iter->value == val) { 
      return iter; 
     } 
     iter = iter->next; 
    } 
    return NULL; 
} 

void reverse(DLL* list) { 
    Item* current = list->head; 
    Item* temp = NULL; 
    while (current != NULL) { 
     temp = current->next; 
     current->next = current->prev; 
     current->prev = temp; 
     current = current->prev; 
    } 

    temp = list->head; 
    list->head = list->tail; 
    list->tail = temp; 
} 

void printList(DLL* list) { 
    Item* iter = list->head->next; 
    while (iter != list->tail) { 
     printf("%d\n", iter->value); 
     iter = iter->next; 
    } 
} 

DLL* initDLL() { 
    DLL* list = (DLL*) malloc(sizeof(DLL)); 
    if (list == NULL) { 
     exit(-1); 
    } 

    // Creating head & tail 
    list->head = (Item*) malloc(sizeof(Item)); 
    list->tail = (Item*) malloc(sizeof(Item)); 
    if (list->head == NULL || list->tail == NULL) { 
     free(list); 
     exit(-1); 
    } 

    // Initializing head & tail values just for testing 
    list->head->value = 100; 
    list->tail->value = 200; 

    list->head->prev = NULL; 
    list->head->next = list->tail; 
    list->tail->prev = list->head; 
    list->tail->next = NULL; 

    list->size = 0; 
    list->add = add; 
    list->addToTail = addToTail; 

    return list; 
} 

int main() { 
    DLL* my_list = initDLL(); 
    my_list->add(my_list, 1); 
    my_list->add(my_list, 2); 
    my_list->add(my_list, 3); 

    printList(my_list); 
    // Outputs: 
    // 3 
    // 2 
    // 1 

    reverse(my_list); 

    printList(my_list); 
    // Prints nothing since list->head->next == list->tail 
} 

내가

3 
2 
1 
1 
2 
3 

을 예상하지만

3 
2 
1 
을 얻을 : 여기

내 구현

첫 번째 printList()은 예상대로 작동하지만 두 번째 출력은 출력되지 않습니다.

목록에서 3 개의 요소가 있더라도 어떤 이유에서든 목록을 뒤집어서 list->head->nextlist->tail을 가리키는 것을 발견했습니다.

예를 들어 온라인으로 검색했지만 광산과 같은 DLL 구조는 사용하지 않지만 구현은 단지 Node 구조 만 찾았습니다. 귀하의 추가 기능에서

+0

실제로 DLL을 되돌려 야하는 이유가 표시되지 않습니다. 꼬리에서 머리까지 인쇄 할 수있는 기능이 있습니다. – babon

+0

그것은 공부 목적입니다. – Infected

+0

그건 [mcve]를위한 많은 코드입니다. – melpomene

답변

3

, 당신은 당신의 addToTail()new_item->next = list->head->next;

void add(DLL* list, int val) { 
    Item* new_item = malloc(sizeof *new_item); 
    if (new_item == NULL) { 
     exit(EXIT_FAILURE); 
    } 
    new_item->value = val; 
    new_item->next = list->head->next; 
    new_item->next->prev = new_item; // <--- This is missing in your code 
    list->head->next = new_item; 
    new_item->prev = list->head; 
    list->size++; 
} 

비슷한 문제를 설정 한 후 new_item-new_item->next->prev를 설정해야합니다. 여기서 new_item->prev->nextnew_item으로 설정해야합니다.