[C++] Nie wyświetla elementu listy


(Mcsimek) #1

Witam!

Pilnie potrzebuję Waszej pomocy do odnalezienia błędu, nad, którym głowie się już z kilka dobrych dni, w kodzie poniżej. Jest to lista dwukierunkowa z bazą obrazów. Mam funkcję sortowanie, polega ona na znajdowaniu najmniejszego(minimalnego) C-string'a, następnie wyświetleniu go i usunięcie go z listy i tak dalej, aż do usunięcia wszystkiech elementów listy. Błąd polega na tym, że jeżeli uruchamiam tę funkcję (powinno się nazywać wyswietl_posortowane, ale mniejsza z tym) to prawie za każdym razem przy wyświetlaniu elementów brakuje elementu, który powinien pojawić się jako ostatni, czyli ten o 'największym' C-string'u.

kod:

void lista::sortowanie(int jakie)

{

     if(jakie==1)

     {//wg tytulu, curr->tytul

          char *min;

            int pozycja,poz_min;

             bool pokazane=false;

             curr=head;//ustawiamy na poczatek


             while(head) //dopoki lista nie jest calkowicie pusta

             {

                  pozycja=1;

                  poz_min=1;

                  min=curr->tytul;

                  //przeszukuj liste w poszukiwaniu najmniejszeg elementu

                  do

                  {

                     if( strcmp(curr->tytul,min) <0 )

                        { //znaleziono mniejszy

                            min=curr->tytul;

                            poz_min=pozycja; //zapisujemy jego pozycje na liscie

                        }

                      pozycja++;

                   } while( nastepny() );


                                    if( !pokazane)

                                     {

                                       pokazane=true;

                                       system("CLS");

                                       cout<<" Elementy rosnaco wg tytulu :\n\t\t\t\t\t\\|/"<
                                      }  

                          ustaw(poz_min); //ustawiamy sie na najmniejszym  

                  cout.width(20);

	                    	cout<
	                    	 cout.width(20);

                            cout<
                             cout.width(20);

                            cout<

                  usun(poz_min); //usuwamy najmniejszy


                  poczatek(); //jedziemy od poczatku, szuakjac najmnijeszych elementow i wysietlajac je,potem usuwajac


             }


      }


        elseif(jakie==2) //analogicznie do tego co wyżej  

             // ...

}

Cały kod : http://wklej.org/id/542551/# (funkcja ta jest w 298 wierszu kodu.)

Przykładowa baza to wczytania w .txt : http://www.text-upload.com/read.php?id=87825&c=8663754

Cały kod może się Wam wydawać dosyć nie optymalny w pewnych kwestiach, bo niedawno zacząłem programować, lecz prosiłbym najbardziej o wskazanie i/lub rozwiązanie problemu opisanego przeze mnie.

Będę niezmiernie wdzięczny za wszelką pomoc :slight_smile:


([alex]) #2

Trudno cokolwiek wywnioskować ponieważ nie pokazałeś co robię poczatek(), usun(), ustaw().


(Mcsimek) #3

racja, proszę:

void lista::poczatek(void) // *********ustawia na poczatek***************** /

{

curr=head;

}

// ******************** usuwanie element listy

void lista::usun(int ktory)

{

ustaw(ktory);

if(curr->prev)

	{

	curr->prev->next=curr->next;

	}

else head=curr->next;

if(curr->next)

	{

	curr->next->prev=curr->prev;

	curr=curr->next;

	}

if(!curr->next && !curr->prev)//jezeli jest 1 element

	{

	head=curr=next=prev=NULL;

	}		


}

// ******** ustawia wskaźnik curr na konkretny element listy

int lista::ustaw(int gdzie)

{

  this->poczatek();

  int i=1;

do

 {

    if(i==gdzie) return 1;

    i++;

 }while(this->nastepny());

return 0;


}

widzę, że temat nie ma zbyt wielu interesantów dlatego proszę o zamknięcie/usunięcie go. :slight_smile: