1 Lista jednokierunkowa Lista jednokierunkowa jest oszczędną
Transkrypt
1 Lista jednokierunkowa Lista jednokierunkowa jest oszczędną
Lista jednokierunkowa Lista jednokierunkowa jest oszczędną pamięciowo strukturą danych, pozwalającą grupować dowolną — ograniczoną tylko ilością dostępnej pamięci — liczbę elementów: liczb, znaków, rekordów. Operacje na niej mogą trwać stosunkowo długo. wskaźnik do początku listy wskaźnik do końca listy wartość1 wskaźnik do następnego elementu wartość2 wskaźnik do następnego elementu wartość3 NULL 2 5 1 NULL info element element element Struktura: typedef struct calk{ int wartosc; struct calk *nastepny; // wskaźnik do następnego elementu }ELEMENT; Lista dwukierunkowa Lista dwukierunkowa — komórka robocza zawiera wskaźniki do elementów przedniego i następnego. Pierwsza komórka znajdująca się w liście nie posiada swojego poprzednika. Ostatnia komórka znajdująca się w liście nie posiada swojego następnika. Lista dwukierunkowa jest dość kosztowna, jeśli chodzi o zajętość pamięci, ale czasem szybkość działania jest ważniejsza niż małe zużycie pamięci — a właśnie szybkość działania jest zaletą listy dwukierunkowej. 2 NULL 5 -2 8 NULL Struktura: typedef struct calkowita{ int wartosc; // tu pola z danymi struct calkowita *nastepny; struct calkowita *poprzedni; }ELEMENT; Lista cykliczna —jest zamknięta w pierścień: wskaźnik ostatniego elementu wskazuje „pierwszy” element. Pewien element określany jest jako „pierwszy” raczej umownie i służy wyłącznie do wejścia w krąg wskaźników listy cyklicznej. 1 Lista jedokierunkowa zadanie Napisz program wczytujący do listy jednokierunkowej listę studentów. Zestawienie powinno zawierać następujące dane studenta: imię nazwisko kierunek studiów numer indeksu. Po wczytaniu danych program ma realizować wypisywanie aktualnej listy studentów. wersja1 #include <iostream> using namespace std; struct student { string imie; string nazwisko; string kierunek_studiow; string numer_indeksu; student *nastepny; // wskaźnik na następny element student(); // konstruktor - specjalna metoda wywoływana przy tworzeniu obiektu }; //:: operator zasięgu student::student() { // ustawienie w konstruktorze wypełnienia pola wartościami nastepny = 0; } struct lista { student *pierwszy; // wskaźnik na początek listy // zgłoszenie (prototypowanie) funkcji void dodaj_studenta(string imie, string nazwisko, string kierunek_studiow,string numer_indeksu); lista(); // konstruktor - specjalna metoda wywoływana przy tworzeniu obiektu }; lista::lista() { // ustawienie w konstruktorze wypełnienia pola wartościami pierwszy = 0; } void lista::dodaj_studenta(string imie, string nazwisko, string kierunek_studiow,string numer_indeksu) { student *nowy = new student; // tworzenie nowego elementu listy nowy -> imie = imie; // -> operator wyłuskania dla wskaźnika do obiektu nowy -> nazwisko = nazwisko; nowy -> kierunek_studiow = kierunek_studiow; nowy -> numer_indeksu = numer_indeksu; if (pierwszy == 0) // czy pierwszy element listy { pierwszy = nowy; // nowy element jest początkiem listy } else 2 { student *temp = pierwszy; while (temp -> nastepny) { temp = temp -> nastepny; // wskaźnik na ostatni element } temp -> nastepny = nowy; // ostatni element wskazuje na nowy nowy -> nastepny = 0; // ostatni NULL } } int main() { lista *dziekanat = new lista; // obiekt lista dziekanat //dodanie studenta do dziekanatu dziekanat -> dodaj_studenta("Jan","Cis","Informatyka" , "A101"); dziekanat -> dodaj_studenta("Adam","Dąb","Automatyka", "B102"); dziekanat -> dodaj_studenta("Ewa","Bąk","Informatyka", "A103"); dziekanat -> dodaj_studenta("Anna","Ptak", "Automatyka","B104"); // wyświetlenie studentów cout << dziekanat -> pierwszy -> imie << " " << dziekanat -> pierwszy -> nazwisko << " " << dziekanat -> pierwszy -> kierunek_studiow << " " << dziekanat -> pierwszy -> numer_indeksu << endl; cout << dziekanat -> pierwszy -> nastepny -> imie << " " << dziekanat -> pierwszy -> nastepny -> nazwisko << " " << dziekanat -> pierwszy -> nastepny -> kierunek_studiow << " " << dziekanat -> pierwszy -> nastepny -> numer_indeksu << endl; cout << dziekanat -> pierwszy -> nastepny -> nastepny -> imie << " " << dziekanat -> pierwszy -> nastepny -> nastepny -> nazwisko << " " << dziekanat -> pierwszy -> nastepny -> nastepny -> kierunek_studiow << " " << dziekanat -> pierwszy -> nastepny -> nastepny -> numer_indeksu << endl; cout << dziekanat -> pierwszy -> nastepny -> nastepny -> nastepny -> imie << " " << dziekanat -> pierwszy -> nastepny -> nastepny -> nastepny -> nazwisko << " " << dziekanat -> pierwszy -> nastepny -> nastepny -> nastepny -> kierunek_studiow << " " << dziekanat -> pierwszy -> nastepny -> nastepny -> nastepny -> numer_indeksu << endl; return 0; } wersja2 #include <iostream> using namespace std; struct student { string imie; string nazwisko; string kierunek_studiow; string numer_indeksu; student *nastepny; // wskaźnik na następny element student(); // konstruktor - specjalna metoda wywoływana przy tworzeniu obiektu }; //:: operator zasięgu student::student() { // ustawienie w konstruktorze wypełnienia pola wartościami nastepny = NULL; } 3 struct lista { student *pierwszy; // wskaźnik na początek listy // zgłoszenie (prototypowanie) dwóch funkcji void dodaj_studenta(string imie, string nazwisko, string kierunek_studiow,string numer_indeksu); void wyswietl_liste(); lista(); // konstruktor - specjalna metoda wywoływana przy tworzeniu obiektu }; lista::lista() { // ustawienie w konstruktorze wypełnienia pola wartościami pierwszy = NULL; } void lista::dodaj_studenta(string imie, string nazwisko, string kierunek_studiow,string numer_indeksu){ student *nowy = new student; // tworzenie nowego obiektu student nowy -> imie = imie; // -> operator wyłuskania dla wskaźnika do obiektu nowy -> nazwisko = nazwisko; nowy -> kierunek_studiow = kierunek_studiow; nowy -> numer_indeksu = numer_indeksu; if (pierwszy==NULL){ // czy pierwszy element listy pierwszy = nowy; // nowy element początkiem listy } else{ student *temp = pierwszy; // na koniec listy while (temp -> nastepny){ temp = temp -> nastepny; // wskaźnik na ostatni element } temp->nastepny = nowy; // ostatni element wskazuje na nowy element nowy->nastepny = NULL; // ostatni NULL } } void lista::wyswietl_liste(){ student *temp = pierwszy; // wskaźnik na pierwszy element listy while (temp){ // przejscie na nastepne elementy listy cout << "imie: " << temp -> imie << " nazwisko: " << temp -> nazwisko << " kierunek: " << temp -> kierunek_studiow << " numer indeksu: " << temp -> numer_indeksu <<endl; temp = temp -> nastepny; } } int main(){ lista *dziekanat = new lista; // nowy obiekt lista dziekanat dziekanat->dodaj_studenta("Jan","Cis","Informatyka" , "A101"); //dodanie studenta do dziekanatu dziekanat->dodaj_studenta("Adam","Dąb","Automatyka", "B102"); dziekanat->dodaj_studenta("Ewa","Bąk","Informatyka", "A103"); dziekanat->dodaj_studenta("Anna","Ptak", "Automatyka","B104"); dziekanat->dodaj_studenta("Karol","Las", "Automatyka","B105"); dziekanat -> wyswietl_liste(); // wyświetlenie studentów return 0; } wersja3 #include <iostream> using namespace std; 4 struct student{ string imie; string nazwisko; string kierunek_studiow; string numer_indeksu; student *nastepny; // wskaźnik na następny element student(); // konstruktor - specjalna metoda wywoływana przy tworzeniu obiektu }; // :: operator zasięgu student::student(){ // ustawienie w konstruktorze wypełnienie pól wartościami cout << "Podaj imie: "; cin >> imie; cout << "Podaj nazwisko: "; cin >> nazwisko; cout << "Podaj kierunek: "; cin >> kierunek_studiow; cout << "Podaj numer indeksu: "; cin >> numer_indeksu; nastepny = NULL; } struct lista{ student *pierwszy; // wskaźnik na początek listy void dodaj_studenta(); // zgłoszenie (prototypowanie) funkcji void wyswietl_liste(); // zgłoszenie (prototypowanie) funkcji lista(); // konstruktor - specjalna metoda wywoływana przy tworzeniu obiektu }; lista::lista(){ // ustawienie w konstruktorze wypełnienia pola wartościami pierwszy = NULL; } void lista::dodaj_studenta(){ student *nowy = new student; // tworzenie nowego obiektu listy // compare() metoda porównywania stringów (nowy -> imie).compare(nowy -> imie); // -> operator wyłuskania dla wskaźnika do obiektu (nowy -> nazwisko).compare(nowy ->nazwisko); (nowy -> kierunek_studiow).compare(nowy -> kierunek_studiow); (nowy -> numer_indeksu).compare(nowy -> numer_indeksu); if (pierwszy == NULL){ // czy pierwszy element listy pierwszy = nowy; // nowy jest początkiem listy } else{ student *temp = pierwszy; // na koniec listy while (temp -> nastepny){ temp = temp -> nastepny; // wskaźnik na ostatni element } temp -> nastepny = nowy; // ostatni element wskazuje na nowy element nowy -> nastepny = NULL; // ostatni NULL } } void lista::wyswietl_liste(){ student *temp = pierwszy; // wskaźnik na pierwszy element listy while (temp){ // przejście na następne elementy listy cout << "imie: " << temp -> imie << " nazwisko: " << temp -> nazwisko << " kierunek: " << temp -> kierunek_studiow << " numer indeksu: " << temp -> numer_indeksu <<endl; temp=temp -> nastepny; 5 } } int n; int studenci(){ cout << "ilu studentow dodajesz: \n"; cin >> n; return n; } int main(){ lista *dziekanat = new lista; // utworzenie nowej listy dziekanat studenci(); for(int i = 0; i < n; i++) dziekanat->dodaj_studenta(); // dodanie studentów do dziekanatu system("cls"); dziekanat -> wyswietl_liste(); // wyświetlenie studentów delete (dziekanat); // zwalnienie pamieci return 0; } -----------BIBLIOGRAFIA: Algorytmy, struktury danych i techniki programowania; Piotr Wróblewski ; Wydanie V; Helion 2015 Algorytmy i struktury danych; Aho A. V., Hopcroft J. E, Ullman J. D.;Helion 2003 6