2015-01-03 5 views
-3

Я пытаюсь сортировать связанный список по году поля, но мой код неправильный. У меня есть такой список и функции для сортировки связанного списка:Как правильно сортировать список ссылок C

struct sputnik { 
char nazvanie[30]; 
char nazvanie_main[30]; 
int year; 
float d; 
int period; 
struct sputnik *next; 
}; 

int f_sort (struct sputnik **head,int*count) { 
struct sputnik *prev,*current,*buffer, *buf; 
int i; 
current=*head; 

for (i=0;i<*count;i++) { 
while (current!=NULL){ 
prev=current; 
buf=current->next; 
if (prev->year>buf->year){ 
buffer=buf->next; 
buf->next=prev->next; 
prev->next=buffer; 
current=prev->next; 

} 
else{ 
current=buf->next; 
} 
} 
} 
return 0; 
} 

Количество в моем коде является amoumt элементов в моем списке.

+0

Пожалуйста, перепишите это в виде вопроса. Покажите нам, что вы пробовали до сих пор, и предложите то, что, по вашему мнению, нарушено. – DevNull

+0

Вы разыскиваете 'buf', который пришел из' buf = current-> next; 'без проверки' if (buf! = NULL) '. –

+0

Также ваша функция 'f_sort()' принимает два параметра по ссылке, но не меняет ни один из них. Это не ошибка (если вы не намеревались изменить 'head' в сортировке), просто избыточность. –

ответ

0

Вам необходимо обновить головку списка по мере необходимости и вернуть ток обратно в головку списка после цикла for (i = 0 ...). Это было бы проще, если бы вы использовали указатель на указатель на текущий, а не на «prev». Например:

struct sputnik **ppcurrent; 
    /* ... */ 
    for(i=0 ... 
     ppcurrent = head; 
     while(NULL != *ppcurrent && NULL != (*ppcurrent)->next){ 
      /* ... if swap */ 
       *ppcurrent = ... ; /* update head or a next pointer */ 
      /* ... */ 
      ppcurrent = &((*ppcurrent)->next); /* advance ppcurrent */ 

Есть более эффективные способы сортировки списка, но посмотрите, сможете ли вы перенести свою текущую версию.

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