[C++] Lista jednokierunkowa i usuwanie wybranego elementu.

Kuber19
Użytkownik
Użytkownik
Posty: 122
Rejestracja: 17 wrz 2015, o 18:58
Płeć: Mężczyzna
Lokalizacja: Polska

[C++] Lista jednokierunkowa i usuwanie wybranego elementu.

Post autor: Kuber19 »

Witam uczę się teraz dynamicznych struktur trochę korzystałem z internetu i w miarę wszystko rozumiem, ale mam problem z usuwaniem wybranej liczby z listy. Program się kompiluje, jednak przy wybraniu obojętnie jakiej liczby, która chce usunąć, wysypuje się. I nie wiem jak na to zaradzic za bardzo. Prosiłbym o jakies wskazówki/rozwiązanie problemu. Z góry dziękuję. O to kod:

Kod: Zaznacz cały

#include<iostream>
#include <cstdlib>
#include<cmath>
#include<windows.h>
using namespace std;
struct Lista
{
    int wartosc;
    Lista *wsk;
};
int wybrana;
void DodajPrzod(Lista *&start, int w);
void WypiszListe(Lista *&start);
void UsunListe(Lista *&start);
void UsunPrzod(Lista *&start);
void DodajTyl(Lista *&start,int w);
void UsunTyl(Lista *&start);
int Licznik(Lista *&start);
void UsunWybrana(Lista *&start,int wybrana);
int main()
{
    short int pomoc;
    int liczba;
    Lista *start;
    start=nullptr;  //*start->NULL;
        while(pomoc!=6)
            {
            WypiszListe(start);
            cout<<"

";
            cout<<"1.Dodaj element z przodu.
2.Dodaj element z tylu.
3.Usun element z przodu. 
4.Usun element z tylu.
5.Usun Liste.
6.Usun wybrana liczbe. 
7.Wyjdz.
Wybor : ";
            cin>>pomoc;
            switch(pomoc)
            {
          case 1:
            cout<<"Jaka liczbe dodac? :";
            cin>>liczba;
            if(Licznik(start)<10)
            DodajPrzod(start, liczba);
            else {cout<<"W liscie jest juz max elementow. 
"; Sleep(3000);}
            break;
          case 2:
            cout<<"Jaka liczbe dodac? 
";
            cin>>liczba;
            if(Licznik(start)<10)
            DodajTyl(start, liczba);
            else {cout<<"W liscie jest juz max elementow. 
"; Sleep(3000);}
            break;
          case 3: UsunPrzod(start);
            break;
          case 4: UsunTyl(start);
            break;
          case 5: UsunListe(start);
            break;
          case 7: exit(1);
            break;
            case 6:{cout<<"Jaka Liczbe usunac? :
";cin>>wybrana; UsunWybrana(start,wybrana); }
          default :
            cout<<"Zle wybrales, program sie zepsul...
";

            }

        system("cls");
        }
return 0;
}
void DodajPrzod(Lista *&start, int w){
Lista *p;
p=start;

      p=new Lista;
      p->wartosc=w;
      p->wsk=start;
      start=p;




}
void WypiszListe(Lista *&start){
Lista *p;
p=start;
    while(p)
    {
        cout<<p->wartosc<<" ";
        p=p->wsk;
    }


}
void UsunListe(Lista *&start){
Lista *p;
    while(start)
    {
       p=start;
       start=start->wsk;
       delete p;
    }

}
void UsunPrzod(Lista *&start){
Lista *p;
p=start;
    if(p){
        start=start->wsk;
        delete p;
    }else cout<<"
Brak elementow w liscie";
}
void DodajTyl(Lista *&start, int w){
Lista *p,*n;
p=start;
    if(p){
            while(p->wsk) {p=p->wsk;}
                n=new Lista;
                n->wartosc=w;
                n->wsk=nullptr;
                p->wsk=n;

    }else cout<<"
Lista Pusta";
}
void UsunTyl(Lista *&start){
Lista *p=start;
    if(p)
    {
        if(p->wsk){
        while(p->wsk->wsk) {p=p->wsk;}
        delete p->wsk;
        p->wsk=nullptr;
        }else {
            delete p;
            start=nullptr;
        }
    }
}
int Licznik(Lista *&start){
int _ile=0;
Lista *p;
p=start;
while(p!=NULL)
{
    p=p->wsk;
    _ile++;
}

return _ile;
}
void UsunWybrana(Lista *&start, int wybrana)
{
    Lista *p = start;
    Lista *n;

    while (p)
    {
        n = p->wsk; //bieżący to następnik poprzednika
        if (n->wartosc == wybrana)
        {
            p->wsk = n->wsk; //wypełnij dziurę w łańcuchu
            delete n;
        }
        else
            p = p->wsk; //następny
    }
}
Ostatnio zmieniony 26 sty 2017, o 09:22 przez Afish, łącznie zmieniany 1 raz.
Powód: Kod wklejaj na forum.
ODPOWIEDZ