помощь со вставкой на первой BST

голоса
1

EDIT там мало того, что мне не хватает !! ошибка все еще там

Так что я пытаюсь узнать, как закодировать свой первый BST, и это трудно .... Я уже возникли проблемы с помощью всего нескольких строк кода. проблема заключается во вставке, но я включил все, чтобы я мог получить некоторую обратную связь на мой стиль / другие ошибки. Я предложил использовать указатель на реализацию указателя, но мы узнали его нету, поэтому я не чувствую комфорт / знаю, как код еще.

ошибка

[trinhc@cs1 Assignment_3]$ g++ movieList.cpp -o a.out
/tmp/ccLw6nsv.o: In function `main':
movieList.cpp:(.text+0x7a): undefined reference to `Tree::Tree()'
movieList.cpp:(.text+0xa7): undefined reference to `Tree::insert(int, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
collect2: ld returned 1 exit status

файл tree.h

#ifndef TREE_H
#define TREE_H

#include <string>
#include <iostream>
using namespace std;

class Tree
{
 public:
  Tree();
  bool insert(int k, string s);

 private:
  struct Node
  {
    int key;
    string data;
    Node *left;
    Node *right;
  };
  Node* root;
  bool insert(Node*& root, int k, string s);
};

#endif

tree.cpp

#include <iostream>
#include tree.h
#include <stack>
#include <queue>
#include <string>
using namespace std;

Tree::Tree()
{
  root = NULL;
}

bool Tree::insert(int k, string s)
{
  return insert(root, k, s);
}

bool Tree::insert(Node*& current_root, int k, string s)
{
  if(root == NULL){
    current_root = new Node;
    current_root->key = k;
    current_root->data = s;
    current_root->left = NULL;
    current_root->right = NULL;
    return true;
  }
  else if (current_root->key == k)
    return false;
  else if (current_root->key > k)
    insert(current_root->left, k, s);
  else
    insert (current_root->right,k, s);
}

movieList.cpp

#include <iostream>
#include <stack>
#include <queue>
#include <string>
#include tree.h


using namespace std;

int main()
{
  Tree test;
  test.insert(100, blah);
  return 0;
}
Задан 27/04/2011 в 03:15
источник пользователем
На других языках...                            


4 ответов

голоса
2

Тест Tree (); не как определить объект класса Test, этот acutally объявить функцию с именем тест, который возвращает дерево.

пытаться

тест дерева; test.instert (100, "л"); возвращать 0;

Ответил 27/04/2011 в 03:34
источник пользователем

голоса
1

Пара пунктов:

Вы должны изменить имя своего члена переменного корня к чему-то else- я бы рекомендовал m_root или my_root или tree_root, или что-то из этих видов. Сейчас у вас есть немного пространства имен столкновения в любой функции, где вы включаете корень в качестве аргумента. Это также позволит вам отслеживать, какой именно корень вы имеете в виду.

bool Tree::insert(Node*& root, int k, string s)
{
    if(root == NULL){
        root = new Node;
        root->key = k;
        root->data = s;
        root->left = NULL;
        root->right = NULL;
        return true;
    } else
        if (root == k) //Comparison between pointer and number.
            return false;
        else
            if (root->key > k)
                insert(root->left, k, s);
            else
                insert (root->right,k, s);
    }

Вы должны изменить корень на комментировал линии Root-> ключ.

Кроме того, он выглядит, как он будет работать.

EDIT: Кроме того, что сказал другой парень. Вы объявляете объект как

TYPE name ()

если вы вызываете конструктор по умолчанию (), так что ваш код в основной функции должен быть

Tree test;
test.insert(...)
Ответил 27/04/2011 в 03:38
источник пользователем

голоса
1

Я скопировал некоторые из кода, и это работает хорошо для меня:

главный:

#include <iostream>
#include <stack>
#include <queue>
#include <string>
#include "tree.h"

    int main()
    {
      Tree test;
      test.insert(100, "blah");
      test.insert(50, "fifty");
      test.insert(110, "one hundred ten");
      return 0;
    }

Вставить функцию:

bool Tree::insert(Node*& currentRoot, int k, string s)
{
  if(currentRoot == NULL){
    currentRoot = new Node;
    currentRoot->key = k;
    currentRoot->data = s;
    currentRoot->left = NULL;
    currentRoot->right = NULL;
    return true;
  }
  else if (currentRoot->key == k)
    return false;
  else if (currentRoot->key > k)
    insert(currentRoot->left, k, s);
  else
    insert (currentRoot->right,k, s);
}

Кроме этого у вас есть синтаксические ошибки повсюду. Я также изменил название, потому что, как кто-то указал, там было немного проблемы именования. CurrentRoot имеет смысл, потому что вы передаете его корень левого или правого поддерева на каждой рекурсии.

Ответил 27/04/2011 в 03:39
источник пользователем

голоса
0

Вы не должны добавить tree.cppк вашей команде сборки?

[Trinhc @ cs1 Assignment_3] $ г ++ movieList.cpp -o a.out

Станет

[Trinhc @ cs1 Assignment_3] $ г ++ tree.cpp movieList.cpp -o a.out

Ответил 27/04/2011 в 05:01
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more