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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 31.12.2008, 01:44   #1
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию слияние списков

задание такое было: создать n списков и слить их в один сортированный.
списки - двухсвязные
класс

Код:
class Node  {    

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

public:
	...
	void Merge(Node A);
};
в майне массив списков объявляю так

Код:
void main ()

{ 
	Node *A=NULL;
    
 // создаю списки

     Sliv(A,n);	// сливаю
	...
}
в Merge(Node A) списки передаю так

Код:
void Sliv (Node *A,int n) // передаю массив списков

{
	A[0].SortRing();
	for(int i=1;i<n;i++)

	{
		A[0].Merge(A[i]); // заливаю все списки поочереди в А[0]
	}
	
}
сливаю так:

Код:
void Node::Merge(Node A)

{
	Ring *beginThis,*elemThis,*beginNode,*elemNode,*elem1Node;

	beginNode=A.ring;
	elemNode=A.ring;
	beginThis=ring;
		
	do { // перебирает список А

		elem1Node=elemNode;
		elemThis=ring;
		do // перебирает список this
		{
		if(strcmp(elemNode->GetStr(),elemThis->GetStr())<=0)

			{ // если строка из списка А меньше либо равна строке из списка this то вставляем ее перед строкой из списка this
				if(elemThis==ring)

				{
					ring=elemNode;
					beginThis=ring;
				}

				           elemNode->Prev=elemThis->Prev;
					elemThis->Prev->Next=elemNode;
					elemNode->Next=elemThis;
				           elemThis->Prev=elemNode;
					
					elemNode=elem1Node->Next;
					elem1Node=elemNode;
					elemThis=ring;
			}

			else

			{// иначе движемся по списку дальше
				elemThis=elemThis->Next;
			}
	
		} while(elemThis!=beginThis);
		
		
		// если строка из списка А больше строки из  списка this то вставляем ее в конец списка this
		elemThis->Prev->Next=elemNode;
		elemNode->Prev=elemThis->Prev->Next;
		elemNode->Next=elemThis;
		elemThis->Prev=elemNode;
			
		elemNode=elem1Node->Next;// берем следующую строку из A
	} while(elemNode!=beginNode);
}
в функции Merge(Node A) происходит изменение списка А в результате чего получается ерунда.

подскажите как сделать так чтобы список А не изменялся , а просто из него копировались элементы в this

Последний раз редактировалось counter; 31.12.2008 в 01:48.
counter вне форума Ответить с цитированием
Старый 31.12.2008, 12:02   #2
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Массив списков обьявляется не так.
Код:
Node *A = NULL;   //Один элемент
Node **A;           //Массив элементов, каждый элемент будущий список
Чтобы ерунда не получалась делайте так
Код:
Node *tempNode = firstNode;    //берем какой-то временный указатель и присваиваем ему указатель на первый элемент добавляемого списка.
Так стоит делать не только в процедуре сливания, а и вообще везде. Так фактически ваш список не меняется. Просто значения копируются.
MaTBeu вне форума Ответить с цитированием
Старый 31.12.2008, 14:59   #3
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

Цитата:
Массив списков обьявляется не так.
Код:
Node *A = NULL;   //Один элемент
Node **A;           //Массив элементов, каждый элемент будущий список
я делаю так

Код:
Node *A=NULL;
A=new Node[n];
	
	for(int i=0;i<n;i++)

	{	  	
	    A[i].CreateNode(i,str);
	}

Цитата:
Чтобы ерунда не получалась делайте так
Код:
Node *tempNode = firstNode;    //берем какой-то временный указатель и присваиваем ему указатель на первый элемент добавляемого списка.
так тоже делал но ничего не выходит

как сделать так чтобы в функции Merge(Node A) исходный список не А изменялся? как передать его в эту функцию? заранее спасибо

вообще массив выглядит примерно так (т.е. А[i] - отдельный список)
Изображения
Тип файла: jpg 00.jpg (20.5 Кб, 126 просмотров)
counter вне форума Ответить с цитированием
Старый 02.01.2009, 16:25   #4
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Node - это узел. Или элемент списка, насколько я знаю. А вот что такое Ring? В функцию надо передавать УКАЗАТЕЛЬ, а вы передаете копию узла.
Покажите реализацию всех классов, а то так не разберешься.
MaTBeu вне форума Ответить с цитированием
Старый 02.01.2009, 22:47   #5
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

Это описание классов

Ring :

Код:
class Ring {

	char *str;    // stroka
	int length;   // dlina stroki
           int strID;     // nomer stroki

public:
	
	Ring *Next;
	Ring *Prev;
	...	
};
Node :

Код:
class Node  {    

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

public:
	...
};
задачу я решил так:

сначала записываю содержимое элемента списка в отдельную переменную, а потом при вставке этого содержимого выделяю память для этого элемента в результирующем списке

Код:
void Node::Merge(Node A)

{
	Ring *beginThis,*elemThis,*p,*beginNode,*elemNode,*elem1Node;
		
	beginNode=A.ring;
	elemNode=A.ring;
	beginThis=ring;
	Ring S;
	int flag;
	
	do {
		elemThis=ring;
		do {
			flag=0;
			S=*elemNode;
			if(strcmp(S.GetStr(),elemThis->GetStr())<=0)

			{
				elem1Node=new Ring;
		                      *elem1Node=S;
				
				if(elemThis==ring)

				{
					ring=elem1Node;
					beginThis=ring;
				}
				
				p=elemThis->Prev;
				elem1Node->Prev=p;
				p->Next=elem1Node;
				elem1Node->Next=elemThis;
				elemThis->Prev=elem1Node;
              	
				elemNode=elemNode->Next;
				S=*elemNode;
				elemThis=ring;
				flag=1;
			}
			
			else

			{
				elemThis=elemThis->Next;
			}
					
		} while(elemThis!=beginThis);

		if(flag==0)

		 {
		   // esli element iz Node bol'she chem vse ostal'noe v This
		   elem1Node=new Ring;
		   *elem1Node=S;
		   p=elemThis->Prev;
		   elem1Node->Prev=p;
		   p->Next=elem1Node;
		   elem1Node->Next=elemThis;
		   elemThis->Prev=elem1Node;
		
		   elemNode=elemNode->Next;
	        }
	
	} while(elemNode!=beginNode);
}

вот так.

Если есть более рациональные предложения - готов выслушать.
counter вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Слияние нескольких wav файлов lacost Мультимедиа в Delphi 1 30.09.2008 19:25
Помогите сделать слияние! Adm Microsoft Office Word 1 17.04.2008 08:43
Естественное слияние в массивах Virus-Haker Помощь студентам 2 07.02.2008 13:40
Слияние в Ворде. Peter86 Microsoft Office Word 1 15.10.2007 09:46
Объединение, пересечение, слияние массивов -=Domestos=- Помощь студентам 6 25.12.2006 21:06