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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.05.2012, 21:29   #21
alezha
Форумчанин
 
Регистрация: 16.04.2011
Сообщений: 126
По умолчанию

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


struct der
{
	char inf;
	der *l,*r; // указатель на левое и правое поддерево
};

void del(der **,int );
der *sozd(der *);
void add(der *);
void out_tree(der *, int );
void inorder(struct der *);

void main(void)
{
	setlocale(LC_ALL,"Russian");
	der *dr;
	dr=NULL; // адрес корня бинарного дерева
	system("cls");
	char st;
	do
	{
		while(1)
		{
			puts("vid operatsii : \n 1- sozdat derevo");
			puts(" 2- oboiti derevo v simmetrichno poryadke");
			puts(" 3- Vyvod v vide perevernutogo dereva");
			puts(" 4- dobavlenie elementov v derevo");
			puts(" 5- udalenie lyubogo elementa iz dereva");
			puts(" 6-exit");
			fflush(stdin);
			switch(getch())
			{
			case '1': dr=sozd(dr); break;
			case '2': inorder(dr); break;
			case '3': out_tree(dr,0); getch(); break;
			case '4': add(dr); break;
			case '5': 
				printf("\n Vvedite chislo dlya udaleniya");
	fflush(stdin);
	scanf("%c",&st);
	del(&dr,st);   break;
			case '6': return;
			}
			system("cls");
		}
		printf("povtor y/n");
		fflush(stdin);
	}
	while(getch()=='y');
}
der *sozd(der *dr)  // создание бинарного дерева
{
	if (dr)
	{
		puts("Binarnoe derevo uzhe sozdano");
		return (dr);
	}
	if (!(dr=(der*)calloc(1,sizeof(der))))
	{
		puts("Net svobodnoi pamyati");
		getch();
		return NULL;
	}
	puts("Vvedite informatsiyu v koren dereva");
	fflush(stdin);
	scanf("%c",&dr->inf);
	return dr;
}
void add(der *dr)  // функция добавления узлов в бинарное дерево
{
	der *dr1,*dr2;
	int k; // результат сравнения двух строк
	int ind, st;
	if (!dr)
	{
		puts("Net kornya dereva \n");
		getch();
		return;
	}
	do
	{
		puts("Vvedite informatsiyu v ocherednoi uzel dereva (0 - exit)");
		fflush(stdin);
		scanf("%с",&st);
		if(st=='0') return; // выход в функцию main
		dr1=dr;
		ind=0; // 1 - признак выхода из цикла поиска
		do
		{
			if(!(k=st-dr1->inf))
				ind=1; // для выхода из цикла do ... while
			else
			{
				if (k<0) // введ. строка < строки в анализируемом узле
				{
					if (dr1->l) dr1=dr1->l; // считываем новый узел дерева
					else ind=1; // выход из цикла do ... while
				}
				else // введ. строка > строки в анализируемом узле
				{ 
					if (dr1->r) 
						dr1=dr1->r; // считываем новый узел дерева
					else ind=1; // выход из цикла do ... while
				}
			}
		}
		while(ind==0);
		if (k) // не найден узел с аналогичной информацией
		{
			if (!(dr2=(struct der *) calloc(1,sizeof(struct der))))
			{
				puts("Net svobodnoi pamyati");
				return;
			}
			if (k<0) dr1->l=dr2; // ссылка в dr1 налево
			else dr1->r=dr2; // ............ направо
			dr2->inf=st; // заполнение нового узла dr2
		}
	}
	while(1); // любое условие т.к. выход из цикло по return
}
void del(der **dr,int st)  // функция удаления узла дерева
{
	if(!*dr)
	{
		printf("\n Derevo pustoe");
		return;
	}
	if(st<(*dr)->inf) del(&(*dr)->l,st);
	else if(st>(*dr)->inf) del(&(*dr)->r,st);
	else 
	{
		der *lt, *rt;
		lt=(*dr)->l;
		rt=(*dr)->r;
		free(*dr);
		*dr=rt;
		while(*dr)
			dr=&(*dr)->l;
		*dr=lt;
	}
}
void out_tree(der *dr1, int level) //функиця вывода дерева
{
	if(dr1)							//пока dr не равен нулю
	{
		out_tree(dr1->r,level+1);
		for(int i=0; i<level; i++)	//обозначение уровня
			printf("        ");
		printf("   ____\n");
		for(i=0; i<level; i++)
			printf("        ");
		printf("->| %с|\n",dr1->inf);
		for(i=0; i<level; i++)
			printf("        ");
		printf("  |____|\n");
		out_tree(dr1->l,level+1);

	}
	
}
void inorder(struct der *root)
{
  if(!root) return;
  inorder(root->l);
  if(root->inf) printf("%с", root->inf);
  inorder(root->r);
}

Последний раз редактировалось alezha; 27.05.2012 в 21:32.
alezha вне форума Ответить с цитированием
Старый 28.05.2012, 00:08   #22
Вечный_студент
Пользователь
 
Аватар для Вечный_студент
 
Регистрация: 11.11.2011
Сообщений: 45
По умолчанию

в этом случае кода, нет выхода из цикла добавления нового аргумента.
он читает 0 как символ, а не цифру.
и на сколько понял символы и цифры(у меня по крайней мере) отображаются неверно (буквой ё)
Крепкая стена строится из маленьких кирпичей.
Но если положил первый кирпич криво, как ни старайся, стена кривой будет.
Вечный_студент вне форума Ответить с цитированием
Старый 28.05.2012, 01:26   #23
Вечный_студент
Пользователь
 
Аватар для Вечный_студент
 
Регистрация: 11.11.2011
Сообщений: 45
По умолчанию

вобщем я разобрался полностью в коде
смущает только строчка
Код:
while(getch()=='y');
зачем она?
что делает?
и почему без неё ошибка
Код:
Cpp1.cpp(67) : error C2059: syntax error : '}'
Крепкая стена строится из маленьких кирпичей.
Но если положил первый кирпич криво, как ни старайся, стена кривой будет.
Вечный_студент вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
бинарное дерево NewNub Общие вопросы Delphi 1 05.12.2011 15:10
Бинарное дерево С++ Dfoer Фриланс 1 02.12.2011 12:49
бинарное дерево Lucefer2007 Общие вопросы C/C++ 0 17.04.2011 14:31
бинарное дерево С++ mego4el Помощь студентам 0 15.03.2011 20:47
Бинарное дерево lubafffka Общие вопросы C/C++ 0 29.04.2009 12:28