Я изучаю C из «Книги C». Я думаю, что это хорошая книга, и я понимаю большую часть ее, как указатели. Но я не могу придумать пример сортировки со связанными структурами списков.Как работает этот метод сортировки?
Если я нарисую его на бумаге, я все равно поймаю, что указатели второго объекта не настроены на первый, если они переключаются. Возможно, я неправильно думаю об этих указателях в структурах. Может кто-нибудь объяснить этот обмен очень короткий, может быть, на примере, как я сделал в коде с 5, 99 и 1. Я хотел бы понять этот вид сортировки со связанным списком, потому что он кажется довольно полезным позже.
Это код: #include #include
struct list_ele{
int data;
struct list_ele *pointer;
}ar[3];
struct list_ele *
sortfun(struct list_ele *list);
int
main(){
struct list_ele *lp;
ar[0].data = 5;
ar[0].pointer = &ar[1];
ar[1].data = 99;
ar[1].pointer = &ar[2];
ar[2].data = 1;
ar[2].pointer = 0;/* mark end of list */
/* sort list */
lp = sortfun(ar);
/* follow pointers */
while(lp){
printf("contents %d\n", lp->data);
lp = lp->pointer;
}
exit(EXIT_SUCCESS);
}
struct list_ele *
sortfun(struct list_ele *list)
{
int exchange;
struct list_ele *nextp, *thisp, dummy;
/*
* Algorithm is this:
* Repeatedly scan list.
* If two list items are out of order,
* link them in the other way round.
* Stop if a full pass is made and no
* exchanges are required.
* The whole business is confused by
* working one element behind the
* first one of interest.
* This is because of the simple mechanics of
* linking and unlinking elements.
*/
dummy.pointer = list;
do{
exchange = 0;
thisp = &dummy;
while((nextp = thisp->pointer) && nextp->pointer) {
if(nextp->data > nextp->pointer->data){
/* exchange */
exchange = 1;
thisp->pointer = nextp->pointer;
nextp->pointer = this->pointer->pointer;
thisp->pointer = nextp;
}
thisp = thisp->pointer;
}
}while(exchange);
return(dummy.pointer);
}
Посмотрите ["bubble sort"] (http://en.wikipedia.org/wiki/Bubble_sort). Нотабене книга, в которой используется сортировка пузырьков для обучения сортировке, - это не книга, которую я бы рекомендовал. Эффективная сортировка связанных списков обычно выполняется с помощью [merge sort] (http://en.wikipedia.org/wiki/Merge_sort). – user4815162342
«Если я нарисую его на бумаге, я продолжаю понимать, что указатели второго объекта не настроены на первый, если они переключаются». Я не совсем уверен, что вы подразумеваете под этим. Не могли бы вы объяснить больше? (Если вы поняли, что думаете, что люди могут лучше объяснить, где вы поступили не так.) – starsplusplus
Хорошо, я проверил это снова, и я подумал, что нашел его, но, как вы говорите, я тоже пришел к этому проблема. Указатель второго объекта не настроен на первый. Вот почему я запутался, что функции работают, если я его выполню. – Digihash