pomoc s vložkou na prvním BST

hlasů
1

EDIT tu drobnost, že jsem chybí !! chyba je stále ještě

Takže já jsem se snaží naučit, jak kódovat svůj první BST, a to je těžké .... Už jsem potíže s jen pár řádků kódu. Problém je ve vložce, ale jsem zařadil všechno tak, že bych mohl dostat nějakou zpětnou vazbu na můj styl / jiné chyby. Byl jsem navrhl použít ukazatel na realizaci ukazatele, ale my havent ještě nenaučili to, takže já dont pocit pohodlí / vědět, jak ji ještě kód.

chyba je

[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

Soubor 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;
}
Položena 27/04/2011 v 03:15
zdroj uživatelem
V jiných jazycích...                            


4 odpovědí

hlasů
2

Strom test (); není, jak definovat objekt třídy test, to acutally deklarovat funkci pojmenovanou test, který vrací strom.

Snaž se

Strom testu; test.instert (100, "bla"); return 0;

Odpovězeno 27/04/2011 v 03:34
zdroj uživatelem

hlasů
1

Pár bodů:

Musíte změnit název proměnné kořene člen něco jinde bych doporučil m_root nebo my_root nebo tree_root, nebo něco z těchto druhů. Právě teď máte trochu jmenného prostoru střetu v jakékoliv funkci, kam patří kořen jako argument. To vám dovolí sledovat, které kořen máte na mysli.

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);
    }

Je třeba změnit kořen na komentářem řádku root-> klíč.

Jiné, než to, že to vypadá, že to bude fungovat.

EDIT: Také to, co říká ten druhý. Deklarovat objekt jako

TYPE name ()

pokud voláte výchozí konstruktor (), takže váš kód v hlavní funkce by měla být

Tree test;
test.insert(...)
Odpovězeno 27/04/2011 v 03:38
zdroj uživatelem

hlasů
1

Jsem zkopíroval některé z kódu a to je v pořádku pro mě:

hlavní:

#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;
    }

Funkce vložení:

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);
}

Jiné, než že máte syntaktické chyby všude možně. Také jsem změnil jméno, protože když někdo poukázal na to, že byl trochu problém pojmenování. CurrentRoot dává smysl, protože jste to prochází kořen levého nebo pravého podstromu na každém rekurze.

Odpovězeno 27/04/2011 v 03:39
zdroj uživatelem

hlasů
0

Neměli byste přidat tree.cppdo svého sestavení příkazu?

[Trinhc @ CS1 Assignment_3] $ g ++ movieList.cpp -o a.out

Stal by se

[Trinhc @ CS1 Assignment_3] $ g ++ tree.cpp movieList.cpp -o a.out

Odpovězeno 27/04/2011 v 05:01
zdroj uživatelem

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