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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.11.2008, 14:32   #1
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
Восклицание Сортировка кольцевого списка

есть класс реализующий кольцевой список

Код:
class Node  {    

	Ring *ring;
	int countStr;       // kol-vo strok v kolce

public:
	...
  	
	void SortRing ();  // сортировка
	
};

class Ring {

	char *str;    // stroka
	int length;   // dlina stroki
   
public:
	
	Ring *Next;
	Ring *Prev;
            ...
};
надо отсортировать список в алфавитном порядке строк


пробовал так но не получается. почему?

Код:
void Node::SortRing ()

{
	Ring *buff,*val,*val2;

	val=ring;
	for(int i=0;i<countStr-1;i++)
		
	{   
		val2=val->Next;
		for(int j=i;j<countStr;j++)

		{
						
		if( strcmp(val2->GetStr(),val->GetStr())<0 )

			{
				buff=ring;
				ring=ring->Next;
				ring->Next=buff;
			}
		
		val2=val2->Next;
		}
    
		val=val->Next;
	}
	
}
Код:
void main()	

{
	int n; // kol-vo kolec
	
	do {
	cout<<"\nVvedite kolichestvo spiskov : ";
	cin>>n;

	 if (n<=0 || n>30)

	  {
		Exception();
	  }

	} while (n<=0 || n>30);

	cout<<"\nVvedite put' k ishodnomu failu : "; // списки заполняем из файла
	char str[15];
	cin>>str;

	Node *A=new Node[n];
	
	for(int i=0;i<n;i++)

	{	  	
		// тут создаем списки
	}

	for(int i=0;i<n;i++)

	{
		A[i].SortRing(); // тут пытаемся их сортировать
		A[i].FileWrite("C:\\SortRing.txt");  // результат пишем в файл
	}
	
}
counter вне форума Ответить с цитированием
Старый 27.11.2008, 17:02   #2
theos
Форумчанин
 
Аватар для theos
 
Регистрация: 10.12.2007
Сообщений: 158
По умолчанию

В тот момент, когда Вы меняете 2 элемента местами, позаботьтесь о присвоении каждому корректных указателей как Next, так и Prev. Иначе у вас список весь рушится.

Далее обратите внимание, что если вы корректно поменяли местами элементы, то val2->Next будет уже далеко не тем, что вы ожидаете. ))
theos вне форума Ответить с цитированием
Старый 28.11.2008, 09:58   #3
Ламер_001
Ну и что? :)
Форумчанин
 
Регистрация: 20.10.2008
Сообщений: 129
По умолчанию

а не проще сначала отсортировать, а потом создать?
Учиться, учиться и еще раз учиться
Ламер_001 вне форума Ответить с цитированием
Старый 28.11.2008, 18:33   #4
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

Цитата:
Сообщение от theos Посмотреть сообщение
В тот момент, когда Вы меняете 2 элемента местами, позаботьтесь о присвоении каждому корректных указателей как Next, так и Prev. Иначе у вас список весь рушится.

Далее обратите внимание, что если вы корректно поменяли местами элементы, то val2->Next будет уже далеко не тем, что вы ожидаете. ))

может у вас есть ссылка где есть нечто подобное?
counter вне форума Ответить с цитированием
Старый 28.11.2008, 18:42   #5
theos
Форумчанин
 
Аватар для theos
 
Регистрация: 10.12.2007
Сообщений: 158
По умолчанию

У меня дома где-то валяются полностью реализованые списки (одно- и двусвязные), ещё со времён 2 курса универа. Если очень надо, могу сегодня вечером порыться и выложить. А сейчас с работы в падлу писать - долго. Попробуйте всё же сами отладить. Это полезно сделать хотя бы раз в жизни самому )) Для полного понимания.
theos вне форума Ответить с цитированием
Старый 29.11.2008, 01:15   #6
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
Вопрос

А в принципе ход моих мыслей правилен?
counter вне форума Ответить с цитированием
Старый 30.11.2008, 00:15   #7
theos
Форумчанин
 
Аватар для theos
 
Регистрация: 10.12.2007
Сообщений: 158
По умолчанию

Так. Ну во 1х исходя из смысла классов их имена надо поменять местами )) Так Node - "вершина" - как раз базовый элемент из которого строится кольцо. А Ring - весь список.

Это не существенно, как и следующее: выводить результаты всё же лучше в разные файлы

Теперь по существу. Как я понимаю в переменной Ring *ring хранится рут элемент (0й, от которого надо сортировать..). Сортировка пузырьком, в ней: в переменной val - i-й элемент (отсчитывая от ring), в val2 - j-й. Тогда:

Внутренний цикл начинаем не с i-го элемента, а с (i+1)-го. Обязаьтельно. Это логически верно, тк хотя мы и не используем j, получается 1 лишняя итерация при которой мы захватываем 0й элемент ещё раз.

Процедура перемены мест элементов:

Код:
val2->Prev = val->Prev;
buff = val2->Next;
val2->Next = val;
val->Prev = val2;
val->Next = buff;
buff = val;
val = val2;
val2 = buff;
Примерно так. Прогу компилить не пробовал, но вроде должно работать с этими изменениями. Попробуйте, если не получится - будем значит компилить и отлаживать.
theos вне форума Ответить с цитированием
Старый 30.11.2008, 23:53   #8
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

вот додумал еще немного


Код:
void Node::SortRing ()

{

	Ring *first,*second,*buff1,*buff2,*buff3;

	first=ring;
    second=ring->Next;

	for(int i=0;i<countStr-1;i++)

	{
		buff3=first;
		for(int j=i+1;j<countStr;j++)

		{
			buff2=second;
			if( strcmp(first->GetStr(),second->GetStr())>0 )

			{
				buff1=first;

				first=second;

				first->Prev=buff1->Prev;

				buff1->Next=second->Next;
				buff1->Prev=first;

				second=buff1;
				first->Next=second;

				second=first->Next;
				
				buff1=first;        // ????????????
				first=buff1;        // ????????????
			}

			else

			{
				second=buff2->Next; // ?????????????
				first=buff3;               // ?????????????
			}
		}

		first=buff3->Next;  // ?????????????????????
	}
}

сама замена элементов происходит правильно указатели тоже корректны.

Я только не знаю как быть с указателями first и second когда они выходят из циклов.
counter вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка линейного списка. ТИВ Паскаль, Turbo Pascal, PascalABC.NET 3 23.11.2008 22:39
Вывод кольцевого списка в обратном порядке parinoff Паскаль, Turbo Pascal, PascalABC.NET 5 22.11.2008 12:03
Сортировка списка... Arkuz Помощь студентам 2 11.05.2008 00:53
Сортировка списка... Arkuz Компоненты Delphi 4 03.05.2008 23:21
Сортировка списка Александр из Перми Microsoft Office Excel 3 27.01.2007 22:46