» »

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

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

Gundolf ::

Ja brisanje izgleda dokaj slabo. Recimo:
    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....

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.

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

Loaded ::

Ja....še vedno se imenujejo Podatkovne strukture in algoritmi...in še vedno so...

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

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

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 ;)

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

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

[C++] Naloga seznam

Oddelek: Programiranje
223087 (2362) Matic1911
»

[C++] Linker error

Oddelek: Programiranje
51197 (1197) Quikee
»

[C++ naloga] seznam

Oddelek: Programiranje
81315 (1315) BigWhale
»

[naloga][c++] brisanje elementa

Oddelek: Programiranje
61278 (1150) rasta
»

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

Oddelek: Programiranje
101144 (1082) CCfly

Več podobnih tem