Pytanie retoryczne :) dotyczące list

0

Witajcie
Tak się składa, że jestem samoukiem w programowaniu. Obecnie zapoznałem się z listami - to taka dynamiczna struktura danych. Moje pytanie dotyczące list. Czy istnieje możliwość zrobienia listy w liście i to dosłownie. Na przykład lista autorów i podlista książek.
Adam Mickiewicz
Pan Tadeusz
Dziady
Oda do młodości
Maria Konopnicka
Rota
Nasza szkapa
Przeszukałem internet i nie znalazłem odpowiedzi na powyższe pytanie. Najprościej to można byłoby to rozwiązać za pomocą tablic w poszczególnych węzłach. Pytam się dlatego, że lubię czasami drążyć tematy, które mnie interesują a na które nie znajduję nigdzie odpowiedzi.
Pozdrawiam

1

Tak

nested list <language>

1

W języku proceduralnym wykorzystujesz wskaźniki do struktur i nazwy metod z prefiksem określającym rodzaj struktury.
Np.

lista_wstaw(wskaznik_na_liste_ksiazek, wskaznik_na_ksiazke, wskaznik_na_nowy_element)
lista_znajdz(wskaznik_na_liste_ksiazek, tytul_ksiazki)
lista_skasuj(wskaznik_na_liste_ksiazek, tytul_ksiazki)
lista_skasuj(wskaznik_na_liste_ksiazek, wskaznik_na_ksiazke)
lista_rozmiar(wskaznik_na_liste_ksiazek)
...
0

@Adept123: Akurat w przypadku problemu przedstawionego przez Ciebie zdecydowanie lepszą kolekcją do zastosowania będzie mapa. Jako klucz możesz ustawić twórcę, a jako wartość - zbiór dzieł danego artysty. Dla przykładu, w Javie typ takiej mapy wyglądałby następująco: Map<Author, Set<Book>>

3

Tu początek listy list w C: https://wandbox.org/permlink/k0x6ts5Nl0GxPPmD
Tyle że to wymyślanie koła na nowo. Spójrz na języki obiektowe. Tam takie struktury są standardowo zaimplementowane. Dużo szybciej zobaczysz efekty/zrozumiesz jak działają.

1

Witajcie
Może to idiotyczne, ale w ramach ćwiczeń napisałem rozwiązanie.
Pozdrawiam

0

No i to się nazywa pytanie retoryczne :D

0

Kod :)

Program ListaAutorow;
{ i ich dzieł :) }
uses Crt;
type
	wsk_nast = ^osoba;
        lista_ksiazek = ^ksiazki;

        ksiazki = record
               tytul: string;
               nastepny: lista_ksiazek
        end;

	ident = record
             imie,
             nazwisko: string
        end;

        osoba = record
             nazw: ident;
             listadziel: lista_ksiazek;
	     nast: wsk_nast
	end;

var
   perso,gl,lis: wsk_nast;
   nr_autora: integer;
procedure WydrukKsiazek(lista: lista_ksiazek);
var
   nr_ksiazki: integer;
begin
     writeln('------------------LISTA KSIĄŻEK:---------- ');
     nr_ksiazki := 1;
     repeat
           if lista <> nil then
             writeln('     Tytuł ',nr_ksiazki,': ',lista^.tytul);
           lista := lista^.nastepny;
           nr_ksiazki := nr_ksiazki + 1
     until lista = nil;
end;

procedure ListaKsiazek(var pocz_listy: lista_ksiazek; var li_obcych: lista_ksiazek);
var
   GO: boolean;
   NowyWezel,glowa_listy: lista_ksiazek;
   nr_ksiazki: integer;
begin
     GO := false; nr_ksiazki := 1;
     repeat
           New(NowyWezel);
           write('Książka nr: ',nr_ksiazki,' ');
           readln(NowyWezel^.tytul);
           if NowyWezel^.tytul <> '' then
             begin
                  if pocz_listy = li_obcych then
                    begin
                         glowa_listy := NowyWezel;
                         li_obcych := NowyWezel;
                         li_obcych^.nastepny := nil
                    end
                  else
                      begin
                           li_obcych^.nastepny := NowyWezel;
                           NowyWezel^.nastepny := nil
                      end;
                  li_obcych := NowyWezel;
                  GO := true;
                  nr_ksiazki := nr_ksiazki + 1
             end
           else begin GO := false; li_obcych := nil; dispose(NowyWezel); NowyWezel := nil end
     until NOT GO;

     WydrukKsiazek(glowa_listy);
     pocz_listy := glowa_listy;
     glowa_listy := nil
end;

procedure NowyRekord(persona: wsk_nast);
var
   i: integer;
   poczatek_listy,lista: lista_ksiazek;
begin
        writeln('Pusty klawisz enter przerywa pętlę');
        with persona^, nazw, listadziel^ do
         begin
              write('Podaj imię autora i naciśnij klawisz ENTER: ');
              readln(imie);
              if imie <> '' then
                begin
                     write('Podaj nazwisko autora i naciśnij klawisz ENTER: ');
                     readln(nazwisko);
                     poczatek_listy := listadziel;
                     lista := poczatek_listy;
                     ListaKsiazek(poczatek_listy,lista);
                     listadziel := poczatek_listy;
                     poczatek_listy := nil;
                end
         end
end;

procedure WydrukRekordu(persona: wsk_nast);
begin
     with persona^, nazw do
         begin
              writeln(imie:23,nazwisko:15);
              WydrukKsiazek(listadziel);
         end
end;

procedure DodajNowyDoListy(lista: wsk_nast);
begin
     repeat
           New(perso);
           NowyRekord(perso);
           if perso^.nazw.imie = '' then break
           else
               begin
                    if lista = nil then
                      begin
                           lista := perso;
                           lista^.nast := nil;
                           gl := lista;
                      end
                    else
                        begin
                             lista^.nast := perso;
                             perso^.nast := nil
                        end;
                    lista := perso;
               end
     until perso^.nazw.imie = ''
end;

begin
     New(lis); gl := nil; lis := nil;
     ClrScr;
     DodajNowyDoListy(lis);
     lis := gl; nr_autora := 1;
     ClrScr;
     repeat
           writeln('Autor nr:  ',nr_autora:2,'Imię':10,'Nazwisko':15);
           WydrukRekordu(lis);
           nr_autora := nr_autora + 1; lis := lis^.nast
     until lis = nil;
     readln; gl := nil
end.

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