Implementacją drzewa w C++/Qt

0

Witam.
Piszę program do rysowania drzew. Niestety napotkałem problem z pisaniem drzewa tzn. nie wiem dlaczego nie tworzy mi drzewa.
Oto kod:
tree.cpp

#include "tree.h"

int Tree :: s_count = 0;

Tree::Tree()
{
    left = 0;
    right = 0;
    root = 0;
    number = 0;

}

void Tree :: setNumber(int number)
{
    this->number = number;
}

void Tree :: setLeft(Tree * left)
{
    this->left = left;
}

void Tree :: setRight(Tree * right)
{
    this->right = right;
}

void Tree :: setRoot(Tree * root)
{
    this->root = root;
}

int Tree :: getNumber()
{
    return this->number;
}

Tree * Tree :: getLeft()
{
    return this->left;
}

Tree * Tree :: getRight()
{
    return this->right;
}

Tree * Tree :: getRoot()
{
    return this->root;
}

void Tree :: setNewTree(Tree * tree, QChar c, int l)
{
    if(tree == 0){
     tree = new Tree();
     tree->setNumber(l);
     Tree::s_count++;
    }
    else if(c == 'x'){
     setNewTree(tree->left, c,  l);
    }
    else if(c == 'y'){
     setNewTree(tree->right, c, l);
    }
}

mainwindows.cpp

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    //QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
    result = new QLabel(this);
    text = new QString();
    wsk = new Tree();
    wsk->setNumber(999);

    result->setGeometry(0, 100, 200, 200);
    result->setStyleSheet("color:red;border: 1px solid black;");
    infoDate = new QLabel(this);
    infoDate->setGeometry(0, 0, 100, 20);
    infoDate->setText("Wprowadz dane: ");
    fieldText = new QLineEdit(this);
    fieldText->setText("0");
    fieldText->setGeometry(100, 0, 100, 20);
    enterDate = new QPushButton(this);
    enterDate->setText("-> OK");
    enterDate->setGeometry(200, 0, 40, 20);

    enterDate->installEventFilter(this);
    connect(enterDate, SIGNAL(pressed()), this, SLOT(ok()));

}

void MainWindow :: ok()
{
    int i;
    int dlugosc;

    wsk->setNewTree(wsk, 'x', 11);
    wsk->setNewTree(wsk, 'y', 22);

    result->setText(showTree(wsk));
    //result->setText(QString::number(Tree::s_count));

}

QString MainWindow :: showTree(Tree * wsk)
{

    if(wsk){
    str+= "->";
    str+= QString::number(wsk->getNumber());
    str+= "<br>";
      showTree(wsk->getLeft());
      showTree(wsk->getRight());
    }

    return str;
}

Tzn. Owy program wyświetli wynik ->999 , czyli numer 1 węzła(korzenia), dalej nie chce wypisywać. Tak mi się wydaję, że jeśli nie chce wypisywać w if(wsk){} to prawdopodobnie wskaźniki lewego i prawego syna drzewa są NULL, więc problemu należy szukać wyżej.
Natomiast linia ta:
result->setText(QString::number(Tree::s_count));
Wyświetla 2, czyli utworzenie dwóch nowych drzew. Więc sam już nie wiem czy problem przy wyświetlaniu czy przy tworzeniu?
Jakieś pomysły?

0

Bo mylisz przycisk z klawiaturą.
To co zrobiłeś nie jest drzewem tylko najwyżej gałęzią drzewa.

void Tree :: setNewTree(Tree * tree, QChar c, int l)
...
     tree = new Tree();

Po powrocie z tej metody tree nadal będzie miało starą wartość.

0

@_13th_Dragon - tzn. co?
Do starego węzła dodaje nowe drzewo z wartością l.
Nie widzę problemu.

0

No to uproszczę ci ten kod:

#include <iostream>
using namespace std;

class cos
  {
  };

void funkcja(cos *c)
  {
   c=new cos();
   cout<<(void*)c<<endl;
  }

int main()
  {
   cos *c=0;
   cout<<(void*)c<<endl;
   funkcja(c);
   cout<<(void*)c<<endl;
   return 0;
  }

http://ideone.com/aqhnIu

0

@_13th_Dragon - czyli po opuszczeniu funkcji wskaźnik funkcji jest pusty tak?
Czyli zwrócić nowy wskaźnik i go przypisać do starego?

0

Nie, zrobić sensowną reprezentacje drzewa.

Node { Node *left,*rignt; int number; };
Tree { Node *root; };
0

Ale pole root jest mi nie potrzebne tak naprawdę. Stworzyłem je po to żeby było mi lepiej przechodzić przez nie.
Czyli jak mam klasę Tree to mam zrobić drzewo Tree ?

0
wolacinio napisał(a):

Ale pole root jest mi nie potrzebne tak naprawdę. Stworzyłem je po to żeby było mi lepiej przechodzić przez nie.

No to dodaj Node *parent; nie root

wolacinio napisał(a):

Czyli jak mam klasę Tree to mam zrobić drzewo Tree ?

No nie!
Jak potrzebujesz implementacji drzewa to klasę nazywasz krzak lub jeszcze lepiej cegła.

0

Ale popatrz na nagłówek:

#ifndef TREE_H
#define TREE_H

#include <QChar>

class Tree
{
private:
    int number;
    Tree * left;
    Tree * right;
    Tree * root;

public:
    static int s_count;

    Tree();
    void setNumber(int);
    void setRight(Tree *);
    void setLeft(Tree *);
    void setRoot(Tree *);

    int getNumber();
    Tree * getLeft();
    Tree * getRight();
    Tree * getRoot();

    void setNewTree(Tree *, QChar , int);
};

#endif // TREE_H
0

To co zrobiłeś to takie StudentoKrzesło nie jest zdolne do życia i funkcjonowania.

0

To wg. ciebie jak powinien wyglądać plik nagłówkowy? Wydaje mi się, że ta klasa jest prosta ale zawiera wszystko co trzeba.

@_13th_Dragon - mógłbyś tamten kod poprawić tak żeby działał?

1 użytkowników online, w tym zalogowanych: 0, gości: 1