» »

[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

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.

matjaz1111 ::

kak pa naj napišem tako funkcijo, da mi zbriše samo en element seznama?
lp

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 ::

zdravo,

hvala vsem za odgovore,
mam pa še en manjši problem: kak naj napišem algoritem, da bo program izbrisal tudi prvi in zadnji element strukture če bo le ta izpolnil pogoje? ker zaj ne gleda prvega pa zadnjega elementa, ampak samo tiste na sredini.

linki:
main
.h

lp, matjaž

Bojevnik ::

mislim, da bo šlo takole:

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 ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[C++] enosmerno povezan seznam

Oddelek: Programiranje
63404 (1288) 3p
»

Pedagoška fakulteta - računalništvo & matematika

Oddelek: Šola
91262 (1058) tony1
»

[c++]Seznam

Oddelek: Programiranje
142425 (2425) Gundolf
»

[C++] Linker error

Oddelek: Programiranje
51104 (1104) Quikee
»

[C++] NULL: Undeclared identifier - HELP!

Oddelek: Programiranje
101072 (1010) CCfly

Več podobnih tem