Nie dodaje elementów do listy podwieszanej w C

0

Witam, mam problem z listą podwieszaną. Chodzi o to, że nie moge dodać listy albumów, która jest połaczona z listą zespołów... gdzie jest błąd? (od każdego zespołu odchodzi osobna lista na albumy)

funkcja dodaj_zespoly działa poprawnie, problem jest z dodaj_albumy, i jedyne co wyczaiłem to wywalanie przy porównaniu wsk->next2==NULL

 typedef struct zespol
                {
                        char nazwa[30];
                        char kraj[20];
                }zespol;

 typedef struct album
                {
                        char nazwa[30];
                        int rok_wydania;
                }album;

typedef struct podwieszana
                {
                        album dane;
                        struct  podwieszana *next;
                        struct  podwieszana *poprz;
                } podwieszana;

typedef struct element
                {
                        zespol dane;
                        struct element *next;
                        struct element *poprz;
                        struct podwieszana *next2;
                } el_listy;



struct element *glowa=NULL;
struct element *ogon=NULL;



void dodaj_zespol (zespol dane_zesp,int *licznik){
   el_listy *tmp=glowa;
   el_listy *nowy;
   nowy = (el_listy*)malloc(sizeof(el_listy));
   if (glowa==NULL){

    glowa=nowy;
    nowy->dane = dane_zesp;
   nowy->next = NULL;
   nowy->poprz= NULL;
   nowy->next2=NULL;
   ogon=nowy;
      }

    else{
        nowy->dane = dane_zesp;
        if ((stricmp(glowa->dane.nazwa, nowy->dane.nazwa))>0){
            nowy->next = glowa;
            glowa->poprz=nowy;
            nowy->poprz=NULL;
             nowy->next2=NULL;
            glowa=nowy;
        }
        else{
           while ((tmp->next!=NULL)&&((stricmp(tmp->dane.nazwa, nowy->dane.nazwa) < 0)))
                tmp=tmp->next;
           nowy->poprz = tmp;
           nowy->next = tmp->next;
           nowy->next2=NULL;
           if (tmp->next != NULL){
                tmp->next->poprz = nowy;
                tmp->next = nowy;
            }
            else{
                nowy->next==NULL;
                tmp->next = nowy;
                ogon=nowy;
            }



        }
    }

	(*licznik)++;
}



void dodaj_album (album dane_albumu, el_listy *wsk){
  podwieszana *tmp=wsk->next2;
   podwieszana *nowy;
   nowy = (podwieszana*)malloc(sizeof(podwieszana));
   if (wsk->next2==NULL){
        printf("pierwszy element listy pusty");
        wsk->next2=nowy;
        nowy->dane = dane_albumu;
        nowy->poprz=wsk;
        nowy->next=NULL;
    }
    else{
        nowy->dane = dane_albumu;
        if ((stricmp(wsk->next2=nowy->dane.nazwa, nowy->dane.nazwa))>0){
            nowy->next = wsk->next2;
            wsk->next2->poprz=nowy;
            nowy->poprz=wsk;
            wsk->next2=nowy;
        }
        else{
           while ((tmp->next!=NULL)&&((stricmp(tmp->dane.nazwa, nowy->dane.nazwa) < 0)))
                tmp=tmp->next;
           nowy->poprz = tmp;
           nowy->next = tmp->next;
           if (tmp->next != NULL){
                tmp->next->poprz = nowy;
                tmp->next = nowy;
            }
            else{
                nowy->next==NULL;
                tmp->next = nowy;

            }



        }
    }
}


album wpisz_album(){
    el_listy *wsk;
    wsk=znajdz_zespol(wsk);
    if (wsk==NULL){
        printf("Nie ma takiego zespolu na liscie!");
        getch();
        return;
    }
        album dane;
    printf("Podaj nazwe albmumu: ");
    fgets(dane.nazwa, 20, stdin);
    printf("Podaj rok wydania: ");
    scanf("%d",&dane.rok_wydania);
   dodaj_album(dane,&wsk);
   return;
}


0

Bo to nie jest kod, to zlepek nie związanych ze sobą fragmentów.
Powiedź mi co wg ciebie ma robić to:

if ((stricmp(wsk->next2=nowy->dane.nazwa, nowy->dane.nazwa))>0){
0

nie wysyłam całego kodu programu, tylko te podstawowe fukncje w których wiem że jest bład, tylko gdzie, bo teoretycznie powinno chodzić...

porównywanie stringów. Do listy albumów dodaje mi Od razu sortując ją, według nazwy albumu. Porównuje pierwszy element listy podwieszanej( wsk->next2) z akutalnie dodawanym.

aha widze gdzie mam bład w tym ifie... zaraz zobacze czy mi to zadziała

poprawiłem oczywiscie na:

if ((stricmp(wsk->next2->dane.nazwa, nowy->dane.nazwa))>0){

lecz nadal nie działa. nie dodaje pierwszego elementu listy podwieszanej w ogole.

0

Napisz to po ludzku a będzie działać, pierwsza twoja funkcja sprowadza się do:

typedef struct zestaw
  {
   struct element *glowa;
   struct element *ogon;
   int licznik;
  };

void dodaj_zespol(zestaw *lst,zespol dane_zesp)
  {
   el_listy *nowy,*next,*poprz=NULL;   
   for(next=lst->glowa;(next)&&(stricmp(next->dane.nazwa,dane_zesp.nazwa)<0);next=next->next) poprz=next;
   nowy=malloc(sizeof(el_listy));
   nowy->dane=dane_zesp;
   nowy->next=next;
   nowy->poprz=poprz;
   nowy->next2=NULL;
   if(next) next->poprz=nowy; else lst->ogon=nowy;
   if(poprz) poprz->next=nowy; else lst->glowa=nowy;
   ++lst->licznik;
  }

pisane z palca więc mogłem gdzieś drobną literówkę popełnić ale działać będzie na 100% bo zlikwidowałem miliony if'ów. Ta druga to jeszcze prościej powinna wyglądać.

0

Myśle jednak, że mam coś nie tak ze wskaźnikiem "wsk", bo samo skrócenie kodu wątpie czy coś pomoże. Zanim dodałem podwieszaną z albumami to dodawanie zespołó działało normalnie.

wywoływany z funckji

album wpisz_album(){
    el_listy *wsk;
    wsk=znajdz_zespol(wsk);
    if (wsk==NULL){
        printf("Nie ma takiego zespolu na liscie!");
        getch();
        return;
    }
        album dane;
    printf("Podaj nazwe albmumu: ");
    fgets(dane.nazwa, 20, stdin);
    printf("Podaj rok wydania: ");
    scanf("%d",&dane.rok_wydania);
   dodaj_album(dane,&wsk);
   return;
}
void dodaj_album (album dane_albumu, el_listy *wsk){

a otrzymywany z :

el_listy *znajdz_element(char *nazwe) /*zwraca wska¼nik na szukany element*/
{
    el_listy *wsk=glowa;
    while(wsk!=NULL){
        if (stricmp(nazwe,wsk->dane.nazwa)==0)
             return znajdz_element;
        wsk=wsk->next;
        };
        return wsk;

}

el_listy *znajdz_zespol(el_listy *wsk){         // sprawdza czy jest dany zespol na liscie i zwraca wskaznik

 char nazwa_zespolu[20]; // nazawa zespolu do ktorego mamy dodac album
    if (glowa==NULL){
        printf("Nie ma zadnego zespolu na liscie!");
        return;
    }
    scanf("%c",stdin);
    printf("Podaj nazwe zespolu: ");
    fgets(nazwa_zespolu, 20, stdin);
    wsk=znajdz_element(nazwa_zespolu);
    return wsk;

}

może coś z referencja?

0

Skrócenie kodu zawsze pomaga, w krótkim kodzie błędy są widoczne jak na talerzu.

el_listy *znajdz_element(char *nazwe) /*zwraca wska¼nik na szukany element*/
  {
   el_listy *wsk;
   for(wsk=glowa;(wsk)&&(stricmp(nazwe,wsk->dane.nazwa));wsk=wsk->next) {}
   return wsk;
  }

zastanów się, czy da się pomylić w jednej pętle?

0

W funkcji dodaj_album() przypisujesz wskaźnik innego typu, tu:

nowy->poprz=wsk;

Dwukrotnie.

I jeszcze jeden błąd. Deklarujesz void dodaj_album (album dane_albumu, el_listy *wsk) a wywołujesz dodaj_album(dane,&wsk).

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