Pomoc se strome – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Pomoc se strome – C / C++ – Fórum – Programujte.comPomoc se strome – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
ragon0
Duch
25. 10. 2009   #1
-
0
-

ahoj, dostal jsem za úkol přidat do tohoto stromu funkci pro mazání konkrétního prvku, pro případ kdy je prvek jenom list, nebo má jenom jednoho následníka, pokud má dva tak se má vypsat chybová zpráva. teoreticky vím jak to má fungovat, ale neumím to naimplementovat, mohl by mi někdo prosím pomoct? :( děkuji

#include "stdafx.h"



struct uzel {
int data;
struct uzel *levy, *pravy;
};
struct uzel *koren = NULL;

struct uzel*najdi(int cislo,struct uzel*kde)
{
if (kde==NULL) return NULL;
if (kde->data==cislo) return kde;
if (kde->data > cislo) return najdi(cislo, kde->levy);
else return najdi(cislo, kde->pravy);
};
void pridejdostromu (struct uzel*n,struct uzel*kde);

void pridej(int nove)
{
if(najdi(nove,koren)!=NULL) return;
struct uzel*n = (struct uzel*)
malloc(sizeof(struct uzel));
if(n==NULL) exit(5);
n->data=nove;
n->levy=NULL;
n->pravy=NULL;
if (koren==NULL)
koren=n;
else pridejdostromu(n,koren);

}

void pridejdostromu (struct uzel*n,struct uzel*kde)
{
if(n->data<kde->data)
{if(kde->levy==NULL) kde->levy=n;
else pridejdostromu(n,kde->levy);
}
else {if(kde->pravy==NULL)kde->pravy=n;
else pridejdostromu(n,kde->pravy);
}
}

void inorder(struct uzel*x)
{
if(x==NULL) return;
inorder(x->levy);
printf("%i ",x->data);
inorder(x->pravy);

}
void inorderobracene(struct uzel*x)
{
if(x==NULL) return;
inorder(x->pravy);
printf("%i ",x->data);
inorder(x->levy);

}
//void smaz(int prvek,10)
//mazani bez ditete, mazani s jednim, kdyz 2 deti tak nejde smazat

int _tmain(int argc, _TCHAR* argv[])
{
pridej(5);
pridej(2);
pridej(10);
pridej(12);
if (najdi(2,koren)==NULL)printf("NE ");
else printf("ANO ");
if (najdi(15,koren)==NULL)printf("NE ");
else printf("ANO ");
inorder(koren);
inorderobracene(koren);
return 0;
}

Nahlásit jako SPAM
IP: 82.114.194.–
Reklama
Reklama
H4wk.cz0
Newbie
30. 10. 2009   #2
-
0
-

Chytrá metoda je vracet si ukazatel na upravený podstrom. Něco takového:

struct uzel* odebrat(struct uzel* u, int cislo) {

if (u == NULL) { return u; }
if (cislo < uzel->data) {
uzel->levy = odebrat(uzel->levy, cislo);
} else if (cislo > uzel->data) {
uzel->pravy = odebrat(uzel->pravy, cislo);
} else {
if (uzel->levy == NULL) {
struct uzel* vratit = uzel->pravy;
free(uzel);
return vratit;
} else if (uzel->pravy == NULL) {
struct uzel* vratit = uzel->levy;
free(uzel);
return vratit;
} else {
...Error...
}
}
}
Taková funkce se pak volá
koren = odebrat(koren, cislo)
Dobrý nápad je si ji zaobalit nějakou, která se o to stará sama.

Nahlásit jako SPAM
IP: 90.180.131.–
http://ksp.mff.cuni.cz - Nauč se opravdu programovat
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 260 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý