Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 04.05.2009, 23:48   #1
[MI_nor]
Пользователь
 
Регистрация: 03.11.2008
Сообщений: 94
По умолчанию Сортировка списка

Прошу помочь с сортировкой односвязного списка. Пытаюсь подогнать под пузырек, сравниваю 2 соседних элемента списка, если их нужно поменять местами, то ищется номер, по которому эти звенья стоят в списке, потом по этим-же номерам ищутся сами звенья 0_о(да-да, шайтан алгоритм), и меняются указатели на данные, т.е сам указатель next остается в порядке. Вот пример...
Код:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include <alloc.h>

typedef struct
	       { unsigned char name[25];
		 int num;
		 int time,uptime;
		 int tarif;
		 int deti;
	       } worker;
	struct LIST
	       {
		worker some,*some_ptr;
		LIST *next, *last;
	       };
LIST *root=NULL,*end=NULL;
LIST *list;
int kolvo=0;

void add_to_list( LIST *List, worker *some )
 {
 if( !root )
  {
  root = ( LIST * ) malloc ( sizeof(LIST) );
  List = end = root;

  memcpy( &List->some, some, sizeof(worker) );
  }
 else
  {
  List = end;
  List->next = ( LIST * ) malloc ( sizeof(LIST) );

  List = List->next;
  memcpy( &List->some, some, sizeof(worker) );

  end = List;
  kolvo++;
  }

 List->some_ptr = &List->some; // нацеливаем указатель на данные
 }


LIST *list_elm_ptr(LIST *List, int num )
{
 int sign=0, i=0;

 List = root;

 do
  {
  if( i==num ) break;
  List = List->next;
  if( sign ) break;
  i++;
  if( List==end )
   {
   sign = 1;
   continue;
   }
  } while( 1 );

 return List;
}

void change_list(LIST *List, int elm_a, int elm_b )
 {
 LIST *tmp, *change, *to;
 List=root;
 tmp = list_elm_ptr( List, elm_a );
 change = tmp;
 to = list_elm_ptr( List, elm_b );

 change->some_ptr=&to->some;
 to->some_ptr=&tmp->some;
 }
int find_elem(LIST *list, LIST *elem)
 {
  int find_num=0;
  list=root;
  int sign=0;

  do
  {
  if( list==elem ) break;
  list = list->next;
  if( sign ) break;
  find_num++;
  if( list==end )
   {
   sign = 1;
   continue;
   }
  } while( 1 );


  return find_num;
 }

LIST  *sort_list (LIST *list, int n)
{
int i,j,sign=0;
LIST *min;
list=root;
for (i=1;i<n;i++)
 {
  list=root;
  for (j=0;j<n-i;j++)
  {
   if (list->some_ptr->time < list->next->some_ptr->time)
    {
     change_list(list,find_elem(list,list),find_elem(list,list->next));
    }
   list=list->next;
  }
 }
}

void show_list( LIST *List )
 {
 int sign=0;
 List = root;

 do
  {
  printf( " [%3d ]", List->some_ptr->num );
  List = List->next;
  if( sign ) break;
  if( List==end )
   {
   sign = 1;
   continue;
   }
  } while( 1 );
 }


void main()
 {
  clrscr();
  int i,n; worker el;
  scanf ("%d",&n);
  for(i=0;i<n;i++)
   {scanf("%d",&el.num);
    add_to_list(list,&el);
   }
  show_list(sort_list(list,n));
  getch();
 }
[MI_nor] вне форума
Старый 05.05.2009, 04:12   #2
Nomlpppp
Пользователь
 
Регистрация: 26.02.2009
Сообщений: 51
По умолчанию

Что не получается? Сортирнуть пузырьком, пустяковая задача. Я конечно в код не вникал, но еа первый взгляд функция sort_list использует чистый алгоритм сортировки методом пузырька??? Там, где происходит перестановка элементов, без каких-либо выкрутасов, и есть пузырек.
Nomlpppp вне форума
Старый 05.05.2009, 11:23   #3
[MI_nor]
Пользователь
 
Регистрация: 03.11.2008
Сообщений: 94
По умолчанию

Но change_list перестанавилавет только 2 элемента с четко указанными номерами, а нужно сравнивать каждый с каждым и если уже меньше то менять по этим номерам
[MI_nor] вне форума
Старый 05.05.2009, 13:24   #4
Nomlpppp
Пользователь
 
Регистрация: 26.02.2009
Сообщений: 51
По умолчанию

if (list->some_ptr->time < list->next->some_ptr->time)

а эта строчка что делает?
Nomlpppp вне форума
Старый 05.05.2009, 13:34   #5
[MI_nor]
Пользователь
 
Регистрация: 03.11.2008
Сообщений: 94
По умолчанию

Ой, я извиняюсь, когда переделывал свою задачу под пример забыл видимо изменить. Там не time a num, но смысл в том что он сравнивает 2 соседних звена по числу num, если меньше меняет звенья местами
[MI_nor] вне форума
Старый 05.05.2009, 13:48   #6
Nomlpppp
Пользователь
 
Регистрация: 26.02.2009
Сообщений: 51
По умолчанию

Так, вник в код и врзник вопрос - зачем нукжна функция find_elm?
номер элемента, у тебя, j, а поменнять надо с j+1:
Код:
change_list(list, j, j+1);
Вроде так...
Nomlpppp вне форума
Старый 05.05.2009, 14:08   #7
[MI_nor]
Пользователь
 
Регистрация: 03.11.2008
Сообщений: 94
По умолчанию

Все равно не сортирует, в добавок затирает часть звеньев
[MI_nor] вне форума
Старый 05.05.2009, 14:21   #8
Nomlpppp
Пользователь
 
Регистрация: 26.02.2009
Сообщений: 51
По умолчанию

Код:
for (i=1;i<n;i++)
 {
  list=root;
  for (j=0;j<n-i;j++)
  {
   if (list->some_ptr->time < list->next->some_ptr->time)
    {
     change_list(list,find_elem(list,list),find_elem(list,list->next));
    }
   list=list->next;
  }
 }
Помоему ты неправильно организовал перебор элементов списка.
Nomlpppp вне форума
Старый 05.05.2009, 14:28   #9
[MI_nor]
Пользователь
 
Регистрация: 03.11.2008
Сообщений: 94
По умолчанию

Сравниваем соседние элементы, если меньше меняем, потом сдвигаем список на 1, если конец по жи возвращаемся в начало списка и.т.д...
[MI_nor] вне форума
Старый 05.05.2009, 15:27   #10
Nomlpppp
Пользователь
 
Регистрация: 26.02.2009
Сообщений: 51
По умолчанию

Ошибочка в функции change_list
Код:
void change_list( LIST *List, int elm_a, int elm_b )
 {
 LIST temp, *tmp=&temp, *change, *to;

 change = list_elm_ptr( List, elm_a );      // находим в памяти elm_a  
 to = list_elm_ptr( List, elm_b );        // находим в памяти elm_b 

 // перненацеливаем указатель на данные
 tmp->some_ptr = change->some_ptr;

 change->some_ptr = to->some_ptr;
 to->some_ptr = tmp->some_ptr;  
 }
так правильнее.

и
Код:
 for( i=0; i<n; i++ )
  {
  List = first;
  for( j=0; j<n-1; j++ )
   {
   if( List->some_ptr->price > List->next->some_ptr->price )
    {
    change_list( List, j, j+1 );
    }
    List = List->next;
   }
  }
Nomlpppp вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
сортировка списка Cdevelop Общие вопросы C/C++ 4 23.03.2009 21:25
Сортировка списка Gonzo Помощь студентам 5 11.03.2009 11:08
Сортировка списка... Arkuz Помощь студентам 2 11.05.2008 00:53
Сортировка списка... Arkuz Компоненты Delphi 4 03.05.2008 23:21
Сортировка списка Александр из Перми Microsoft Office Excel 3 27.01.2007 22:46