Сортировка двусвязного списка - C (СИ) (153302)
Формулировка задачи:
Доброго дня!
Помогите, пожалуйста, разобраться, что я делаю не так.
Задание: разработать программу для создания и работы с двусвязным списком, состоящим из структур. Структура содержит фамилию, год рождения. Добавлять новые записи так, чтобы список был упорядочен по возрасту.
Функции для создания, просмотра и добавления записи в конец списка написаны и работают. А вот с сортировкой беда. Программа, похоже, зацикливается...
Вот что у меня получилось
Пробовала сделать и так
В этом случае сразу возникает ошибка "Lvalue required" в строках с name.
Компиляция предполагается в Borland C.
P.S. Еще буду очень благодарна, если дадите полезную ссылку, чтобы научиться отладке программ
do {k=0; pred=head; do {if ((pred->year)>(p->year)) {temp=p; p=pred; pred=temp; free(temp); k=1; } pred=pred->v2; pred->v2=p; p->v1=pred; } while (p!=NULL); } while (k==1);
do {if ((pred->year)>(p->year)) {temp->name=p->name; temp->year=p->year; p->name=pred->name; p->year=pred->year; pred->name=temp->name; pred->year=temp->year; free(temp); k=1; }
Решение задачи: «Сортировка двусвязного списка»
textual
Листинг программы
void correct(void) {spis *p,*pred,*temp; int k; pred=tail; do { p=(spis *)malloc(sizeof(spis)); flushall(); printf("\n Familiya: "); gets(p->name); printf(" God rozhdeniya: "); scanf("d",&p->year); p->v1=pred; pred->v2=p; pred=p; puts(" Zavershit'? - <esc>"); } while (getch()!=27); tail=p; tail->v2=NULL; do {k=0; pred=head; temp=(spis *)malloc(sizeof(spis)); do {if ((pred->year)>(p->year)) {temp=p; p=pred; pred=temp; free(temp); k=1; } pred=pred->v2; pred->v2=p; p->v1=pred; } while (p!=NULL); } while (k==1); }
Объяснение кода листинга программы
В данном коде реализуется функция correct, которая выполняет сортировку двусвязного списка.
- Создается указатель
p
на новый элемент списка и выделяется память под новый элемент. - Задается вопрос
Familiya:
и считывается имя. - Задается вопрос
God rozhdeniya:
и считывается год рождения. - Устанавливаются связи нового элемента со старым.
- Повторяется процесс до тех пор, пока не будет введен год рождения, равный 0.
- Устанавливается связь между последним и предпоследним элементами списка.
- В цикле, пока не будет введен символ
27
, выполняется сортировка списка по году рождения. - Если год рождения текущего элемента больше года рождения следующего, то элементы меняются местами.
- После завершения цикла, в
tail
хранится отсортированный список. - Выводится сообщение
Zavershit'? - <esc>
и ожидается ввод. - Если введен символ
27
, то сортировка завершается. - В
head
хранится отсортированный список. - Все выделенные области памяти освобождаются.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д