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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.09.2015, 14:46   #1
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию Что неправильно в двухсвязанном списке

Всем доброго дня!

Подскажите пожалуйста , что неправильно в классе Creator ?

Склоняюсь к неверному размещению класса Creator и Node

___________________________________ ____________

Код:
#include <stdio.h>
#include <conio.h>

class Node;

class Creator

{
	public:

	static Node *head,*term;
	static void Insert(int x)
	{
		if (!head) head = term = new Node(x,NULL,NULL);
		else head->Insert(x);
	}
	static void Show_1() {if (head) head->Show_1();}
	static void Show_2() {if (term) term->Show_2();}
};

Node * Creator :: head = 0;

Node * Creator :: term = 0;

class Node

{
	int a;
	Node *l;
	Node *r;

public:

	Node(int x,Node *lp,Node *rp) : a(x),l(lp),r(rp) {}
	~Node() {delete r; r = 0; }
	void Insert(int x)
	{
		if (x>a)
		{
			if (!r) Creator::term = r = new Node(x,this,NULL);
			else r -> Insert(x);
		}
		else 
		{
			if (!l) Creator::head = l = new Node(x,NULL,this);
			else 
			{
				Node *k = new Node(x,l,this);
				l -> r = k;
				l = k;
			}
		}
	}
	void Show_1() const
	{
		printf("%d ",a);
		if (r) r -> Show_1();
	}
	void Show_2() const
	{
		printf("%d ",a);
		if (l) l -> Show_2();
	}
};





int main()

{
	int x;

	for (int i=0;i<5;i++)
	{
		printf("\nx = ");
		scanf("%d",&x);
		Creator::Insert(x);
	}

	Creator::Show_1();
	printf("\n\n");
	Creator::Show_2();
	delete head;
    getch();
	return 0;
	
}
RAFA91 вне форума Ответить с цитированием
Старый 07.09.2015, 15:10   #2
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,087
По умолчанию

На первый взгляд всё должно работать, за исключением:
Код:
delete head;
ибо потерялся Creator::
Классы спроектированы неправильно с точки зрения здравого смысла, но откровенных ошибок в плане реализации не нашел.
pu4koff вне форума Ответить с цитированием
Старый 07.09.2015, 15:17   #3
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

head и term наверно не инициализированы.

А вообще да, классы стремные какие-то.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 07.09.2015, 15:28   #4
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
head и term наверно не инициализированы.

А вообще да, классы стремные какие-то.
Код:
Node * Creator :: head = NULL;

Node * Creator :: term = NULL;
может и стремные, только в чем проблема с точки зрений синтаксиса не могу понять

делал *head; и *term; глобальными , все работало.

может так нельзя ?

Код:
Creator::head

Creator::term

Последний раз редактировалось RAFA91; 07.09.2015 в 15:34.
RAFA91 вне форума Ответить с цитированием
Старый 07.09.2015, 16:37   #5
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,087
По умолчанию

Тут надо разносить нормально по h и cpp файлам.
Например, Creator не знает ничего про head->Show_1()
Просто перенести Node на пораньше не получится, т.к. там Creator::term
forward declaration для классов канает только на предмет указателей на класс. Т.е. можно благодаря этому написать static Node *head,*term;
а вот с head и term уже ничего делать нельзя, пока компилятор ничего не знает про полное описание Node.
Короче, этот код вообще не должен компилироваться походу. Creator - лишний класс. Node - это и элемент и список в одном лице. Двусвязному списку не нужно ни начало, ни конец, он сам по себе список. Я бы выкинул нафиг Creator, подправил под это дело Node и не парил себе мозг.
pu4koff вне форума Ответить с цитированием
Старый 07.09.2015, 17:00   #6
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию

Цитата:
Сообщение от pu4koff Посмотреть сообщение
Я бы выкинул нафиг Creator, подправил под это дело Node и не парил себе мозг.

так и сделал


Код:
#include <stdio.h>
#include <conio.h>



class Node

{
	int a;
	Node *l;
	Node *r;
	static Node *head;
	static Node *term;

public:

	Node(int x,Node *lp,Node *rp) : a(x),l(lp),r(rp) {}
	~Node() {delete r; r = 0; }
	void Insert(int x)
	{
		if (x>a)
		{
			if (!r) term = r = new Node(x,this,NULL);
			else r -> Insert(x);
		}
		else 
		{
			if (!l) head = l = new Node(x,NULL,this);
			else 
			{
				Node *k = new Node(x,l,this);
				l -> r = k;
				l = k;
			}
		}
	}
	void Show_1() const
	{
		printf("%d ",a);
		if (r) r -> Show_1();
	}
	void Show_2() const
	{
		printf("%d ",a);
		if (l) l -> Show_2();
	}
	static void Ins(int x)
	{
		if (!head) head = term = new Node(x,NULL,NULL);
		else head->Insert(x);
	}
	static void Sh_1() {if (head) head->Show_1();}
	static void Sh_2() {if (term) term->Show_2();}
};

Node * Node :: head = 0;
Node * Node :: term = 0;





int main()

{
	int x;

	for (int i=0;i<5;i++)
	{
		printf("\nx = ");
		scanf("%d",&x);
		Node::Ins(x);
	}

	Node::Sh_1();
	printf("\n\n");
	Node::Sh_2();
	
    getch();
	return 0;
	
}
*********************************** *******

малость переделал.

Код:
#include <stdio.h>
#include <conio.h>



class Node

{
	int a;
	Node *l;
	Node *r;

public:

	Node(int x,Node *lp,Node *rp) : a(x),l(lp),r(rp) {}
	~Node() {delete r; r = 0;}
	void Insert(int x,Node **head,Node **term)
	{
		if (x>a)
		{
			if (!r) *term = r = new Node(x,this,NULL);
			else r -> Insert(x,head,term);
		}
		else 
		{
			if (!l) *head = l = new Node(x,NULL,this);
			else 
			{
				Node *k = new Node(x,l,this);
				l -> r = k;
				l = k;
			}
		}
	}
	void Show_1() const
	{
		printf("%d ",a);
		if (r) r -> Show_1();
	}
	void Show_2() const
	{
		printf("%d ",a);
		if (l) l -> Show_2();
	}
};

class Creator

{
	Node *head,*term;

public:

	Creator() : head(NULL),term(NULL) {}
	~Creator() {delete head;}
	void Insert(int x)
	{
		if (!head) head = term = new Node(x,NULL,NULL);
		else head->Insert(x,&head,&term);
	}
	void Show_1() const {if (head) head->Show_1();}
	void Show_2() const {if (term) term->Show_2();}
};


int main()

{
	Creator *pC = new Creator;

	int x;

	for (int i=0;i<5;i++)
	{
		printf("\nx = ");
		scanf("%d",&x);
		pC->Insert(x);
	}

	pC->Show_1();
	printf("\n\n");
	pC->Show_2();

	delete pC;
	
    getch();
	return 0;
	
}

Последний раз редактировалось RAFA91; 08.09.2015 в 13:03.
RAFA91 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Что тут неправильно??? ser70 Qt и кроссплатформенное программирование С/С++ 10 28.03.2013 19:56
что делаю неправильно zidane007_06 БД в Delphi 2 10.05.2011 22:28
что неправильно в формуле olejaaa C++ Builder 1 08.04.2011 11:43
что неправильно? helavisa Общие вопросы C/C++ 18 02.06.2009 17:51