2013-12-02 4 views
0

Я получаю сообщение об ошибке при вставке в дерево AVL. Программа выходит из строя, когда она входит в функцию вставки. Я читаю некоторые имена файлов из текстового файла и передаю их в эту функцию insert_data, которая затем вызывает insert_node. Это мои функцииОшибка при вставке в дерево AVL

void DataStructure::insert_data(char * &fileName, long int address) 
{ 
    this->root = this->insert_node(this->root, fileName, address); 
} 


node * DataStructure::insert_node(node *t, char * &file_name, long int address) 
    { 
     if(t==NULL) 
{ 
    t = new node; 
    t->address = address; 
    strcpy(t->buffer, file_name); 
    t->height = 0; 
    t->left = NULL; 
    t->right = NULL; 
} 
else if(atoi(file_name) < atoi(t->buffer)) 
{ 
    t->left = insert_node(t->left, file_name, address); 
    if(get_height(t->left) - get_height(t->right) == 2) 
    { 
     if(atoi(file_name) < atoi(t->left->buffer)) 
      t=SingleRotationLeft(t); 
     else 
      t=DoubleRotationLeft(t); 
    } 
} 
else if(atoi(file_name) > atoi(t->buffer)) 
{ 
    t->right = insert_node(t->right, file_name, address); 
    if(get_height(t->right) - get_height(t->left) == 2) 
    { 
     if(atoi(file_name) > atoi(t->right->buffer)) 
      t= SingleRotationRight(t); 
     else 
      t=DoubleRotationRight(t); 
    } 
} 

t->height = max_height(get_height(t->left), get_height(t->right)) + 1; 
return t; 
} 

и моя строительная функция

DataStructure::DataStructure(void) 
{ 
    root = NULL; 
} 
+0

'strcpy (t-> buffer, file_name);' это кажется неправильным. Каков размер t-> buffer? – andre

+0

Как определяется «узел»? В частности, это 'buffer' массив' char' или только указатель? – simonc

+0

node - это структура struct node {char * buffer; long int address } – chaudrhy

ответ

0
strcpy(t->buffer, file_name); 

пишет на неинициализированный указатель. Вы должны выделить память для buffer. Если вы на Posix-совместимой системе, самый простой способ сделать это с помощью strdup

t->buffer = strdup(file_name); 

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

t->buffer = malloc(strlen(file_name)+1); 
strcpy(t->buffer, file_name); 

В любом случае, вы 'необходимо, чтобы free(t->buffer), когда вы освобождаете память для каждого node

Смежные вопросы