Advertisement
Guest User

dwukierunkowa

a guest
Jan 25th, 2020
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.92 KB | None | 0 0
  1. //
  2. //  main.cpp
  3. //  cwiczenia do egzaminu
  4. //
  5. //  Created by Daniel on 23/01/2020.
  6. //  Copyright © 2020 Daniel Rumin. All rights reserved.
  7. //
  8. //Lista dwukierunkowa
  9. //Wpisywanie na początek
  10. //Wpisywanie na koniec
  11. //Wyświetlanie od tyłu
  12. //Wyświetlanie od początku
  13.  
  14. #include <iostream>
  15.  
  16. struct Data {
  17.     int dzien;
  18.     int miesiac;
  19.     int rok;
  20. };
  21.  
  22. struct Osoba {
  23.     Data data;
  24.     int id;         //Dla wygody wpisujemy tu tylko "ID" zamiast np. Imienia
  25. };
  26.  
  27. struct Node {
  28.     Osoba osoba; //odwołanie do struktury osoba
  29.     Node * next; //wskazanie na następny element listy
  30.     Node * prev; //wskazanie na poprzedzający element listy
  31. };
  32.  
  33. struct List {       //Struktura, która zawiera początek i koniec listy
  34.     Node * head;    //będzie ona przekazywana w funkcjach
  35.     Node * tail;    //za pomocą &lista
  36. };                  //(zmienna List * lista)
  37.  
  38. void ListInnit (List * lista){  //Funkcja, która inicjalizuje listę poprzez przekazanie jej adresu struktury
  39.     lista->head = NULL;
  40.     lista->tail = NULL;
  41. }
  42.  
  43. void PushFront (List * lista, Osoba * osoba){   //Funkcja wstawiająca komórkę do listy z przodu.
  44.     Node * NewNode;                             //Tymczasowy wskaźnik do przechowywania adresu nowo zallokowanej komórki listy
  45.     NewNode = (Node *)malloc(sizeof(Node));     //Można użyć też NewNode = new Node;
  46.     NewNode->osoba = *osoba;                    //Przypisujemy do nowej komórki adres stworzonej wcześniej struktury z danymi
  47.     NewNode->prev = NULL;                       //Pierwszy element, więc przed nim nie ma nic
  48.     NewNode->next = lista->head;                //Do wskaźnika next z nowej komórki przekazujemy adres 1 komórki listy
  49.     if (lista->head != NULL)
  50.         lista->head->prev = NewNode;            //Wskazanie sprawia, że aktualny head wskazując na poprzedzającą komórkę
  51.     else                                        //bierze adres nowo stworzonej
  52.         lista->tail = NewNode;                  //Jeśli jest to pierwsze wstawienie, to pierwsza komórka jest jednocześnie last
  53.     lista->head = NewNode;                      //Nowej komórce przypisujemy, że jest 1 elementem listy
  54. }
  55.  
  56. void PushBack (List * lista, Osoba * osoba){    //Funkcja wstawiająca komórkę do listy z tyłu
  57.     Node * NewNode;
  58.     NewNode = (Node *)malloc(sizeof(Node));
  59.     NewNode->osoba = *osoba;
  60.     lista->tail = NewNode;
  61.     NewNode->prev = lista->tail;
  62.     lista->tail = NewNode;
  63.     lista->tail->next = NULL;
  64. }
  65.  
  66. void ExampleFill_Front (List * lista){
  67.     int OsobyDoZapelnienia = 0;
  68.     std::cout << "Ile osob dodac?: ";
  69.     std::cin >> OsobyDoZapelnienia;
  70.     Osoba persona;
  71.    
  72.     for (int i = 0; i < OsobyDoZapelnienia; ++i) {
  73.         for (int j = 0; j < 4; ++j) {
  74.            
  75.             if (j == 0) {
  76.                 persona.data.dzien = i+1;
  77.             } else if (j == 1){
  78.                 persona.data.miesiac = i+2;
  79.             } else if (j == 2){
  80.                 persona.data.rok = (i+1)*100;
  81.             } else if (j == 3){
  82.                 persona.id = i;
  83.             }
  84.         }
  85.        
  86.         PushFront(lista, &persona);
  87.     }
  88.    
  89. }
  90.  
  91. void ExampleFill_Back (List * lista){
  92.     int OsobyDoZapelnienia = 0;
  93.     std::cout << "Ile osob dodac?: ";
  94.     std::cin >> OsobyDoZapelnienia;
  95.     Osoba persona;
  96.    
  97.     for (int i = 0; i < OsobyDoZapelnienia; ++i) {
  98.         for (int j = 0; j < 4; ++j) {
  99.            
  100.             if (j == 0) {
  101.                 persona.data.dzien = i+1;
  102.             } else if (j == 1){
  103.                 persona.data.miesiac = i+2;
  104.             } else if (j == 2){
  105.                 persona.data.rok = (i+1)*100;
  106.             } else if (j == 3){
  107.                 persona.id = i;
  108.             }
  109.            
  110.         }
  111.         PushBack(lista, &persona);
  112.     }
  113.    
  114. }
  115.  
  116. void DisplayFront (List * lista){
  117.     Node * temp;        //Tymczasowy wskaźnik, który wędruje po liście
  118.     temp = lista->head; //Tymczasowy wskaźnik dostaje 1 komórkę listy
  119.     while (temp != NULL) {
  120.         std::cout << temp->osoba.data.dzien << "/" << temp->osoba.data.miesiac << "/" << temp->osoba.data.rok << "\n";
  121.         std::cout << "Id: " << temp->osoba.id << "\n";
  122.         temp = temp->next; //Tymczasowy wskaźnik przechodzi w następny element listy
  123.     }
  124. }
  125.  
  126. void DisplayBack (List * lista){
  127.     Node * temp;        //Tymczasowy wskaźnik, który wędruje po liście
  128.     temp = lista->tail; //Tymczasowy wskaźnik dostaje ostatnią komórkę listy
  129.     while (temp != NULL) {
  130.         std::cout << temp->osoba.data.dzien << "/" << temp->osoba.data.miesiac << "/" << temp->osoba.data.rok << "\n";
  131.         std::cout << "Id: " << temp->osoba.id << "\n";
  132.         temp = temp->prev; //Tymczasowy wskaźnik przechodzi do poprzedniego elementu
  133.     }
  134. }
  135.  
  136. int main() {
  137.     List lista;
  138.     ListInnit(&lista);
  139.     ExampleFill_Front(&lista);
  140.     DisplayFront(&lista);
  141.     std::cout << std::endl;
  142.     DisplayBack(&lista);
  143.    
  144.    
  145. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement