Prididání prvku do binárního stromu – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Prididání prvku do binárního stromu – C / C++ – Fórum – Programujte.comPrididání prvku do binárního stromu – C / C++ – Fórum – Programujte.com

 

Jarry
~ Anonymní uživatel
6 příspěvků
9. 2. 2014   #1
-
0
-

Ahoj,

prosím poraďte. Mám dejme tomu binární strom jako je na obrázku

Připojen obrázek.

Potřeboval bych přidat prvek mezi A a C a nevím jak na to...
Vytvořil jsem úplně nový prvek NovyPrvek, tak ze NovyPrvek->vetsi i mensi = NULL
a je koren, koren->vetsi ukazuje na C, koren->mensi na B

NovyPrvek->vetsi = koren->vetsi; // novy prvek bude ukazovat na C
koren->vetsi = NovyPrvek; // jako tim bych to zapojil...jenze to jsem zaraz rekl, ze NovyPrvek->vetsi ukazuje na NovyPrvek a nevim jak z toho vybruslit

Díky moc za  pomoc

Nahlásit jako SPAM
IP: 147.32.116.–
KIIV
~ Moderátor
+43
God of flame
9. 2. 2014   #2
-
0
-

nerekl... dejme tomu ze ty pismena jsou pointery

vytvoril si node s adresou 'o'... v 'a' je jako mensi=b a vetsi=c...  v 'o' nejsou zadni potomci

o->vetsi = koren->vetsi;  //  o->vetsi = c

koren->vetsi = o;  //  koren->vetsi je ted 'o' 

takze zadne zacykleni se nekona

Nahlásit jako SPAM
IP: 94.113.93.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Jarry
~ Anonymní uživatel
6 příspěvků
9. 2. 2014   #3
-
0
-

#2 KIIV
Díky, bylo to správně, teď jsem našel chybu opravdovou...
Nevím jestli to půjde vidět takhle z kousku kódu, ale zkusím to
Mám nějaký řetězec, kde se mi střídají číslice a znaménka +, -
Vše jsem si už převedl do floatu, takže jsou jen kladná čísla a znaménka
Začíná se vždy číslem, potom následuje znaménko, potom číslo, potom znaménko
Celé se to ukládá do stromu tak, že listy jsou čísla
Řeším to tak, že v kořenu je vždycky operátor který se zrovna načte a zbytek se posune
Číslo se vždy načte tam, kde je na něj místo u operátoru (tedy předchozí operátor)
Problém ale je, že si uložím předchozí operátor a ten by měl ukazovat na prvky co má pod sebou, tedy vždy až na první průběh (oba jsou null) by měl vždy jeden ukazatel větší nebo menší být NE-NULL...jenže mě to selže u té podmínky a říká mi to, že oba jsou NULL a nevím proč :( ...označil jsem místo selhání tučně a podtrhl
No prostě ta podmínka se vyhodnotí jako pravdivá pokaždé a to já nechci!
Díky moc
 

  1. int NactiDoStromuCislo(Strom *strom, float znak, int prvni_prubeh)
  2. {
  3.   PrvekStromu *prvek = VytvorPrvek(strom);
  4.   if(prvni_prubeh == 1)
  5.   {
  6.     prvek = strom->koren;
  7.   }
  8.   else
  9.   {
  10.       prvek = strom->predchozi_operator;
  11.   }
  12.     
  13.     //ve vetsim uz neco je, ale v mensim nic...koukne jestli to predchozi neni mensi, kdyztak vymeni, jinak prida do prazdneho
  14.     if(prvek->vetsi != NULL && prvek->mensi == NULL)
  15.     {
  16.       if(prvek->vetsi->obsah < znak)
  17.       {
  18.     prvek->mensi = VytvorPrvek(strom);
  19.     prvek->mensi->obsah = prvek->vetsi->obsah;
  20.     prvek->vetsi->obsah = znak;
  21.       }
  22.       prvek = prvek->mensi;
  23.       prvek = VytvorPrvek(strom);
  24.       prvek->obsah = znak;
  25.       return 0;
  26.     }
  27.     //
  28.     
  29.     //opak predchozi
  30.     if(prvek->vetsi == NULL && prvek->mensi != NULL)
  31.     {
  32.       if(prvek->mensi->obsah > znak)
  33.       {
  34.     prvek->vetsi = VytvorPrvek(strom);
  35.     prvek->vetsi->obsah = prvek->mensi->obsah;
  36.     prvek->vetsi->obsah = znak;
  37.       }
  38.       prvek = prvek->vetsi;
  39.       prvek = VytvorPrvek(strom);
  40.       prvek->obsah = znak;
  41.       return 0;
  42.     }
  43.     //
  44.     
  45.      //ani ve vetsim ani v mensim neni nic, tak to hodi rovnou do vetsiho
  46.     if(prvek->vetsi == NULL && prvek->mensi == NULL)
  47.     {
  48.       prvek = prvek->vetsi;
  49.       prvek = VytvorPrvek(strom);
  50.       prvek->obsah = znak;
  51.       return 0;
  52.     }
  53.     //
  54.     
  55. }
  56. int NactiDoStromuOperator(Strom *strom, float znak)
  57. {
  58.   PrvekStromu *NovyPrvek = VytvorPrvek(strom); //prekopiruje to co je v korenu do noveho prvku
  59.   if(strom->koren->obsah == -21 || strom->koren->obsah == -12)
  60.   {
  61.     NovyPrvek->obsah = strom->koren->obsah;
  62.  
  63.     if(strom->koren->obsah == -12) //bylo tam plus, musi se posunout vpravo
  64.     {
  65.       NovyPrvek->vetsi = strom->koren->vetsi;
  66.       strom->koren->vetsi = NovyPrvek;
  67.       strom->koren->obsah = znak;
  68.       if(NovyPrvek->vetsi == NULL || NovyPrvek->mensi == NULL)
  69.     strom->predchozi_operator = NovyPrvek;
  70.       if(strom->koren->vetsi == NULL || strom->koren->mensi == NULL)
  71.     strom->predchozi_operator = strom->koren;
  72.       return 0;
  73.     }
  74.     if(strom->koren->obsah == -21) //bylo tam plus, musi se posunout vlevo
  75.     {
  76.       NovyPrvek->mensi = strom->koren->mensi;
  77.       strom->koren->mensi = NovyPrvek;
  78.       strom->koren->obsah = znak;
  79.       if(NovyPrvek->vetsi == NULL || NovyPrvek->mensi == NULL)
  80.     strom->predchozi_operator = NovyPrvek;
  81.       return 0;
  82.     }
  83.     
  84.   }
  85.   else
  86.   {
  87.     strom->koren->obsah = znak;
  88.     strom->predchozi_operator = strom->koren;      
  89.     strom->predchozi_operator->vetsi = strom->koren->vetsi;  
  90.     NovyPrvek = strom->predchozi_operator->vetsi;
  91.     return 0;
  92.   }
  93. }

Nahlásit jako SPAM
IP: 147.32.116.–
Jarry
~ Anonymní uživatel
6 příspěvků
9. 2. 2014   #4
-
0
-

#3 Jarry
Operátor + je preveden na -12 do float a - jako -21

Nahlásit jako SPAM
IP: 147.32.116.–
KIIV
~ Moderátor
+43
God of flame
9. 2. 2014   #5
-
0
-

co se vubec stane, kdyz bude plny vetsi i mensi?

Nahlásit jako SPAM
IP: 94.113.93.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Jarry
~ Anonymní uživatel
6 příspěvků
9. 2. 2014   #6
-
0
-

Ještě bych měl přidat jak vypadá strom a prvek stromu...sorry za to, jsem mimo
 

struct PrvekStromu
{
  struct PrvekStromu *mensi;
  struct PrvekStromu *vetsi;
  float obsah; //operator + resp - bude jako -12 resp -21
};

typedef struct PrvekStromu PrvekStromu;

typedef struct
{
  PrvekStromu *koren;
  PrvekStromu *predchozi_operator;
  char *radek; //kazdy strom bude obsahovat retezec, ktery pocita
} Strom;

Nahlásit jako SPAM
IP: 147.32.116.–
Jarry
~ Anonymní uživatel
6 příspěvků
9. 2. 2014   #7
-
0
-

#5 KIIV
taková situace totiz nenastane....strida se operator a cislo...zacina to cislem...takze by tam melo byt vzdy misto na jedno cislo...naplni se to az uplne na konci...teda alespon podle me

Nahlásit jako SPAM
IP: 147.32.116.–
KIIV
~ Moderátor
+43
God of flame
9. 2. 2014   #8
-
0
-

no jak myslis :)

nicmene tradicni zpusob je krokovani ci doplnit debug hlasky.. co se zrovna zpracovava, kam se dava a tak

Nahlásit jako SPAM
IP: 94.113.93.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Jarry
~ Anonymní uživatel
6 příspěvků
9. 2. 2014   #9
-
0
-

#8 KIIV
Doplnil jsem si to printfem, ktery jsem tady smazal...proste ve strom->predchozi_operator je ulozeny prvek co by mel ukazovat na operator, ktery ma u sebe volne misto na cislo...jenze strom->predchozi_operator->vetsi i strom->predchozi_operator->mensi mi ukazuje na null ...tam nastane chyba

Nahlásit jako SPAM
IP: 147.32.116.–
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, 44 hostů

Moderátoři diskuze

 

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