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

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

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

Доброго дня! Помогите, пожалуйста, разобраться, что я делаю не так. Задание: разработать программу для создания и работы с двусвязным списком, состоящим из структур. Структура содержит фамилию, год рождения. Добавлять новые записи так, чтобы список был упорядочен по возрасту. Функции для создания, просмотра и добавления записи в конец списка написаны и работают. А вот с сортировкой беда. Программа, похоже, зацикливается... Вот что у меня получилось
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;
         }
В этом случае сразу возникает ошибка "Lvalue required" в строках с name. Компиляция предполагается в Borland C. P.S. Еще буду очень благодарна, если дадите полезную ссылку, чтобы научиться отладке программ

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

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, которая выполняет сортировку двусвязного списка.

  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
Похожие ответы