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