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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.05.2014, 14:38   #1
jihot
Начинающий кодер
Пользователь
 
Аватар для jihot
 
Регистрация: 26.01.2010
Сообщений: 72
По умолчанию Бинарное дерево поиска(создание копии)

Здравствуйте!

Вообще задача предполагает из себя много подпрограмм для работы с бин.деревом(поиск и удаление\копия дерева\ все обходы и т.д), но у меня проблема с созданием копии дерева.

Скину весь код, создает бин.дерево заполенное ранд. числами, проблема в самой последней подпрограмме "dublicate". Плохо я разбираюсь с указателями

Спасибо!
Код:
#pragma argsused
#include <stdafx.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

//-------------------------------------------------------- Binary Search Tree

struct BST {
	int data;
	struct BST *left;
	struct BST *right;
};

//-------------------------------------------------------- short pointer name
typedef struct BST Tree;
typedef Tree *TreePtr;
//-------------------------------------------------------- function prototypes
void insert(TreePtr*, int);
void output_all(TreePtr);
void output_pryam(TreePtr);
void output_obr(TreePtr);
void output_konc(TreePtr);
void search(TreePtr, int);
void dublicate(TreePtr, TreePtr*);
//-------------------------------------------------------- Main programm

int main(int argc, char* argv[])
{
	unsigned int n, i, search_elem;
	int *array;                                       // array of numbers
	TreePtr RootPtr = NULL;                           // root element
	TreePtr CopyRoot = NULL;
	printf("Input nubmer of elements: ");
	scanf("%i", &n);                                  // nubmer of elements
	array = (int*)calloc(n, sizeof(int));            // array memory
	printf("Input your array of %i elements:\n", n);
	srand(time(NULL));
	for (i = 0; i<n; i++)
	{
		array[i] = rand();							// reading values
		insert(&RootPtr, array[i]);                // value into tree
	}
	free(array);     // free array memory + clear console
	output_all(RootPtr);
	scanf("%d", &search_elem);
	search(RootPtr, search_elem);
	dublicate(RootPtr, &CopyRoot);
	system("pause");
	return 0;
}

//-------------------------------------------------------- function: INSERT
// inserting 'data' into free leaf of tree with root '*ptr'

void insert(TreePtr *ptr, int data)
{
	if (*ptr == NULL)
	{
		*ptr = (TreePtr)malloc(sizeof(Tree));
		if (*ptr != NULL)
		{
			(*ptr)->data = data;
			(*ptr)->left = NULL;
			(*ptr)->right = NULL;
		}
		else
			printf("%i not inserted. No memory available. \n", data);
	}
	else
	if (data < (*ptr)->data)
		insert(&((*ptr)->left), data);
	else
		insert(&((*ptr)->right), data);

}

//-------------------------------------------------------- function: OUTPUT
// infix_traverse for tree with root 'ptr'
void output_all(TreePtr ptr)
{

	system("cls");
	printf("Pryamoy obhod : \n");
	output_pryam(ptr);
	printf("\nObratniy obhod : \n");
	output_obr(ptr);                                  // printing elements
	printf("\nKoncevoy obhod : \n");
	output_konc(ptr);
}
void output_pryam(TreePtr ptr)
{
	if (ptr != NULL)
	{
		printf("%i \n", ptr->data);
		output_obr(ptr->left);
		output_obr(ptr->right);
	}
}

void output_obr(TreePtr ptr)
{
	if (ptr != NULL)
	{
		output_obr(ptr->left);
		printf("%i \n", ptr->data);
		output_obr(ptr->right);
	}
}

void output_konc(TreePtr ptr)
{
	if (ptr != NULL)
	{
		output_obr(ptr->left);
		output_obr(ptr->right);
		printf("%i \n", ptr->data);
	}
}


void search(TreePtr ptr, int element)
{
	if (ptr != NULL) {
	 search(ptr->left, element);
	 if (ptr->data == element) {
		 printf("\nElement %d founded and deleted\n", element); ptr->data = NULL;
		 system("pause");
		 output_all(ptr);
	 }
	 search(ptr->right, element);
 }
}

void dublicate(TreePtr ptr, TreePtr *copy)
{
	if (ptr == NULL){
		*copy = NULL;
		return;
	}
	(*copy)->data = ptr->data;
	dublicate(ptr->left, (*copy)->left);
	dublicate(ptr->right, (*copy)->right);
}

Код:
Ошибка	4	error C2227: выражение слева от "->left" должно указывать на тип класса, структуры или объединения либо на универсальный тип
Ошибка	5	error C2660: dublicate: функция не принимает 1 аргументов
Ошибка	6	error C2227: выражение слева от "->right" должно указывать на тип класса, структуры или объединения либо на универсальный тип
Ошибка	7	error C2660: dublicate: функция не принимает 1 аргументов

UPD: Постарался понять, что говорил компилятор, исправил подпрограмму:
Код:
void dublicate(TreePtr ptr, TreePtr *copy)
{
	if (ptr == NULL){
		*copy = NULL;
		return;
	}
	(*copy)->data = ptr->data;
	dublicate(ptr->left, &((*copy)->left));
	dublicate(ptr->right, &((*copy)->right));
}
Т.е сейчас она уже компилируется но при выполнении ошибка прав доступа записи по адресу.
with love ^.^

Последний раз редактировалось jihot; 25.05.2014 в 15:01.
jihot вне форума Ответить с цитированием
Старый 25.05.2014, 15:14   #2
jihot
Начинающий кодер
Пользователь
 
Аватар для jihot
 
Регистрация: 26.01.2010
Сообщений: 72
По умолчанию

Видимо нужно было просто выделить память...
Код:
void dublicate(TreePtr ptr, TreePtr *copy)
{
	if (ptr == NULL){
		*copy = NULL;
		return;
	}
	*copy = (TreePtr)malloc(sizeof(Tree));
	(*copy)->data = ptr->data;
	dublicate(ptr->left, &((*copy)->left));
	dublicate(ptr->right, &((*copy)->right));
}
with love ^.^
jihot вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Бинарное дерево поиска Леопольдовна Помощь студентам 0 18.04.2013 23:21
Бинарное дерево поиска C++ Transcend Помощь студентам 2 01.04.2013 14:51
Бинарное дерево поиска С++ vadiprog Помощь студентам 1 06.05.2012 21:47
Бинарное дерево поиска Orli Общие вопросы C/C++ 1 15.12.2011 21:27