Я пытаюсь сортировать по списку ссылок 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;
}
Почему вы выделите память для сортировки уже построенного списка ссылок? – Ankur
Нет необходимости в динамическом распределении в виде пузырьков связанного списка. Тем не менее, требуется гораздо большее количество указателей, чем вы думаете. Обычный способ сделать это - выполнить смежные сравнения/свопы до тех пор, пока не будет достигнут конец списка, затем ** переместите ** последний узел в голову «отсортированного» списка, затем повторите, пока не будут обнаружены свопы (которые происходит по умолчанию с одним узлом, оставшимся в списке источников). Когда никакие свопы не обнаруживаются на * любой * итерации, просто присоедините последний узел исходного списка к первому узлу в отсортированном списке, и все готово. – WhozCraig
Перечисляет ли 'list_switch()' всю структуру или только ее элемент данных, оставляя свои указатели неповрежденными? –