2016-06-09 2 views
-1

Я пытаюсь сделать реверсивный реверсивный список, используя указатель на указатель, но проблема в том, что во втором цикле происходит сбой сценария. Можете ли вы мне помочь, чтобы решить мою проблему. Это мой код:Обратный список рекурсивно

void reverseNumber(Mynbr** start){ 
    Mynbr *header; 
    Mynbr *current; 

    if ((*start)){ 
     header = (*start); 
     current = (*start)->next; 

     if (current && current->next!= NULL) 
     { 
      reverseNumber(current->next); 
      header = current; 
      current->next->next = current; 
      current->next = NULL; 
     } 
    } 

} 
+1

Пожалуйста, напишите [Минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve). Что такое 'current-> next'? Это действительно 'Mynbr **', а не 'Mynbr *'? – MikeCAT

+0

Я думаю, что это должно быть reverseNumber (& (current-> next)); – Gregg

+1

Включите предупреждения компилятора. – MikeCAT

ответ

0

Вам необходимо пройти указатель на указатель в вызове reverseNumber (current-> следующая). Это должно быть reverseNumber (& (текущий-> следующий)). Думаю, ты не возвращаешь новую голову. Кроме того, перевернутый список закончится преждевременно. Например, если список 1-> 2-> 3-> 4-> 5-> NULL, то после обратного будет 5-4-> NULL.

1

Путь должен следовать является:

1) Divide the list in two parts - first node and rest of the linked list. 
    2) Call reverse for the rest of the linked list. 
    3) Link rest to first. 
    4) Fix head pointer 

enter image description here

void reverseNumber(struct Mynbr** start) 
{ 
    struct Mynbr* head; 
    struct Mynbr* rest; 

    /* empty list */ 
    if (*start == NULL) 
     return; 

    /* suppose head = {1, 2, 3}, rest = {2, 3} */ 
    head = *start; 
    rest = head->next; 

    /* List has only one node */ 
    if (rest == NULL) 
     return; 

    /* reverse the rest list and put the head element at the end */ 
    reverseNumber(&rest); 
    head->next->next = head; 

    /* tricky step -- see the diagram */ 
    head->next = NULL;   

    /* fix the head pointer */ 
    *start = rest;    
} 
1

попробовать это

void reverseNumber(Mynbr **start){ 
    Mynbr *header = *start; 
    if(!header) return; 
    Mynbr *current = header->next; 
    if(!current) return; 

    header->next = NULL; 
    Mynbr *new_head = current; 
    reverseNumber(&new_head); 
    current->next = header; 
    *start = new_head; 
} 
0

Я не понимаю, почему двойной указатель. Он не имеет никакой цели. Итак, я на самом деле написал простую программу, которая делает то, что вам нужно.

Предполагая, что это будет структура вашего Mynbr

struct Mynbr { 
     int k; 
     struct Mynbr* next; 
    }; 

Тип определения структуры

typedef struct Mynbr Mynbr_t; 

Моя реверсивный функция связана список будет, как это (который вызывается рекурсивно)

void reverseNumber(Mynbr_t* start) { 
     if (start == NULL) return; 
     static Mynbr_t* head; 
     Mynbr_t* current = start; 
     if (current->next != NULL) { 
      reverseNumber(current->next); 
      head->next = current; 
      head = current; 
      head->next = NULL; 
     } else 
      head = current; 
    } 

Продолжите, проверьте это, используя этот ниже код. Он просто меняет список.

int main() { 
     size_t Mynbr_size = sizeof(Mynbr_t); 
     Mynbr_t* start = (Mynbr_t*) malloc(Mynbr_size); 
     Mynbr_t* current = start; 
     int i; 
     for (i=0; i<10; i++) { 
      current->k = i; 
      if (i!=9) { 
       current->next = (Mynbr_t*) malloc(Mynbr_size); 
       current = current->next; 
      } 
     } 

     current = start; 
     Mynbr_t* last = NULL; 
     while (current != NULL) { 
      printf("%d\n", current->k); 
      current = current->next; 
      if (current != NULL) 
       last = current; // you need to grab this to loop through reverse order 
     } 

     reverseNumber(start); 

     current = last; 
     while (current != NULL) { 
      printf("%d\n", current->k); 
      current = current->next; 
     } 

     current = last; 
     Mynbr_t* temp; 
     while (current->next != NULL) { 
      temp = current; 
      current = current->next; 
      free(temp); // always free the allocated memory 
     } last = NULL; 
     return 0; 
    } 
Смежные вопросы