• Nie Znaleziono Wyników

Ćwiczenie 6 Abstrakcyjne typy danych 2 Listy nieuporządkowane

N/A
N/A
Protected

Academic year: 2021

Share "Ćwiczenie 6 Abstrakcyjne typy danych 2 Listy nieuporządkowane"

Copied!
1
0
0

Pełen tekst

(1)

Ćwiczenie 6

Abstrakcyjne typy danych 2 Listy nieuporządkowane 1. Definicja listy nieuporządkowanej

2. Przedstawienie abstrakcyjnego algorytmu wstawiania danych do listy nieuporządkowanej

3. Przedstawienie abstrakcyjnego algorytmu usuwania danych z listy nieuporządkowanej

4. Przedstawienie abstrakcyjnego algorytmu wyszukiwania danych na liście nieuporządkowanej

5. Definicja ADT typu Lista nieuporządkowana 6. Definicja interfejsu Listy nieuporządkowanej

7. Przedstawienie implementacji listy nieuporządkowanej w postaci

rekurencyjnej struktury danych typu lista jednokierunkowa nieuporządkowana (lista wiązana)

•1 ilustracja wstawiania, usuwania i wyszukiwania

•2

przedstawienie kodu w C++ (zastosować w kodzie funkcji zasadę

odseparowania wprowadzania danych i wyświetlania danych z tablicy od kodu funkcji tablicy! Dane do funkcji przekazywane są przez

nagłówek, dane z funkcji można przekazywać podobnie lub przez instrukcję return)

•3 Ocena czasochłonności operacji wstawiania, usuwania i wyszukiwania 8.Przedstawienie tablicowej implementacji listy nieuporządkowanej

•1 ilustracja wstawiania, usuwania i wyszukiwania

•2

przedstawienie kodu w C++ (zastosować w kodzie funkcji zasadę

odseparowania wprowadzania danych i wyświetlania danych z tablicy od kodu funkcji tablicy! Dane do funkcji przekazywane są przez

nagłówek, dane z funkcji można przekazywać podobnie lub przez instrukcję return)

•3 Ocena czasochłonności operacji wstawiania, usuwania i wyszukiwania

Autor: Zofia Kruczkiewicz, p.325 C3 Ćwiczenie 6, Algorytmy i struktury danych 11

(2)

Lista nieuporządkowana- jednokierunkowa Etap 1 - Opis ADT

Nazwa typu - Lista elementów

Własności typu: Potrafi przechować ciąg elementów o dowolnym rozmiarze Dostępne działania: Inicjalizacja listy

Określenie, czy lista jest pusta Dodanie elementu do listy,

Wyszukanie elementu na wskazanym miejscu na liście, Usuwanie z listy,

Etap 2 - Budowa interfejsu

typedef int dane;

// dane umieszczone liście

typedef struct ELEMENT* stos;

//nazwa wskaźnika na element stosu

struct ELEMENT {

dane Dane;

stos Nastepny;

};

struct Lista

{ stos Poczatek;

stos Gdzie;

};

void Inicjalizacja(lista & Lista);

{działanie: inicjuje liste

warunki wstępne: Lista wskazuje na pierwszy element warunki końcowe: Lista zostaje zainicjowana jako pusta}

inline int Pusty(lista Lista) { return Lista.Poczatek==NULL; }

{działanie: określa, czy lista jest pusta; typ inline, bo często wywoływana warunki wstępne: Lista jest zainicjowana,

warunki końcowe: funkcja zwraca 1, jeśli lista pusta, w przeciwnym wypadku 0}

(3)

int Szukaj(lista& Lista, long Miejsce);

{ działanie: szuka elementu na liście

warunki początkowe: Lista wskazuje na zainicjowaną listę,

warunki końcowe: funkcja zwraca wskazanie Lista.Gdzie na element wskazujący na element o numerze Miejsce, gdy znaleziono go na liście lub wskazanie puste, gdy element jest na początku listy - wtedy funkcja zwraca 2. Jeśli Lista.Gdzie wskazuje na koniec listy, gdy Miejsce określa numer za ostatnim elementem - wtedy zwraca 1, w przeciwnym wypadku 3. Gdy lista jest pusta, wtedy funkcja zwraca 0.}

int Wstaw(lista& Lista, dane Dana);

{ działanie: dodaje element w dowolne miejsce ciągu umieszczonego na liście warunki początkowe: Dane jest daną do wstawienia na miejscu pośrednio

wskazywanym przez Lista.Gdzie zainicjowanej listy Lista.

warunki końcowe: funkcja dodaje daną Dana na miejscu określonym przez funkcję Szukaj, jeśli zwróci wartość 0 (wstawianie do pustej listy), lub wartość 1 (wstawianie na końcu listy) lub wartość 2 (wstawianie wewnątrz listy) i funkcja Wstaw zwraca 1, w przeciwnym wypadku zwraca 0}

int Usun(lista& Lista);

{ działanie: usuwa element na dowolnym miejscu w ciągu wstawionym do listy warunki początkowe: Lista jest zainicjowaną listą, Lista.Gdzie jest pośrednim

wskazaniem na element usuwany określony przez funkcję Szukaj, gdy zwróci wartość 2

warunki końcowe: funkcja usuwa z listy element określony przez funkcję Szukaj, gdy zwróci ona wartość 2 oraz wraca dane umieszczone na usuwanym elemencie }

Autor: Zofia Kruczkiewicz, p.325 C3 Ćwiczenie 6, Algorytmy i struktury danych 13

(4)

Etap 3 - implementacja jako lista jednokierunkowa- element listy jak dla stosu

· szukanie i wstawianie do listy w dowolnym miejscu(wynik funkcji Szukaj jest mniejszy od 3)

„A”

Lista.Poczatek

„D” NULL

Nowy „Z”

„A”

Lista.Poczatek

„B”

Nowy „Z”

NULL

Miejsce =3

Lista.Gdzie

„B”

„D” NULL L Nast Lista.Gdzie

int Szukaj(lista& Lista, long Miejsce) { long Numer= 1;

Lista.Gdzie = NULL;

if (Pusty(Lista)) return 0; //lista pusta stos Nast = Lista.Poczatek;

while ((Nast->Nastepny !=NULL) && Miejsce != Numer) { Lista.Gdzie= Nast;

Nast = Nast->Nastepny;

Numer++; }

if (Miejsce == Numer+1) Lista.Gdzie= Nast;

if (Miejsce == Numer+1) return 1; //miejsce za ostatnim elementem

else

if ( Miejsce == Numer) return 2; //miejsce wewnątrz listy

else return 3; //miejsce poza listą

}

int Wstaw(lista& Lista, dane Dana) { stos Nowy = new ELEMENT;

if (Nowy !=NULL) Nowy->Dane=Dana;

else return 0;

if (Lista.Gdzie==NULL)

{ Nowy->Nastepny= Lista.Poczatek;

Lista.Poczatek= Nowy; } else

{ Nowy->Nastepny = Lista.Gdzie->Nastepny;

Lista.Gdzie->Nastepny = Nowy;}

(5)

return 1; }

· usuwanie elementu w dowolnym miejscu niepustej listy (wynik funkcji Szukaj jest równy 2)

„Z”

Lista.Poczatek

„B”

Miejsce = 2

Lista.Gdzie

„D” NULL

„Z”

Lista.Poczatek

„B” „D” NULL

Lista.Gdzie Lista.Poczatek „Z”

„B” „D” NULL

dane Usun(lista& Lista) { stos Pom;

if (Lista.Gdzie==NULL) { Pom= Lista.Poczatek;

Lista.Poczatek= Lista.Poczatek->Nastepny;}

else

{ Pom= Lista.Gdzie->Nastepny;

Lista.Gdzie->Nastepny= Pom->Nastepny;}

dane d=Pom->Dane;

delete Pom;

return d;

}

Autor: Zofia Kruczkiewicz, p.325 C3 Ćwiczenie 6, Algorytmy i struktury danych 15

(6)

#include <conio.h>

#include <stdio.h>

//1. interfejs ADT listy nieuporządkowanej

typedef int dane; // dane umieszczone liście

typedef struct ELEMENT* stos; // nazwa wskaźnika na element listy struct ELEMENT

{ dane Dane;

stos Nastepny;

};

struct lista

{ stos Poczatek;

stos Gdzie;

};

//funkcje ADT listy void Inicjalizacja(lista& Lista);

inline int Pusty(lista Lista);

int Szukaj(lista& Lista, long Miejsce);

int Wstaw(lista& Lista, dane Dana);

dane Usun(lista& Lista);

//2. funkcje we/wy dla danych umieszczonych na liście void Pokaz_dane (dane Dana);

dane Dane(char* s);

//3. funkcje ogólnego przeznaczenia void Komunikat(char*);

char Menu(const int ile, char *Polecenia[]);

//4. elementy programu const int Esc=27;

const int POZ=4;

char * Tab_menu[POZ] = {"1 : Wstawianie do listy w podaym miejscu",

"2 : Usuwanie z listy w podanym miejscu",

"3 : Wydruk listy wraz z jej usuwaniem",

" >Esc Koniec programu"};

(7)

Autor: Zofia Kruczkiewicz, p.325 C3 Ćwiczenie 6, Algorytmy i struktury danych 17

(8)

//funkcje klienta korzystajace ze listy void Wstaw_do_listy(lista& Lista);

void Usun_z_listy(lista& Lista);

void Wyswietl_usun_z_listy(lista& Lista);

void main(void) { lista Lista;

char Wybor;

clrscr();

Inicjalizacja(Lista);

do

{ Wybor= Menu(POZ, Tab_menu);

switch (Wybor)

{ case '1' : Wstaw_do_listy(Lista);

break;

case '2' : if (Pusty(Lista))

Komunikat("\nLista pusta\n");

else (Usun_z_listy(Lista));

break;

case '3' : if (Pusty(Lista))

Komunikat("\nLista pusta\n") ; else Wyswietl_usun_z_listy(Lista);

break;

}

} while (Wybor !=Esc );

}

(9)

//********funkcje klienta korzystające z listy***********

void Wstaw_do_listy(lista& Lista) { dane Dana;

long Miejsce= Dane("Podaj miejscie do wstawienia: ");

if (Szukaj(Lista, Miejsce)<3)

{ Dana= Dane("Podaj dane: ");

if (!Wstaw(Lista, Dana))

Komunikat("\nBrak pamieci");

else Komunikat("\nWstawiono do listy");

}

else Komunikat("\nNie znaleziono miejsca");

}

void Usun_z_listy(lista& Lista) {

long Miejsce=Dane("Podaj miejsce do usuniecia: ");

if (Szukaj(Lista, Miejsce)==2) { Usun(Lista);

Komunikat("\n Usunieto z listy");

}

else Komunikat("\nNie znaleziono miejsca");

}

void Wyswietl_usun_z_listy(lista& Lista) { dane d;

while (!Pusty(Lista)) { Szukaj(Lista,1);

d=Usun(Lista);

Pokaz_dane(d);

} }

Autor: Zofia Kruczkiewicz, p.325 C3 Ćwiczenie 6, Algorytmy i struktury danych 19

(10)

//*********interfejs ADT listy************

void Inicjalizacja(lista& Lista) { Lista.Poczatek = NULL;}

inline int Pusty(lista Lista)

{ return Lista.Poczatek==NULL;}

int Szukaj(lista& Lista, long Miejsce) { long Numer= 1;

Lista.Gdzie = NULL;

if (Pusty(Lista)) return 0;

stos Nast = Lista.Poczatek;

while ((Nast->Nastepny !=NULL) && Miejsce != Numer) { Lista.Gdzie= Nast;

Nast = Nast->Nastepny;

Numer++; }

if (Miejsce == Numer+1) Lista.Gdzie= Nast;

if (Miejsce == Numer+1) return 1;

else

if ( Miejsce == Numer) return 2;

else return 3;

}

int Wstaw(lista& Lista, dane Dana) { stos Nowy = new ELEMENT;

if (Nowy !=NULL) Nowy->Dane=Dana;

else return 0;

if (Lista.Gdzie==NULL)

{ Nowy->Nastepny= Lista.Poczatek;

Lista.Poczatek= Nowy; } else

{ Nowy->Nastepny = Lista.Gdzie->Nastepny;

Lista.Gdzie->Nastepny = Nowy;}

return 1;

}

dane Usun(lista& Lista) { stos Pom;

if (Lista.Gdzie==NULL) { Pom= Lista.Poczatek;

Lista.Poczatek= Lista.Poczatek->Nastepny;}

else

{ Pom= Lista.Gdzie->Nastepny;

Lista.Gdzie->Nastepny= Pom->Nastepny;}

dane d=Pom->Dane;

delete Pom;

return d;

}

(11)

// te funkcje mogą być takie same jak dla stosu, kolejki, listy- //niezależnie od implementacji

//*********funkcje ogólnego przeznaczenia************

char Menu(const int ile, char *Polecenia[]) {

clrscr();

for (int i=0; i<ile;i++) printf("\n%s",Polecenia[i]);

return getch();

}

void Komunikat(char* s) {

printf(s); getch();

} }

//*******funkcje we/wy dla danych umieszczonych na liście******

dane Dane(char* s) { int a;

do

{ fflush(stdin);

printf("\n\n%s", s);

} while (scanf("%d",&a)!=1);

return a;

}

void Pokaz_dane(dane Dana) {

printf("\nNumer: %d\n", Dana);

printf("Nacisnij dowolny klawisz...\n"); getch();

}

Autor: Zofia Kruczkiewicz, p.325 C3 Ćwiczenie 6, Algorytmy i struktury danych 111

(12)

Etap 3 - Implementacja za pomocą dynamicznej tablicy

//ile=3, Gdzie=1

1. for(int i=ile; i>Gdzie; i--) tab[i]=tab[i-1]

0 pamięć dynamiczna

(sterta) tab

2 pamięć statyczna

1

3 4 Gdzie

Wstawianie

2. tab[Gdzie]=dane (sterta)

3. ile++;

// ile=4

//ile=4, który=1

1. for(int i=Gdzie; i<ile-1; i++) tab[i]=tab[i+1]

//ile=4

0 pamięć dynamiczna

(sterta) tab

2 pamięć statyczna

1

3 4 Gdzie

Usuwanie

2. ile--;

// ile=3

(13)

#include <conio.h>

#include <stdio.h>

#include <stdlib.h>

//1. interfejs ADT listy nieuporządkowanej

typedef int dane; / / dane umieszczone liscie

struct lista {

int ile, rozmiar, Gdzie;

dane* tab;

};

//Identyczny test programu jak dla listy wykonanej w postaci listy //wiązanej

//funkcje ADT listy void Inicjalizacja(lista& Lista);

inline int Pusty(lista Lista);

int Szukaj(lista& Lista, long Miejsce);

int Wstaw(lista& Lista, dane Dana);

dane Usun(lista& Lista);

//2. funkcje we/wy dla danych umieszczonych na liscie void Pokaz_dane (dane Dana);

dane Dane(char* s);

//3. funkcje ogólnego przeznaczenia void Komunikat(char*);

char Menu(const int ile, char *Polecenia[]);

//4. elementy programu const int Esc=27;

const int POZ=4;

char * Tab_menu[POZ] = { "1 : Wstawianie do listy w podaym miejscu",

"2 : Usuwanie z listy w podanym miejscu",

"3 : Wydruk listy wraz z jej usuwaniem", " >Esc Koniec programu"};

//funkcje klienta korzystajace ze listy void Wstaw_do_listy(lista& Lista);

void Usun_z_listy(lista& Lista);

void Wyswietl_usun_z_listy(lista& Lista);

Autor: Zofia Kruczkiewicz, p.325 C3 Ćwiczenie 6, Algorytmy i struktury danych 113

(14)

void main(void) { lista Lista;

char Wybor;

clrscr();

Inicjalizacja(Lista);

do

{ Wybor= Menu(POZ, Tab_menu);

switch (Wybor)

{ case '1' : Wstaw_do_listy(Lista); break;

case '2' : if (Pusty(Lista))

Komunikat("\nLista pusta\n");

else (Usun_z_listy(Lista));

break;

case '3' : if (Pusty(Lista))

Komunikat("\nLista pusta\n") ; else Wyswietl_usun_z_listy(Lista);

break;

}

} while (Wybor !=Esc );

}

//*********interfejs ADT listy-tablicy************

void Inicjalizacja(lista& Lista) {Lista.ile=Lista.rozmiar=0;

Lista.tab=NULL;

}

//prywatna funkcja do zmiany rozmiaru tablicy int Zmien(lista& Lista, int delta)

{ dane* pom;

pom = (dane*)realloc(Lista.tab,sizeof(dane)*(Lista.rozmiar+delta));

if (pom)

{ Lista.tab=pom;

Lista.rozmiar+=delta;}

return pom!=NULL;

}

int Pusty (lista Lista) { return Lista.ile==0;}

(15)

int Szukaj(lista& Lista, long Miejsce) { if (Lista.ile==0)

{Lista.Gdzie=0;

return 0;

}

Lista.Gdzie=--Miejsce;

if (Miejsce>=0)

if( Miejsce<=Lista.ile-1) return 2;

else

if (Miejsce<=Lista.ile) return 1;

return 3;

}

int Wstaw(lista& Lista, dane Dana) {

if (!Zmien(Lista,1)) return 0;

for (int i=Lista.ile; i>Lista.Gdzie; i--) Lista.tab[i]=Lista.tab[i-1];

Lista.tab[Lista.Gdzie]=Dana;

Lista.ile++;

return 1;

}

dane Usun(lista& Lista) {

dane d =Lista.tab[Lista.Gdzie];

for (int i=Lista.Gdzie; i<Lista.ile-1; i++) Lista.tab[i]=Lista.tab[i+1];

Lista.ile--;

Zmien(Lista,-1);

if (Lista.ile==0)

Inicjalizacja(Lista);

return d;

}

Autor: Zofia Kruczkiewicz, p.325 C3 Ćwiczenie 6, Algorytmy i struktury danych 115

Cytaty

Powiązane dokumenty

Jeśli znakiem wyrażenia jest operator, to Usun ze stosu dwie kolejne dane, wykonaj działanie zgodne z operatorem i Wstaw wynik na stos o Jeśli znakiem jest cyfra, Wstaw na

{ działanie: podaje największy element o numerze numer z listy symboli Slownik, warunki początkowe: Slownik jest zainicjowaną niepustą listą symboli. warunki końcowe: podaje

Część A. Zadania do samodzielnego rozwiązania, czyli to, co należy umieć z poprzedniego seme- stru... 3.1. Funkcja f ma ciągłą pochodną. Wyznaczyć ekstrema lokalne

Ć wiczenie VB6.00 Tablice, listy, instrukcja cyklu

W miejscach, gdzie lasu nie podszywa zbita gęstwina krzaków, widać grunt czarny i wilgotny, podobny do ziemi używanej w cieplarniach; wyżej nad nimi wisi leciuchna koronkowa

Zachowajcie wykonane prace lub zróbcie dokumentację fotograficzną podczas waszych działań. Życzę

trycznością z uwzględnieniem specyjalnych celów: lam ­ py do pociągów dróg żelaznych, dla hotelów, sklepów i biur, dla górników i nurków, a naw et lampy

1) Przed użyciem klawisza pamięci trzeba ją WYZEROWAĆ! Za to punkty nie były odejmowane na kartkówce, ale to najważniejsza czynność w każdej procedurze używającej