Forum » Programiranje » [naloga][c++] brisanje elementa
[naloga][c++] brisanje elementa
matjaz1111 ::
zdravo!
imam en problem pri tem programu,
KLIK!
in sicer pri funkciji void brisi(student* k_student) , ki brise studente mi zbrise vse studente namesto samo tistih ki ustrezajo kriteriju...če kdo ve kje je problem, prosim če lahko popravi.
hvala,lp
imam en problem pri tem programu,
KLIK!
in sicer pri funkciji void brisi(student* k_student) , ki brise studente mi zbrise vse studente namesto samo tistih ki ustrezajo kriteriju...če kdo ve kje je problem, prosim če lahko popravi.
hvala,lp
Bojevnik ::
C++ ne poznam dobro, toda če sem prav razumel, ti kot argument podaš seznam k_student.
Potem pa kličeš delete k_student (k_student je seznam) in tako zbrišeš celoten seznam.
Potem pa kličeš delete k_student (k_student je seznam) in tako zbrišeš celoten seznam.
rasta ::
{ delete k_student; } k_student=k_student->k_nasl; //kazalec na naslednjega
Tule je že ena velika napaka. Ko nad kazalcem kličeš delete, je vrednost tega kazalca neveljavna oz. ne smeš dostopati do tega dela pomnilnika.
Kljub temu še vedno dostopaš do polja strukture: k_student->k_nasl. (Kar lahko kasneje vodi k "Segmentation fault" napaki).
Ker je kazalec k_student funkciji podan kot vrednost in ne kot referenca, zadnja vrstica za to ne vpliva na vrednost spremenljvike v dosegu (scope) dela programa iz katerega kličeš to funkcijo. Se pravi funkcija samo "pokvari" podatke kamor kaže ta spremenljivka.
Dodatek:
Nisem opazil, da je vse zavito v while zanko.
Se pravi, stvar je problematična, samo ko se izvede if stavek.
Poglej pa še, kaj imaš v destruktorju strukture student, da nimaš še tu kakšen efekt padajočih domin ustvarjen z
if (!k_nasl) delete k_nasl;.
Zgodovina sprememb…
- spremenil: rasta ()
matjaz1111 ::
Bojevnik ::
mislim, da bo šlo takole:
Ta koda dela ce predpostavimo da je argument prvi člen.
Sintaksa je najverjetne narobe, ker c++ ne obvladam, to mislim da boš razumel sistem.
void pinz(student* k_student){ cout<<k_student.izpis()<<endl; while(true){ if(k_student->naslednji==null) {cout<<k_student.izpis(); return;} k_student=k_student->naslednji; }
Ta koda dela ce predpostavimo da je argument prvi člen.
Sintaksa je najverjetne narobe, ker c++ ne obvladam, to mislim da boš razumel sistem.
Zgodovina sprememb…
- spremenilo: Bojevnik ()
rasta ::
student* k_prvi=k_student->k_nasl;
V tej vrstici programu poveš, naj prvo polje enostavno izpusti in za "nov" začetek seznama izbere naslednje polje.
while ( k_student->k_nasl != NULL)
Tukaj se program vsakič vpraša, če je še kakšen element za trenutnim (k_student) in če je, naj izvede telo zanke.
Poskusil si že kako pravilno se koda izvede, če jo poženeš nad praznim seznamom? (Namig: Segmentation fault)
k_student = k_prvi;
Zadnja vrstica nikakor ne vpliva na sam seznam, saj samo spreminjaš lokalno spremenljivko, že vrstico za tem (konec funkcije) pa se počistijo vsi lokalni podatki funkcije.
Če bi rad brisal tudi prvi element seznama, moraš zunanjemu svetu funkcije sporočiti, kje je nov začetek seznama.
To lahko narediš enostavno, da funkcija vrne kazalec na prvi element v seznamu.
Lahko podaš kazalec kot referenco ter funkciji omogočiš in dovoliš, da spreminja vrednost neke spremenljivke dela programa, iz katerega je bila poklicana.
Za isti namen lahko uporabiš tudi "zastarele" C-jevske dvojne kazalce, ampak v C++ ta praksa ni priporočljiva (za to imaš reference).
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | [C++] enosmerno povezan seznamOddelek: Programiranje | 3783 (1667) | 3p |
» | Pedagoška fakulteta - računalništvo & matematikaOddelek: Šola | 1495 (1291) | tony1 |
» | [c++]SeznamOddelek: Programiranje | 2658 (2658) | Gundolf |
» | [C++] Linker errorOddelek: Programiranje | 1286 (1286) | Quikee |
» | [C++] NULL: Undeclared identifier - HELP!Oddelek: Programiranje | 1220 (1158) | CCfly |