Сортировка двусвязного списка - C (СИ) (69635)
Формулировка задачи:
Не получается выполнить сортировку двусвязного списка методом пузырька. У меня получилось сделать только один заход, а их надо несколько.
struct LIST
{
int info;
LIST* next;
LIST* prev;
};
void sort(LIST *i, LIST *start, LIST *last)
{
int tmp=0;
i=start;
if((i->info)>(i->next->info))
{
tmp=i->info;
i->info=i->next->info;
i->next->info=tmp;
}
}Решение задачи: «Сортировка двусвязного списка»
textual
Листинг программы
void sort(LIST *start)
{
LIST *tmp;
LIST *a;
int t=0;
bool flag=1;
while(flag==1)
{
tmp=start;
a=tmp->next;
flag=0;
while(a)
{
if((tmp->info)>(a->info))
{
t=tmp->info;
tmp->info=a->info;
a->info=t;
flag=1;
}
tmp=tmp->next;
a=a->next;
}
}
}
Объяснение кода листинга программы
- Функция сортировки списка
sortпринимает двусвязный списокstartв качестве аргумента. - В функции используются следующие переменные:
tmp- временная переменная для хранения текущего элемента списка.a- переменная для хранения следующего элемента списка.t- временная переменная для обмена значениями.flag- флаг для контроля цикла.
- В цикле
whileпроисходит проход по списку до тех пор, пока флаг не станет равным 0. - Внутри цикла находятся два вложенных цикла
while:- Внешний цикл проходит по всем элементам списка, начиная с
start. - Внутренний цикл проходит по всем элементам списка, начиная с
a.
- Внешний цикл проходит по всем элементам списка, начиная с
- Внутренний цикл сравнивает значения элементов
tmpиaи, если значениеtmpбольше значенияa, меняет их местами и устанавливает флагflagравным 1. - После выхода из внутреннего цикла
whileпроисходит переход к следующему элементу списка:tmp=tmp->nextиa=a->next. - Если после прохода по всем элементам списка флаг
flagне изменился, значит список уже отсортирован. - Функция возвращает
start- отсортированный список.