Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
Grechka62
0 / 0 / 0
Регистрация: 22.01.2014
Сообщений: 4
1

Сортировка двусвязного списка

22.01.2014, 21:18. Просмотров 1042. Ответов 4
Метки нет (Все метки)

Доброго дня!
Помогите, пожалуйста, разобраться, что я делаю не так.
Задание: разработать программу для создания и работы с двусвязным списком, состоящим из структур. Структура содержит фамилию, год рождения. Добавлять новые записи так, чтобы список был упорядочен по возрасту.

Функции для создания, просмотра и добавления записи в конец списка написаны и работают. А вот с сортировкой беда. Программа, похоже, зацикливается...
Вот что у меня получилось
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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);
Пробовала сделать и так
C
1
2
3
4
5
6
7
8
9
10
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. Еще буду очень благодарна, если дадите полезную ссылку, чтобы научиться отладке программ
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.01.2014, 21:18
Ответы с готовыми решениями:

Сортировка двусвязного списка
Не получается выполнить сортировку двусвязного списка методом пузырька. У меня...

Сортировка двусвязного списка пузырьком
Есть структура: struct stud{ char num; char tel; char name; int byear;...

Быстрая сортировка двусвязного списка
Уважаемые ! Продолжаются мое обучение, а с ним и появляются новые вопросы....

Сортировка двусвязного списка - исправить ошибку в коде
Попыталась осуществить сортировку списка, подскажите, пожалуйста, где ошибки в...

Из двусвязного списка в односвязный
Помогите пожалуйста переделать программу из двусвязного списка в односвязный...

4
nikolay1982
123 / 123 / 59
Регистрация: 22.01.2014
Сообщений: 447
23.01.2014, 21:49 2
Что такое temp?
Наверно у вас это структура, а не указатель.
Укажите типы данных temp,pred,p.
0
Grechka62
0 / 0 / 0
Регистрация: 22.01.2014
Сообщений: 4
23.01.2014, 22:26  [ТС] 3
temp тоже указатель. Хотя я пробовала и структурой его сделать, не получается так.
Вот все используемые переменные и указатели и сама функция полностью.
C
1
2
3
4
5
6
struct spis
{char name[20]; int year;
  struct spis *v1; // v1 – указатель на предыдущую структуру
  struct spis *v2; // v2 – указатель на последующую структуру
};
struct spis *head,*tail; // указатели на начало и конец списка
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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);
}
(В прошлом сообщении пропустила строку 19 (выделение памяти под новую структуру). Но с ней тоже ничего не меняется)
0
nikolay1982
123 / 123 / 59
Регистрация: 22.01.2014
Сообщений: 447
23.01.2014, 22:39 4
У вас задание "Добавлять новые записи так, чтобы список был упорядочен по возрасту.".
Если так делать, то сортировку делать не надо.
Вам надо написать функцию которая бы искала подходящее место вставки и вставлять новый элемент туда.
0
Grechka62
0 / 0 / 0
Регистрация: 22.01.2014
Сообщений: 4
25.01.2014, 16:03  [ТС] 5
Я понимаю, что задание должно бы в этом заключаться. Но нельзя же просто взять и добавить, если изначально список в беспорядке. Поэтому решила, что логичнее сделать сортировку после.

Или мне просто лучше предположить, что список сразу создается в правильном порядке?
0
25.01.2014, 16:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.01.2014, 16:03

Создание, правка, и сохранение двусвязного списка
Добрый день. Не судите строго, только учусь. нужно сделать программу для...

Сделать ввод и вывод двусвязного списка
Мне нужно сделать воод и вывод двусвязного списка. Вот что я сделал, но у меня...

Осуществить циклический сдвиг элементов двусвязного списка на k позиций вправо
Осуществить циклический сдвиг элементов двусвязного списка на k позиций вправо.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru