Lista dwukierunkowa - nie można dostać się do wartości struktury.

0

Witam, próbuję stworzyć listę dwukierunkową dodającą filmy.

Funkcja dodająca:

 Film *push(struct Film *head, string tytul, char data[11], string imie, string nazwisko, string studio, string gatunek,string inne)
{
if(head==NULL) {
head=(struct Film*)malloc(sizeof(struct Film));
tmp=(struct Film*)malloc(sizeof(struct Film));
(*head).ID =ID; // int ID to zmienna globalna zadeklarowana na poczatku i zwiekszana o 1 przy kazdym wywolaniu funkcji push
(*head).tytul = tytul;
(*head).data[11] = data[11];
(*head).imie = imie;
(*head).nazwisko = nazwisko;
(*head).studio = studio;
(*head).gatunek = gatunek;
(*head).inne = inne;
(*head).next=NULL;
(*head).prev=NULL;
tmp=head;
} else {
element=(struct Film*)malloc(sizeof(struct Film));
(*element).ID =ID; // int ID to zmienna globalna zadeklarowana na poczatku i zwiekszana o 1 przy kazdym wywolaniu funkcji push
(*element).tytul = tytul;
(*element).data[11] = data[11];
(*element).imie = imie;
(*element).nazwisko = nazwisko;
(*element).studio = studio;
(*element).gatunek = gatunek;
(*element).inne = inne;
(*element).next=NULL;
(*element).prev=tmp;
(*tmp).next=element;
tmp=element;
}
ID++;
return head;
}

Niestety po dodaniu choćby jednego elementu przy próbie dostania się do niego wyskakuje widowsowy błąd.

Np. po wywołaniu: cout << (*head).ID; lub cout head->ID;

Nie działa przez to opcja wywoływania danego elementu z listy po ID.

             {cout << "Podaj ID";
            int id=0;
            cin >> id;
               tmp=head;
               while ( tmp!=NULL && tmp->ID!=id)
                  {tmp=tmp->next;

                if ( tmp!=NULL && tmp->ID==id)
               {cout << tmp->nazwisko;
               cout << tmp->ID << tmp->data[11] << tmp->imie << tmp->nazwisko << tmp->studio;
               cout << tmp->gatunek << tmp->inne;}
            }

Proszę o pomoc w znalezieniu błędu.

2

Zmień deklaracje struktur i wszystko stanie się o wiele prostsze:

typedef struct Film
  {
   unsigned Id,data;
   string tytul,imie,nazwisko,studio,gatunek,inne;
  } Film;
typedef struct FilmNode 
  {
   Film *film;
   struct FilmNode *next,*prev;
  } FilmNode;
typedef struct FilmList 
  {
   FilmNode *head,*tail;
  } FilmList;

void setFilm(Film *film,string tytul, unsigned data, string imie, string nazwisko, string studio, string gatunek,string inne)
  {
   static unsigned Id=0;
   film->Id=++Id;
   ...
  }

FilmNode *allocNode(Film *film,FilmNode *next,FilmNode *prev)
  {
   FilmNode *node=malloc(sizeof(FilmNode));
   node->film=*film;
   node->prev=prev;
   node->next=next;
   return node;   
  }

void push_front(FilmList *list,Film *film)
  {
   FilmNode *node=allocNode(Film *film,list->head,NULL);
   if(list->head) list->head->prev=node;
   else list->tail=node;
   list->head=node;
  }

void push_back(FilmList *list,Film *film)
  {
   FilmNode *node=allocNode(Film *film,NULL,list->tail);
   if(list->tail) list->tail->next=node;
   else list->head=node;
   list->tail=node;
  }
0

Dziękuję za odpowiedź. Niestety deklaracja struktury raczej narzucona jest z góry, ze względu na to, że jest to część projektu zaliczeniowego.
Stąd potrzebuję wiedzieć co jest źle w tym, co podałem wyżej.

2

Źle jest absolutnie wszystko:

  1. Brak formatowania kodu
  2. Organizacja struktur
  3. Używanie string zaś nie używanie list<>
  4. Brak rozumienia struktury (trzy razy malloc w push)
  5. Powtarzające się fragmenty w if i else
  6. Z bardzo dużym prawdopodobieństwem - brak umiejętności poprawnego wywołania napisanej przez ciebie samego funkcji.
0

Ale kurcze... właściwie w czym jest problem? Przecież to taka sama lista jak każda inna tylko kluczem, który trzyma dane jest struktura opisująca film zamiast np. zwykły int, jak to zazwyczaj bywa w przykładach, i tyle. Jeżeli wcześniej robiłeś na studiach jakiekolwiek proste listy to wystarczy przecież tylko zamienić typ klucza.

1 użytkowników online, w tym zalogowanych: 0, gości: 1