Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Пользователь


Сообщения: 79
Благодарности: 1

Профиль | Отправить PM | Цитировать


Ещё вопрос, теперь по сортировке.
Необходимо отсортировать двухсвязанный список в порядке возрастания по элементу sps->expert с помощью функции form1().
Допустим есть изначально следующий список (функция views()):

| expert | family | ochki |
|--------------------------------|
| 7 | krotov | 3 |
| 7 | popov | 2 |
| 7 | sidopov | 1 |
| 2 | semenov | 3 |
| 2 | sidopov | 2 |
| 2 | ivanov | 1 |
| 4 | sidorov | 3 |
| 4 | chein | 2 |
| 4 | petrov | 1 |
|--------------------------------|
Необходимо получить вот такой следующий:

expert | family | ochki |
|--------------------------------|
| 2 | semenov | 3 |
| 2 | sidopov | 2 |
| 2 | ivanov | 1 |
| 4 | sidorov | 3 |
| 4 | chein | 2 |
| 4 | petrov | 1 |
| 7 | krotov | 3 |
| 7 | popov | 2 |
| 7 | sidopov | 1 |
|--------------------------------|
Получается такой:
expert | family | ochki |
|--------------------------------|
| 7 | krotov | 3 |
| 7 | popov | 2 |
| 7 | sidopov | 1 |
|--------------------------------|
В чём моя ошибка? Помогите разобраться.
Код: Выделить весь код
#define TRUE 1
#define FALSE 0

......

struct expt{int expert;char sport[20];int mesto;};
struct record{expt sps; record *prior;record *next;}*begin,*last,*list;
.......

void form1()
{
int is_sort=FALSE;  
if(begin==NULL){clrscr();printf("Spisok not avialible.\n Press any key... ");getch();return;} //если списка не существует, выходим
if(begin->next==NULL){clrscr();printf("One element of spisok.\n Press any key... ");getch();return;}//если один элемент списка, 
                                                                                                                                                            //зачем ,сортировать?
while(!is_sort){   //выход из цикла --  is_sort==TRUE. "Пробегаем" в цакле по списку, пока не отсортируем
is_sort=TRUE;      // предпологаем, что список уже отсортирован
for(last=begin;last->next!=NULL;){ //цикл существует, пока есть за указателем last есть следующий элемент
   list=last;
   last=last->next;
   if(list->sps.expert>last->sps.expert){ //если предыдущий элемент списка больше последующего
                                                              // то меняем указатели местами
   list->next=last->next;
   if(last->next==NULL);
   else last->next->prior=list;
   if(list->prior==NULL);
   else list->prior->next=last;
   last->prior=list->prior;
   last->next=list;
   list->prior=last;
   is_sort=FALSE;   // чтобы ещё раз просмотреть список и отсортировать, если, он не отсортирован
	}
}
}
}
.......

void main(){
begin=NULL;
last=NULL;
char c;
load(FILE_DB);
while(1){printmenu();
scanf("%s",&c);
switch(c){
   case '1':{clr("db1.dat");break;}
   case '2':{edit();break;}
   case '3':{views();break;}   //просматриваем содержимое списка в памяти
   case '4':{form1();break;}   //сортируем содержимое списка по элементу expert  структуры expt 
   case '0':return;
   default:{printf("\n Error !\n Can't no right selection item\n Press any key...");getch();break;}
}
}
}

Отправлено: 15:21, 18-05-2006 | #6