#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
Příspěvky odeslané z IP adresy 147.32.116.–
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;
#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;
- }
- }
Ahoj,
prosím poraďte. Mám dejme tomu binární strom jako je na obrázku
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