2014-12-18 1 views
0

Я пытаюсь сортировать по списку ссылок a b c. , как когда-либо, когда я пытаюсь сортировать Я теряю узел. до сих пор я вижу, что линиясортировать список ссылок lecico grfy (abc ...)

q = top; 

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

Users* sort_list_Lex(Users* head) { 

    Users *p,*q, *top; 
    int changed = 1; 

    if ((top = (Users *) malloc(sizeof(Users))) == NULL) { 
     fprintf(stderr, "Memory Allocation error.\n"); 
    } 
    top->next = head; 
    if (head != NULL && head->next != NULL) { 
     while (changed) { 
      changed = 0; 
      q = top; 
      p = top->next; 
      while (p->next != NULL) { /* push bigger items down */ 
        if (0 < strcmp(p->name, p->next->name)) { 
         q->next = list_switch(p, p->next); 
         changed = 1; 
        } 
       q = p; 
       if (p->next != NULL) 
        p = p->next; 
      } 
     } 
    } 
    p = top->next; 
    free(top); 
    return p; 
} 

переключатель FUNC:

Users* list_switch(Users *l1, Users *l2) { 
    l1->next = l2->next; 
    l2->next = l1; 
    return l2; 
} 
+0

Почему вы выделите память для сортировки уже построенного списка ссылок? – Ankur

+0

Нет необходимости в динамическом распределении в виде пузырьков связанного списка. Тем не менее, требуется гораздо большее количество указателей, чем вы думаете. Обычный способ сделать это - выполнить смежные сравнения/свопы до тех пор, пока не будет достигнут конец списка, затем ** переместите ** последний узел в голову «отсортированного» списка, затем повторите, пока не будут обнаружены свопы (которые происходит по умолчанию с одним узлом, оставшимся в списке источников). Когда никакие свопы не обнаруживаются на * любой * итерации, просто присоедините последний узел исходного списка к первому узлу в отсортированном списке, и все готово. – WhozCraig

+0

Перечисляет ли 'list_switch()' всю структуру или только ее элемент данных, оставляя свои указатели неповрежденными? –

ответ

1

Ваш код излишне сложным. С извинениями перед @WhozCraig.

Users* sort_list_Lex(Users* head) { 
    Users *p; 
    char *tmp; 
    int changed; 
    do { 
     changed = 0; 
     p = head; 
     while (p->next) { 
      if (0 < strcmp(p->name, p->next->name)) { 
       tmp = p->name; 
       p->name = p->next>name; 
       p->next>name = tmp; 
       changed = 1; 
      } 
      p = p->next; 
     } 
    } while (changed); 
    return head; 
}  

Этот ответ предполагает, что символьные массивы в пределах связанного struct являются указателями и не char name[] массив, где все данные должны быть заменены.

+0

@WhozCraig и Weather Vane благодарим за работу! как я понимаю, когда я сортирую список ссылок, я должен поменять данные. – yntnm

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