Здравствуйте!
Вообще задача предполагает из себя много подпрограмм для работы с бин.деревом(поиск и удаление\копия дерева\ все обходы и т.д), но у меня проблема с созданием копии дерева.
Скину весь код, создает бин.дерево заполенное ранд. числами, проблема в самой последней подпрограмме "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));
}
Т.е сейчас она уже компилируется но при выполнении ошибка прав доступа записи по адресу.