• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Wyświetlanie elementu listy, zmienia mi się główna lista

VPS Starter Arubacloud
0 głosów
259 wizyt
pytanie zadane 5 stycznia 2016 w C i C++ przez martix3 Użytkownik (690 p.)
edycja 6 stycznia 2016 przez martix3

Witam!

Otóż mam taki problem. Mój program wyszukuje płyty dvd za pomocą tytułu i reżysera.

Zarówno w jednej jak i drugiej funkcji mam podobny problem, gdy wyszukam już jakiś film to ucina mi wejściową listę do momentu filmu, który wyszukałam(to pewnie za sprawą zapisu pom->next=NULL; ,  ale gdy go nie miałam to pokazywał mi się wyszukany film i wszystkie następne). Przy reżyserze jest jeszcze taki problem, że jak już znajdzie jakiś film to nie sprawdza, czy jest jeszcze jakiś inny tego samego reżysera. No i wyskakuje błąd i kończy się program, gdy podanego tytułu/reżysera nie ma w bazie. Jak to rozwiązać?

Tu wstawiam strukturę, funkcje i  ich wywołanie:

struct dvd
{string tytul;
string rezyser;
string aktor1;
string aktor2;
string aktor3;
int rok;};
typedef struct element
    { struct dvd p;
    struct element *next;
    }Element;
    typedef Element *Lista;



void wyswietl(Lista a)//funkcja wyświetla listę 
  //  {        while(a)
        {
            cout<<(a->p).tytul<<endl;
            cout<<(a->p).rezyser<<endl;
            cout<<(a->p).aktor1<<endl;
            cout<<(a->p).aktor2<<endl;
            cout<<(a->p).aktor3<<endl;
            cout<<(a->p).rok<<endl;

    //        a=a->next;
            cout<<"\n";
        }}



Lista wyszukaj_tytul(Lista *a,string tytul)//funkcja wyszukuje filmy za pomocą tytułu
{
  Lista pom;
pom=(*a);
    while(pom != NULL && pom->p.tytul != tytul)
      pom=pom->next;
      return pom;

}
Lista wyszukaj_rezyser(Lista *a,string rezyser)//funkcja wyszukuje filmy podanego rezysera
{
  Lista pom;
pom=(*a);
    while(pom != NULL && pom->p.rezyser != rezyser)
      pom=pom->next;
      return pom;

}


Lista b=NULL;

switch(x)
    {       case 0:{Lista pom=NULL;
        cout<<"Podaj tytul(bez znakow polskich):\n";
    getline(cin, linia); getline(cin, linia); 
    z.tytul=linia;
    pom=wyszukaj_tytul(&b,z.tytul);
    wyswietl(pom);
    break;}
            case 1:{Lista pom=NULL;
        cout<<"Podaj imie i nazwisko rezysera(bez znakow polskich):\n";
    getline(cin, linia); getline(cin, linia); 
    z.rezyser=linia;
    pom=wyszukaj_rezyser(&b,z.rezyser);
    wyswietl(pom);
    break;}

Pomożecie?

1 odpowiedź

0 głosów
odpowiedź 5 stycznia 2016 przez nouveu Bywalec (2,560 p.)

Tak jak mówisz, ta linia jest winna:

pom->next=NULL;

Pokaż jak wygląda funkcja wyświetl, może tam jest wina?

Druga sprawa. Znajduje tylko jeden film reżysera bo while ma się zatrzymać gdy chociaż jeden element został znaleziony albo lista się skończyła, nic dziwnego.

komentarz 6 stycznia 2016 przez martix3 Użytkownik (690 p.)
Już różne opcję wyświetlania mam. Teraz zostały mi funkcje, które usuwają element, użytkownika i edytują element. Co do edytowania, to myślisz, że słabym pomysłem będzie usunięcie tego elementu i prośba użytkownika, żeby podał wszystkie dane od początku i wtedy tak jakby dodajemy nowy element?
komentarz 6 stycznia 2016 przez nouveu Bywalec (2,560 p.)
Edytowałem poprzedni komentarz, tam masz linka gdzie jest wyjaśnione jak listy działają, jak usuwać elementy itd.

Co do edycji, zależy, jeśli zrobisz literówkę w nazwie filmu to szkoda usuwać cały element i dodawać prawie identyczny, prawda? Chciałabyś pracować na takim systemie? :)
komentarz 7 stycznia 2016 przez martix3 Użytkownik (690 p.)

Nieszczęsne usuwanie! Czytam to mniej więcej rozumiem, próbuję pisać wychodzi coś innego. Usuwa mi wszystkie elementy przed podanym elementem i ten  element(oprócz 1-go).
Jak po prostu przejść przez listę i usunąć ten właśnie znaleziony odpowiedni element.

Wrzucam kod, muszę dać jeszcze warunek, jakby podany element był pierwszym elementem.

void usun_tytul(Lista *b,string tytul)
{  //daj oddzielny warunek, jeśli film jest 1. elementem

  if(*b==NULL)
     return;
   
  Lista t; 
   t=(*b)->next;
     do t=t->next; 
     while(t->p.tytul!=tytul);
 
   (*b)->next=t->next;
     delete (t);

     return;
}

//wywołanie w main

{  Lista pom=NULL;
  cout<<"Podaj tytul(bez znakow polskich):\n";
      getline(cin, linia); getline(cin, linia);
      z.tytul=linia;  
      pom=wyszukaj_tytul(&b,z.tytul);

  if(pom==NULL)
    {  cout<<"\nPrzykro nam, ale nie mamy w bazie tego filmu.\n";
       break;
     }
            usun_tytul(&b, z.tytul);
         

}

 

komentarz 7 stycznia 2016 przez nouveu Bywalec (2,560 p.)
Dla takiej listy [B=1 2 3 4 5 6] i elementu 4 do usunięcia:
7-8: [B T 2 3 4 5 6]
9-10: [B 2 T 4 5 6] -> [B 2 3 T 5 6]
12: [B 5 6] + wycięty kawałek: [2 3 T] // 12 linia to dokładnie oznacza ustaw następny element po B na następny element po T
13: [B 5 6] + wycięty kawałek: [2 3]

Przeanalizuj dokładnie co dana instrukcja robi bo naprawdę nie rozumiesz co piszesz.

Poprawne rozwiązanie wyglądało by tak:
[1 2 3 4 5 6] do usunięcia 4,

pętla-start
[B 2 3 4 5 6]
[1 B 3 4 5 6]
[1 2 B 4 5 6] // B->next==4
pętla-koniec
[1 2 B C D 6] // C=B->next, D=B->next->next
[1 2 B D 6] // B->next=D, delete C

Nie potrafię tego jaśniej opisać. Załóż nowy temat jeśli dalej będziesz miała problem bo tytuł już jest nieadekwatny do problemu i nikt poza mną tu nie odpisuje.
komentarz 7 stycznia 2016 przez martix3 Użytkownik (690 p.)
Zaraz ogarnę, a tak zapobiegawczo nowy temat jest tu:

https://forum.pasja-informatyki.pl/96312/wyszukiwanie-i-usuwanie-elementow-listy

Podobne pytania

0 głosów
1 odpowiedź 101 wizyt
0 głosów
1 odpowiedź 170 wizyt
pytanie zadane 27 października 2017 w C i C++ przez Partyjny Obywatel (1,170 p.)
0 głosów
1 odpowiedź 94 wizyt
pytanie zadane 21 grudnia 2015 w C i C++ przez martix3 Użytkownik (690 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...