Сортировка двусвязного списка - C (СИ) (153302)

Узнай цену своей работы

Формулировка задачи:

Доброго дня! Помогите, пожалуйста, разобраться, что я делаю не так. Задание: разработать программу для создания и работы с двусвязным списком, состоящим из структур. Структура содержит фамилию, год рождения. Добавлять новые записи так, чтобы список был упорядочен по возрасту. Функции для создания, просмотра и добавления записи в конец списка написаны и работают. А вот с сортировкой беда. Программа, похоже, зацикливается... Вот что у меня получилось
Листинг программы
  1. do {k=0;
  2. pred=head;
  3. do {if ((pred->year)>(p->year))
  4. {temp=p;
  5. p=pred;
  6. pred=temp;
  7. free(temp);
  8. k=1;
  9. }
  10. pred=pred->v2;
  11. pred->v2=p;
  12. p->v1=pred;
  13. }
  14. while (p!=NULL);
  15. }
  16. while (k==1);
Пробовала сделать и так
Листинг программы
  1. do {if ((pred->year)>(p->year))
  2. {temp->name=p->name;
  3. temp->year=p->year;
  4. p->name=pred->name;
  5. p->year=pred->year;
  6. pred->name=temp->name;
  7. pred->year=temp->year;
  8. free(temp);
  9. k=1;
  10. }
В этом случае сразу возникает ошибка "Lvalue required" в строках с name. Компиляция предполагается в Borland C. P.S. Еще буду очень благодарна, если дадите полезную ссылку, чтобы научиться отладке программ

Решение задачи: «Сортировка двусвязного списка»

textual
Листинг программы
  1. void correct(void)
  2. {spis *p,*pred,*temp;
  3.  int k;
  4.   pred=tail;
  5.   do { p=(spis *)malloc(sizeof(spis));
  6.     flushall();
  7.     printf("\n Familiya: "); gets(p->name);
  8.     printf(" God rozhdeniya: "); scanf("d",&p->year);
  9.     p->v1=pred;
  10.     pred->v2=p;
  11.     pred=p;
  12.     puts(" Zavershit'? - <esc>");
  13.   }
  14.   while (getch()!=27);
  15.   tail=p;
  16.   tail->v2=NULL;
  17.   do {k=0;
  18.     pred=head;
  19.     temp=(spis *)malloc(sizeof(spis));
  20.     do {if ((pred->year)>(p->year))
  21.          {temp=p;
  22.           p=pred;
  23.           pred=temp;
  24.           free(temp);
  25.           k=1;
  26.          }
  27.        pred=pred->v2;
  28.        pred->v2=p;
  29.        p->v1=pred;
  30.       }
  31.     while (p!=NULL);
  32.    }
  33.   while (k==1);
  34. }

Объяснение кода листинга программы

В данном коде реализуется функция correct, которая выполняет сортировку двусвязного списка.

  1. Создается указатель p на новый элемент списка и выделяется память под новый элемент.
  2. Задается вопрос Familiya: и считывается имя.
  3. Задается вопрос God rozhdeniya: и считывается год рождения.
  4. Устанавливаются связи нового элемента со старым.
  5. Повторяется процесс до тех пор, пока не будет введен год рождения, равный 0.
  6. Устанавливается связь между последним и предпоследним элементами списка.
  7. В цикле, пока не будет введен символ 27, выполняется сортировка списка по году рождения.
  8. Если год рождения текущего элемента больше года рождения следующего, то элементы меняются местами.
  9. После завершения цикла, в tail хранится отсортированный список.
  10. Выводится сообщение Zavershit'? - <esc> и ожидается ввод.
  11. Если введен символ 27, то сортировка завершается.
  12. В head хранится отсортированный список.
  13. Все выделенные области памяти освобождаются.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы