Сортировка двусвязного списка - 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
хранится отсортированный список. - Все выделенные области памяти освобождаются.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д