Forum » Programiranje » [c++]Seznam
[c++]Seznam
Loaded ::
Lp
Imam problem ki mu ne najdem rešitve. Stvar mi špila ko imam v seznamu 1 element na 0. indeksu. Če imam dva več ne dela. Sumim funkcijo vrini() in sicer zadnji del pri else{}....ampak ne vem kak bi bilo lahko narobe. Ne vem tudi če kopirni konstruktor špila.
P.S.Če imam kakšna drzga funkcija kakšen bug ....
Hvala
Lp
Imam problem ki mu ne najdem rešitve. Stvar mi špila ko imam v seznamu 1 element na 0. indeksu. Če imam dva več ne dela. Sumim funkcijo vrini() in sicer zadnji del pri else{}....ampak ne vem kak bi bilo lahko narobe. Ne vem tudi če kopirni konstruktor špila.
#ifndef _SEZNAM_H_ #define _SEZNAM_H_ template <class T> class seznam { protected: struct element{ int vrednost; element* k_nasl; //konstruktor element(const T& vred, element* kazalec) { vrednost = vred; kazalec = k_nasl; } }; element* k_zacetek; int velikost_seznama; public: seznam(); seznam(const seznam& s); ~seznam(); void vstavi(int indeks, const T& vred); void vrini(int indeks, const T& vred); void brisi(int indeks); T vrni(int indeks) const; int isci(const T& vred) const; bool prazen() const; int velikost() const; }; template <class T> seznam<T>::seznam() { k_zacetek = NULL; velikost_seznama = 0; } template <class T> seznam<T>::seznam(const seznam& s) { if (s.velikost() == 0) { k_zacetek = NULL; velikost_seznama = 0; return; } else velikost_seznama = s.velikost(); k_zacetek = new element(s.k_zacetek->vrednost, NULL); element* k = s.k_zacetek; element* k1 = s.k_zacetek->s.k_nasl; while(k != NULL) { k_zacetek->k_nasl = new element(k1, k_zacetek->k_nasl); k1 = k1->s.k_nasl; } } template <class T> seznam<T>::~seznam() { element* k = k_zacetek; while(k != NULL) { k = k_zacetek->k_nasl; delete k_zacetek; k_zacetek = k; } } template <class T> void seznam<T>::vstavi(int indeks, const T& vred) { int i = 0; element* k = k_zacetek; while (indeks != i) { k = k->k_nasl; i++; } k->vrednost = vred; } template <class T> void seznam<T>::vrini(int indeks, const T& vred) { int i = 0; element* k = k_zacetek; if ( k_zacetek == NULL ) { cout << "Seznam je bil prazen, zato ustvarjen nov (prvi) element z vrednostjo." << endl; k_zacetek = new element(vred, NULL); } else if (indeks == 0 && velikost_seznama > 0) { cout << "Dodano na zacetek seznama" << endl; k = new element(vred, k); } else if (indeks > velikost_seznama) { while (k->k_nasl != NULL) k = k->k_nasl; k->k_nasl = new element(vred, NULL); } else { while ( i != (indeks-1)){ k = k->k_nasl; i++; } k->k_nasl = new element(vred,k->k_nasl); } velikost_seznama = velikost_seznama + 1; } template <class T> void seznam<T>::brisi(int indeks) { element* k = k_zacetek; int i = 0; if (indeks > velikost_seznama || indeks < 0) cout << "Tak indeks ne obstaja." << endl; else if (indeks == 0) { element* k_novi_zacetek = k_zacetek; delete k_zacetek; k_novi_zacetek = k_novi_zacetek->k_nasl; } else if (indeks == (velikost_seznama-1)) { while (indeks != i) { k = k->k_nasl; i++; } delete k; } else { while (indeks != i) { k = k->k_nasl; i++; } element* k_novi = k; delete k; k_novi = k->k_nasl; velikost_seznama = velikost_seznama - 1; } velikost_seznama = velikost_seznama - 1; } template <class T> T seznam<T>::vrni(int indeks) const { element* k = k_zacetek; int i = 0; while(indeks != i) { k = k->k_nasl; i++; } return k->vrednost; } template <class T> int seznam<T>::isci(const T& vred) const { element* k = k_zacetek; int i = 0; while(k != NULL) { if (k->vrednost == vred) { return i; continue; } k = k->k_nasl; i++; } return -1; } template <class T> bool seznam<T>::prazen() const { element* k = k_zacetek; if (k == NULL) return true; else return false; } template <class T> int seznam<T>::velikost() const { int i = 0; for (element* k = k_zacetek; k != NULL; k = k->k_nasl) i++; return i; } #endif
P.S.Če imam kakšna drzga funkcija kakšen bug ....
Hvala
Lp
Loadeed
Gundolf ::
Prva napaka je že zelo zgodaj:
Dalje pa potem sploh nisem geldal.
element(const T& vred, element* kazalec) { vrednost = vred; kazalec = k_nasl; // tule je napaka }
Dalje pa potem sploh nisem geldal.
Loaded ::
Hvala....Za zdaj mi deluje...edino brisanje mi še ne deluje...če ma kdo voljo..
LP
LP
Loadeed
Gundolf ::
Ja brisanje izgleda dokaj slabo. Recimo:
Itd, napake se vrstijo v tej funkciji.
if (indeks > velikost_seznama || indeks < 0) // tule bi moralo biti >= (prvi element ima index 0, zadnji pa velikost - 1) cout << "Tak indeks ne obstaja." << endl; else if (indeks == 0) { element* k_novi_zacetek = k_zacetek; delete k_zacetek; k_novi_zacetek = k_novi_zacetek->k_nasl; // tule je spet napaka, nastaviti bi moral k_zacetek in ne k_novi_zacetek }
Itd, napake se vrstijo v tej funkciji.
Loaded ::
Sem že rešil...vseeno hvala....upam da mi v redu deluje..aja še nekaj..
Kak bi naredil za funkcijo išči element, da če slučajno obstaja več elementov z isto vrednostjo, da mi vrne vse? Pri if sem dal contine...samo vseeno vrne samo enega....
Kak bi naredil za funkcijo išči element, da če slučajno obstaja več elementov z isto vrednostjo, da mi vrne vse? Pri if sem dal contine...samo vseeno vrne samo enega....
template <class T> int seznam<T>::isci(const T& vred) const { element* k = k_zacetek; int i = 0; while(k != NULL) { if (k->vrednost == vred) { return i; continue; } k = k->k_nasl; i++; } return -1; }
Loadeed
BigWhale ::
return vrne vrednost in potem zakljuci funkcijo.
Vec vrednosti bos moral vrniti kot seznam.
Vec vrednosti bos moral vrniti kot seznam.
Giller0 ::
FERI, kajne? :) Kako se zdaj imenuje predmet? Lani so bli to še Algoritmi in Programske Strukture. Dokaj zanimiv predmet..
Jow..
Backup22 ::
Stavim, da so Podatkovne strukture (če je UNI)
Tako kot je rekel kit - če hočeš vrnit več elementov, jih iščeš in hkrati vstavljaš v drug seznam, katerega vrneš.
Tako kot je rekel kit - če hočeš vrnit več elementov, jih iščeš in hkrati vstavljaš v drug seznam, katerega vrneš.
//
Loaded ::
Ja....še vedno se imenujejo Podatkovne strukture in algoritmi...in še vedno so...
Lp
Lp
Loadeed
Loaded ::
Lp...spet jaz
Dedoval sem iz seznama vrsto in sklad...vendar ne morem pogruntat ene stvari..
npr.izpisujem elemente v skladu...grem po z zanko po velikosti izpišem element na vrhu in ga zbrišem ...zraven pa mi napiše še nekakšne številke..ne razumem...
Izpiše pa mi tole:
Na vrh se nahaja vrednost 17.
4469696
Izbrisan prvi element v seznamu.
Na vrhu se nahaja vrednost 31.
4469696
Izbrisan prvi element v seznamu.
Na vrhu se nahaja vrednost 3.
4469696
Izbrisan prvi element v seznamu.
Na vrhu se nahaja vrednost 512.
4469696
Izbrisan prvi element v seznamu.
Press any key to continue...
Ne izpiše mi vseh elemetov zaradi tistih številk...pa sploh ne vemo od kod prihajajo pa kdo jih izpisuje...pa kak popraviti..Kera funkcija je kriva in zakaj?
tukaj je koda funkcije za vrnitev vrha.Koda od seznama je zgoraj v prvm postu.
Dedoval sem iz seznama vrsto in sklad...vendar ne morem pogruntat ene stvari..
npr.izpisujem elemente v skladu...grem po z zanko po velikosti izpišem element na vrhu in ga zbrišem ...zraven pa mi napiše še nekakšne številke..ne razumem...
sklad <int> mojSklad; mojSklad.vstavi(23); mojSklad.vstavi(6); mojSklad.vstavi(78); mojSklad.vstavi(512); mojSklad.vstavi(3); mojSklad.vstavi(31); mojSklad.vstavi(17); for (int i = 0; i < mojSklad.velikost(); i++) { cout << mojSklad.vrh() << endl; mojSklad.brisi(); }
Izpiše pa mi tole:
Na vrh se nahaja vrednost 17.
4469696
Izbrisan prvi element v seznamu.
Na vrhu se nahaja vrednost 31.
4469696
Izbrisan prvi element v seznamu.
Na vrhu se nahaja vrednost 3.
4469696
Izbrisan prvi element v seznamu.
Na vrhu se nahaja vrednost 512.
4469696
Izbrisan prvi element v seznamu.
Press any key to continue...
Ne izpiše mi vseh elemetov zaradi tistih številk...pa sploh ne vemo od kod prihajajo pa kdo jih izpisuje...pa kak popraviti..Kera funkcija je kriva in zakaj?
tukaj je koda funkcije za vrnitev vrha.Koda od seznama je zgoraj v prvm postu.
template <class T> T sklad<T>::vrh() const { if (seznam<T>::k_zacetek != NULL) cout << "Na vrhu se nahaja vrednost " << seznam<T>::k_zacetek->vrednost << endl; else { cout << "Sklad je prazen!" << endl; } }
Loadeed
Zgodovina sprememb…
- spremenil: Loaded ()
Gundolf ::
cout << mojSklad.vrh() << endl;
tole ti izpiše tiste cifre :) Ti znotraj funkcije vrh() le izpišeš vrednost, pozabiš jo pa vrniti, zato je ta vrednost, ki jo izpišeš v zgoraj podanem stavku vedno kr neki™.
Loaded ::
Ahm....hvala
Zakaj pa vedno ko izpisujemin brišem....npr..
Mi izpiše samo tole..?
Torej ne izpiše mi celotnega sklad....ampak vedno samo polovico elemetov...saj brisanje ne upošteva zraven...ali?
Lp
Zakaj pa vedno ko izpisujemin brišem....npr..
sklad <int> mojSklad; mojSklad.vstavi(23); mojSklad.vstavi(6); mojSklad.vstavi(78); mojSklad.vstavi(512); for (int i = 0; i < mojSklad.velikost(); i++) { cout << mojSklad.vrh() << endl; mojSklad.brisi(); }
Mi izpiše samo tole..?
512 Izbrisan prvi elementv seznamu. 78 Izbrisan prvi element v saznamu.
Torej ne izpiše mi celotnega sklad....ampak vedno samo polovico elemetov...saj brisanje ne upošteva zraven...ali?
Lp
Loadeed
Gundolf ::
Tri iteracije tvoje zanke:
1. i = 0, velikost = 4
izpises zadnji element, brises zadnji element
2. i = 1, velikost = 3
izpises zadnji element, brises zadnji element
3. i = 2, velikost = 2
i ni manjsi od velikost, zato se vsebina zanke ne izvede in zanka se zaključi
Zato ti izpiše, kar ti izpiše ;)
1. i = 0, velikost = 4
izpises zadnji element, brises zadnji element
2. i = 1, velikost = 3
izpises zadnji element, brises zadnji element
3. i = 2, velikost = 2
i ni manjsi od velikost, zato se vsebina zanke ne izvede in zanka se zaključi
Zato ti izpiše, kar ti izpiše ;)
Loaded ::
Zdaj delam dvosmerno povezani seznam in vrini mi ne dela čist v redu...ne vem zakaj..ne morem najti napake..
template <class A, class T> void asociativni_seznam<A,T>::vrini(const A& kljuc, const T& podatek) { element* novi = new element(kljuc, podatek); element* k = k_zacetek; //vrinjanje na začetek seznama pri praznem seznamu if (k_zacetek == NULL) { k_zacetek = novi; novi->k_nasl = novi; novi->k_prej = novi; cout << "Ustvarjen nov element in dan na zacetek." << endl; } else { while(k->k_nasl != k_zacetek) { if (k->kljuc == kljuc) { k->podatek = podatek; cout << "Kljucu " << k->kljuc << " je bil zamenjan podatek." << endl; return; } if (k->podatek == podatek) { k->kljuc = kljuc; cout << "Podatku " << k->podatek << " je bil zamenjan kljuc." << endl; return; } k = k->k_nasl; } //dodajanje novega elementa na začetek seznama if (kljuc > k_zacetek->kljuc) { novi->k_nasl = k_zacetek; k_zacetek->k_prej = novi; k_zacetek->k_nasl = novi; novi->k_prej = k_zacetek; k_zacetek = novi; cout << "Dodano na zacetek seznama." << endl; } //dodajanje na ostala mesta v seznamu else { k = k_zacetek; while(k->kljuc > kljuc) k = k->k_nasl; if (k->k_nasl == k_zacetek) { novi->k_nasl = k_zacetek; novi->k_prej = k; k->k_nasl = novi; k_zacetek->k_prej = novi; return; } novi->k_nasl = k->k_nasl; k->k_nasl->k_prej = novi; novi->k_prej = k; k->k_nasl = novi; cout << "Element vrinjen pred element s kljucem " << k->kljuc << endl; } } }
Loadeed
Gundolf ::
v tem stavku
if (kljuc > k_zacetek->kljuc)je že ena napaka. Deluje ti namreč le če je v seznamu le en element.
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | [C++] Naloga seznamOddelek: Programiranje | 3270 (2545) | Matic1911 |
» | [C++] Linker errorOddelek: Programiranje | 1279 (1279) | Quikee |
» | [C++ naloga] seznamOddelek: Programiranje | 1379 (1379) | BigWhale |
» | [naloga][c++] brisanje elementaOddelek: Programiranje | 1316 (1188) | rasta |
» | [C++] NULL: Undeclared identifier - HELP!Oddelek: Programiranje | 1213 (1151) | CCfly |