#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
- int NactiDoStromuCislo(Strom *strom, float znak, int prvni_prubeh)
- {
- PrvekStromu *prvek = VytvorPrvek(strom);
- if(prvni_prubeh == 1)
- {
- prvek = strom->koren;
- }
- else
- {
- prvek = strom->predchozi_operator;
- }
-
- //ve vetsim uz neco je, ale v mensim nic...koukne jestli to predchozi neni mensi, kdyztak vymeni, jinak prida do prazdneho
- if(prvek->vetsi != NULL && prvek->mensi == NULL)
- {
- if(prvek->vetsi->obsah < znak)
- {
- prvek->mensi = VytvorPrvek(strom);
- prvek->mensi->obsah = prvek->vetsi->obsah;
- prvek->vetsi->obsah = znak;
- }
- prvek = prvek->mensi;
- prvek = VytvorPrvek(strom);
- prvek->obsah = znak;
- return 0;
- }
- //
-
- //opak predchozi
- if(prvek->vetsi == NULL && prvek->mensi != NULL)
- {
- if(prvek->mensi->obsah > znak)
- {
- prvek->vetsi = VytvorPrvek(strom);
- prvek->vetsi->obsah = prvek->mensi->obsah;
- prvek->vetsi->obsah = znak;
- }
- prvek = prvek->vetsi;
- prvek = VytvorPrvek(strom);
- prvek->obsah = znak;
- return 0;
- }
- //
-
- //ani ve vetsim ani v mensim neni nic, tak to hodi rovnou do vetsiho
- if(prvek->vetsi == NULL && prvek->mensi == NULL)
- {
- prvek = prvek->vetsi;
- prvek = VytvorPrvek(strom);
- prvek->obsah = znak;
- return 0;
- }
- //
-
- }
- int NactiDoStromuOperator(Strom *strom, float znak)
- {
- PrvekStromu *NovyPrvek = VytvorPrvek(strom); //prekopiruje to co je v korenu do noveho prvku
- if(strom->koren->obsah == -21 || strom->koren->obsah == -12)
- {
- NovyPrvek->obsah = strom->koren->obsah;
-
- if(strom->koren->obsah == -12) //bylo tam plus, musi se posunout vpravo
- {
- NovyPrvek->vetsi = strom->koren->vetsi;
- strom->koren->vetsi = NovyPrvek;
- strom->koren->obsah = znak;
- if(NovyPrvek->vetsi == NULL || NovyPrvek->mensi == NULL)
- strom->predchozi_operator = NovyPrvek;
- if(strom->koren->vetsi == NULL || strom->koren->mensi == NULL)
- strom->predchozi_operator = strom->koren;
- return 0;
- }
- if(strom->koren->obsah == -21) //bylo tam plus, musi se posunout vlevo
- {
- NovyPrvek->mensi = strom->koren->mensi;
- strom->koren->mensi = NovyPrvek;
- strom->koren->obsah = znak;
- if(NovyPrvek->vetsi == NULL || NovyPrvek->mensi == NULL)
- strom->predchozi_operator = NovyPrvek;
- return 0;
- }
-
- }
- else
- {
- strom->koren->obsah = znak;
- strom->predchozi_operator = strom->koren;
- strom->predchozi_operator->vetsi = strom->koren->vetsi;
- NovyPrvek = strom->predchozi_operator->vetsi;
- return 0;
- }
- }