Problem z drzewem C++

0

Witam, mam problem z modyfikacją dodanej już osoby w drzewie. Kompletnie nie wiem jak do tego podejść. Poniżej zamieszczam fragment kodu. Do break działa w porządku, wyszukuje osobę w drzewie jednak nie wiem w jaki sposób zamienić wyszukane dane na imie1, nazwisko1, rok1, plec1.

{
			cout << "Podaj imie, nazwisko i rok urodzenia osoby ktora chcesz modyfikowac " << endl;
			cin >> imie >> nazwisko >> rok;
			node* n = drzewo_przodkow.find(imie, nazwisko, rok);
			if (n == NULL)
			{
				cout << "Brak takiej osoby w drzewie" << endl;
				break;
			}
			cout << "Wprowadź zmiany. Podaj imie, nazwisko, rok urodzenia osoby oraz plec(m/k): " << endl;
			cin >> imie1 >> nazwisko1 >> rok1 >> plec1;
}
			

0

@Zielony_13532: próbowałem zrobić coś takiego ale wiem że jest to źle

                        osoba* o;
			o -> imie = imie1;
			o -> nazwisko = nazwisko1;
			o -> rok_urodzenia = rok1;
			o -> plec = plec1;
0

Mamy wrózyć? Podaj reszte kodu.

0

@lion137: plik bTree.h

#pragma once
#include <string>
#include <list>

using namespace std;

struct osoba
{
	string imie;
	string nazwisko;
	int rok_urodzenia;
	char plec;
};

struct node
{
	osoba* data;
	node* left_child;
	node* right_child;
	node* parent;
};

class bTree
{
private:
	node* root;
public:
	bTree();
	~bTree();

	void add_root(osoba* o);
	void add_left_child(osoba* o, node* parent);
	void add_right_child(osoba* o, node* parent);
	void modify(node* n, string imie, string nazwisko, int rok);
	void print_tree();//wypisanie drzewa
	node* find(string imie, string nazwisko, int rok);

private:
	list<node*> preorder(node* n, list<node*> lista_nodow);
	node* leftmost_child(node* n);
	node* right_sibling(node* n);
};
0

@lion137: plik bTree.cpp

#include "bTree.h"
#include <iostream>

using namespace std;

bTree::bTree()
{
	root = NULL;
}
bTree::~bTree()
{
	//todo
}

void bTree::add_root(osoba* o)
{
	node* n = new node;
	n->data = o;
	n->parent = NULL;
	n->left_child = NULL;
	n->right_child = NULL;
	root = n;
}

void bTree::add_left_child(osoba* o, node* parent)
{
	node* n = new node;
	n->data = o;
	n->left_child = NULL;
	n->right_child = NULL;
	n->parent = parent;
	parent->left_child = n;
}

void bTree::add_right_child(osoba* o, node* parent)
{
	node* n = new node;
	n->data = o;
	n->left_child = NULL;
	n->right_child = NULL;
	n->parent = parent;
	parent->right_child = n;
}

void bTree::print_tree()
{
	list<node*> lista;
	lista = preorder(root, lista);
	node* p;
	while (!lista.empty())
	{
		p = lista.front();
		cout << p->data->imie << " " << p->data->nazwisko << ", " << p->data->rok_urodzenia << endl;
		lista.pop_front();
	}
}

node* bTree::find(string imie, string nazwisko, int rok)
{
	list<node*> lista;
	lista = preorder(root, lista);
	node* p;
	while (!lista.empty())
	{
		p = lista.front();
		if (p->data->imie == imie && p->data->nazwisko == nazwisko && p->data->rok_urodzenia == rok)
			return p;
		lista.pop_front();
	}
	return NULL;
}

list<node*> bTree::preorder(node* n, list<node*> lista)
{
	lista.push_back(n);
	node* p = leftmost_child(n);
	while (p != NULL)
	{
		lista = preorder(p, lista);
		p = right_sibling(p);
	}
	return lista;
}

node* bTree::leftmost_child(node* n)
{
	if (n->left_child) return n->left_child;
	return n->right_child;
}

node* bTree::right_sibling(node* n)
{
	if (n->parent->right_child == n) return NULL;
	return n->parent->right_child;
}
0

@lion137:

#include <iostream>
#include <conio.h>
#include "bTree.h"

using namespace std;

int main()
{
	int opcja;
	string imie, nazwisko, imie1, nazwisko1;
	int rok, rok1;
	char plec, plec1;

	bTree drzewo_przodkow;
do {
        
       
	
		cout << "3 - Modyfikuj osobe " << endl;
		switch (opcja)
case 3:
		{
			cout << endl;
			cout << "Podaj imie, nazwisko i rok urodzenia osoby ktora chcesz modyfikowac " << endl;
			cin >> imie >> nazwisko >> rok;
			node* n = drzewo_przodkow.find(imie, nazwisko, rok);
			if (n == NULL)
			{
				cout << "Brak takiej osoby w drzewie" << endl;
				break;
			}
			cout << "Wprowadź zmiany. Podaj imie, nazwisko, rok urodzenia osoby oraz plec(m/k): " << endl;
			cin >> imie1 >> nazwisko1 >> rok1 >> plec1;
			/*osoba* o;
			o -> imie = imie1;
			o -> nazwisko = nazwisko1;
			o -> rok_urodzenia = rok1;
			o -> plec = plec1;*/
			//drzewo_przodkow.modify()
		}


			break;}
return 0;}
0

Inaczej to "zdizajnuj", napisz metodę update(osoba * o1, osoba * o2), która wyszykuje i aktualizuje osobę, mogłaby ewentualnie zwracać true/false - informując czy modyfikacja się udała. Do tego jeszcze przydały by się prywatne metody: porównująca osoby, wpisująca dane do węzła; poprawi się przejrzystość, łatwiej będzie debugować/testować.

1
            node* n = drzewo_przodkow.find(imie, nazwisko, rok); // to chcesz zmodyfikować
            if (n == NULL)
            {
                cout << "Brak takiej osoby w drzewie" << endl;
                break;
            }
            cout << "Wprowadź zmiany. Podaj imie, nazwisko, rok urodzenia osoby oraz plec(m/k): " << endl;
            cin >> imie1 >> nazwisko1 >> rok1 >> plec1;
            osoba* o; // to próbujesz zmodyfikować
            o -> imie = imie1;
            o -> nazwisko = nazwisko1;
            o -> rok_urodzenia = rok1;
            o -> plec = plec1;

Podmieniaj dane w tym n

0

@_13th_Dragon: Dziękuję za pomoc

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