2016-12-21 3 views
0

У меня есть структура, которую я называю пассажирами, которые сортируются в алфавитном порядке, и I Скопируйте в связанный список с теми же элементами, что и структура. Что было бы лучшим алгоритмом для изменения порядка элементов списка, чтобы я мог легко распечатать его в алфавитном порядке? Теперь, конечно, моя печать не работает, если первое значение он встречает является NULLРекурсивный алгоритм для связанного списка в C

typedef struct    
{ 
    char fullname[40]; 
    unsigned short phonenr[10]; 
    unsigned int seatnr;   
}PASSENGERS;  


typedef struct list1 
{ 
    char fullname[40]; 
    struct list1 *next; 
}LIST1; 

int main() 
{ 
    selectsortnm(passenger); /*A function I use to sort alphabetically*/ 
    LIST1 *list1, *start=NULL; 
    int i=0; 
    while (strcmp(passenger[i].fullname,"\0")!=0); 
    { 
     list1 = (LIST1 *) malloc (sizeof(LIST1)); 
     list1->next = NULL; 
     strcpy(list1->fullname,passenger[i].fullname); 
     if (start ==NULL) 
     { 
      start = list1; 
      i++; 
     } 
     else 
     { 
      list1->next = start; 
      start = list1; 
      i++; 
     } 
    } 

    //Recursive algorithm 

    LIST1 *current = list1; 
    while (current !=NULL) 
    { 
     printf("%s",current->fullname); 
     current = current->next; 
    } 
} 
+0

Ваш вопрос непонятен. И что такое LIST1? Пожалуйста, используйте код, который легко понять. –

+0

Нам нужен связанный -list.stackoverflow.com, поэтому мы можем отфильтровать половину входящих вопросов. –

+1

Использование двунаправленного списка сделает трюк, пройдя его назад. Также (это больше похоже на обходной путь) вы можете пересечь массив 'пассажиров' назад при создании списка, но вам понадобится 2 цикла: 1 для получения последнего индекса (последняя запись, _fullname_ не' NULL'), а вторая : цикл из индекса, найденного предыдущим циклом, в _0_. Хм, но нет рекурсивности ни в двух подходах. – CristiFati

ответ

0

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

void printListRev(struct LIST *p) 
{ 
    if (!p) return; 
    printListRev(p->next); 
    printf("%s\n", p->data); 
} 
0

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

Это, как вы вставляете элементы в список:

 list1 = make_list_item_from(passengers[i]); 
     list1->next = start; 
     start = list1; 
     i++; 

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

Чтобы противостоять этому, вы можете пройти passengers назад при вставке в свой список. Кроме того, вы можете сохранить ссылку на последний элемент списка и добавить свои новые элементы в конец своего списка.

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