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