[C++] odczyt drzewa z pliku

0

Mam taką klasę:

class drzewo
{
private:
string dana;
drzewo * X[2];
public:
...
};

Mam na dysku zapisany plik ze strukturą uzupełnionego drzewa:

korzen(n_0(n_10)(n_11))(n_1)

to znaczy:
korzen
/
n_0 n_1
/
n_10 n_11

W przypadku liścia: X[0] jak i X[1] wskazują NULL

Jak załadować takie drzewo do zmiennej:

drzewo n;
n.Laduj();

0

A co masz już napisane?

0

Napisałem już, tylko nie działa mi prawidłowo:

Mam taki kod:

void Drzewo::Wczytaj(const char * file)
{
(...)
Drzewo ** tab = new Drzewo * [n+1];
tab[0] = this;
(...)

if (...)
{
tab[i] = tab[i-1]->X[0];
tab[i] = new Drzewo;
}
(...)
}

I dlaczego jak i = 1, tab[0]->X[0] == NULL ? Wcale nie przydziela pamięci. Nic nie rozumiem.

Daję cały kod:

void Zwierze::Wczytaj(const char * file)
{
ifstream fin;
fin.open(file);

if (!fin.is_open())
    return;

string pLO;
char ch;
int n = Max(file);

Zwierze ** tab = new Zwierze * [n + 1];
tab[0] = this;
int * t = new int [n];

for (int i = 0; i < n; i++)
    t[i] = 0;

int i = 0;
bool flaga = true;

while (!fin.eof())
{
    while ((ch = fin.get()) != '(' && ch != ')' && ch != EOF)
        pLO += ch;

    if (ch == EOF)
        return;

    if (flaga)
    {
        tab[i]->pytanieLubOdpowiedz = pLO;
        pLO = "";
    }

    if (ch == '(')
    {
        i++;
        t[i-1]++;
        flaga = true;

        if (t[i-1] % 2 == 1)
        {
            tab[i] = tab[i-1]->Odp[0];
            tab[i] = new Zwierze;
        }
        else
        {
            tab[i] = tab[i-1]->Odp[1];
            tab[i] = new Zwierze;
        }
    }

    if (ch == ')')
    {
        i--;
        flaga = false;
    }
}

}

0

Zamieniłem:

tab[i] = tab[i-1]->Odp[0];
tab[i] = new Zwierze;

na:

tab[i-1]->Odp[0] = new Zwierze;
tab[i] = tab[i-1]->Odp[0];

Nie do końca rozumiem czemu tak trzeba, ale działa. Przed użyciem new tab[i-1]->Odp[0] wskazywało na NULL, więc może skopiował sam adres 0x00000000 do nowej zmiennej wskaźnikowej i dlatego nie działało.

0

Z kodu, który podałeś nic nie wynika. Po co ta tablica tab? Przecież przy założeniu, że format danych wygląda tak:

<węzeł> := <nazwa> '(' <węzeł> ')' '(' <węzeł> ')' | <nazwa>
można to zrobić rekurencyjnie:

class drzewo
{
private:
	string	dana;
	drzewo*	x[2];
public:
	drzewo(string::iterator &it1, string::iterator it_end)
	{
		x[0] = x[1] = NULL;

		string::iterator it2 = it1;
		while(it2 != it_end && !strchr("()",*it2)) ++it2;
		dana.assign(it1,it2);
		it1 = it2;
		if(it1 == it_end || *it1 == ')')return;
		++it1;
		x[0] = new drzewo(it1,it_end);
		if(*it1 != ')') throw exception("wtf?!");
		while(it1 != it_end && *it1 != '(') ++it1;
		if(it1 == it_end) throw exception("wtf?!");
		x[1] = new drzewo(++it1,it_end);
	}

	...
};

// wywołanie
string line = "korzen(n_0(n_10)(n_11))(n_1)";

string::iterator it = line.begin(); 
drzewo* d = new drzewo(it,line.end());

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