4 listy jednokierunkowe id 3773 Nieznany (2)

background image

Rekurencyjne struktura danych - lista
jednokierunkowa

background image

Przegląd zagadnień

Omawiając pojęcie rekurencji, stwierdziliśmy, że jest to definicja, która
odwołuje się do definiowanego przedmiotu. Powstaje pytanie, czy istnieje
możliwość definicji struktury danych, która odwoływałaby się do siebie samej.
Przeczytawszy tytuł tego rozdziału można się domyślić, że odpowiedź brzmi
tak.

W rozdziale tym studenci poznają i nauczą się:

Definiować własny typ referencyjny.

Definicję listy jednokierunkowej.

Dodawać elementy do listy.

Usuwać elementy z listy.

Listy dwukierunkowe i cykliczne.

background image

Klasa jako rekord

Przy pomocy słowa struct definiowaliśmy nowy typ wartości (bezpośredni).
W języku C# programista może również zdefiniować własny typ referencyjny.
Realizuje to przez zastąpienie słowa struct słowem class. W celu
uniknięcia pomyłek przyjmijmy, że w dalszej części kursu struktury (rekordy)
definiowane przy pomocy słowa struct będziemy nazywali krótko
strukturami, natomiast struktury definiowane za pomocą słowa class klasami.
Jest to ogólnie przyjęta nomenklatura stosowana w odniesieniu do języka C#.

Do klas możemy stosować wszystko to, co zostało do tej pory powiedziane na
temat struktur.

Główna różnica między klasami a strukturami jest taka, że pola (składowe)
przedstawiciela klasy, czyli obiektu, są zawsze "przechowywane" na
zarządzanej stercie, nawet wtedy, gdy pole jest typu bezpośredniego. Przydział
pamięci dla obiektu jest pokazany na rysunku na slajdzie.

Deklaracja zmiennej typu zdefiniowanego przy pomocy słowa class, tworzy
zmienną typu referencyjnego, więc jak już wspominano wcześniej, deklaracja
zmiennej nie tworzy obiektu. Obiekt tworzymy zawsze przy pomocy słowa
kluczowego new:

nazwaZmiennej = new NazwaKlasy();

Po utworzeniu obiektu wszystkie jego pola są zainicjalizowane. Pola liczbowe
mają nadaną wartość zero, logiczne false, pola typów referencyjnych wartość
null. Polu możemy nadać swoją domyślną wartość, podając ją w definicji
pola:

class Osoba
{

background image

public string Nazwisko = "Kowalski";

public string Imie = "Jaś";

public int RokUrodzenia = 1979;

}

Uwaga:
Więcej na temat typu referencyjnego można znaleźć w rozdziale drugim tego
kursu.

Struktury stosujemy zazwyczaj do reprezentacji prostych struktur danych typu
punkt, rozmiar, prostokąt, data. W przypadku struktur danych bardziej
złożonych powinniśmy stosować klasy (np. stos, kolejka (:).

Definiując rekurencyjne struktury danych musimy użyć klasy. Zmienne typów
referencyjnych zawierają odwołanie. Odwołanie to niekoniecznie musi
pokazywać na obiekt danej klasy, może być puste, czyli zmienna ma wartość
null. Dzięki temu definicja ma swój koniec, nie jest nieskończona.

background image

Lista jednokierunkowa

Tablice są bardzo przydatnymi strukturami danych, lecz mają również pewne
wady:

1. Rozmiar tablicy musi być podany w trakcie jej tworzenie.

2. Wstawienie nowego elementu, jak również usunięcie istniejącego

elementu tablicy, wymaga przesunięcia wszystkich elementów
znajdujących się za wstawianym (usuwanym) elementem.

Ograniczenia powyższe rozwiązuje struktura zwana listą jednokierunkową.
Lista jednokierunkowa jest kolekcją elementów zwanych węzłami. Każdy
węzeł zawiera dane oraz połączenie (odwołanie) do następnego węzła.
Pierwszy węzeł listy nazywamy głową (head). Przy pomocy zmiennej głowa
(head) możemy odwołać się do pozostałych elementów listy, korzystając z tego,
że węzły są połączone. Ostatni element listy zawiera odwołanie puste.
Nazywamy go ogonem (tail).

background image

Dodawanie elementu do listy (1)

Procedura dodawania pierwszego elementu do listy (pierwszych danych), czyli
utworzenie listy, wygląda następująco:

1. Utwórz nowy obiekt węzeł. Węzeł zawiera dodawane dane.

2. Odwołanie do następnego węzła nowo utworzonego obiektu ustaw na

null.

3. Zmienne ogon i głowa (obie typu Węzeł) ustaw tak, aby odwoływały

się do nowo utworzonego obiektu węzeł.

background image

Dodawanie elementu do listy (2)

Procedura dodawania elementu do głowy listy wygląda następująco:

1. Sprawdź czy lista jest pusta. Jeżeli lista jest pusta wykonaj procedurę

dodawania pierwszego elementu.

2. Utworz nowy obiekt węzeł. Węzeł zawiera dodawane dane.

3. Odwołanie do następnego węzła nowo utworzonego obiektu ustaw na

obiekt wskazywany przez zmienną głowa.

4. Zmienną głowa ustaw tak, aby odwoływała się do nowo utworzonego

obiektu węzeł.

background image

Dodawanie elementu do listy (3)

Procedura dodawania elementu do ogona listy wygląda następująco:

1. Sprawdź czy lista jest pusta. Jeżeli lista jest pusta wykonaj procedurę

dodawania pierwszego elementu.

2. Utwórz nowy obiekt węzeł. Węzeł zawiera dodawane dane.

3. Odwołanie do następnego węzła nowo utworzonego obiektu ustaw na

null.

4. Odwołanie do następnego węzła obiektu wskazywanego przez zmienną

ogon ustaw tak, aby odwoływała się do nowo utworzonego obiektu
węzeł.

5. Zmienną ogon ustaw tak, aby odwoływała się do nowo utworzonego

obiektu węzeł.

background image

Wstawianie elementu do listy

Procedura wstawiania elementu do listy wygląda następująco:

1. Sprawdź czy lista jest pusta. Jeżeli lista jest pusta wykonaj procedurę

dodawania pierwszego elementu.

2. Utwórz nowy obiekt węzeł. Węzeł zawiera dodawane dane.

3. Znajdź węzeł, za którym należy wstawić nowo utworzony węzeł.

Nazwijmy ten węzeł poprzedni. Jeżeli węzeł poprzedni jest
ostatnim węzłem listy wykonaj procedurę dodawania elementu do
ogona. W przypadku, gdy nowy węzeł ma być pierwszym elementem
listy, wykonaj procedurę dodawania elementu do głowy.

4. Odwołanie do następnego węzła nowo utworzonego obiektu ustaw na

węzeł do którego odwołuje się .węzeł poprzedni.

5. Odwołanie do następnego węzła węzła poprzedni ustaw tak, aby

pokazywało na nowo utworzony obiekt węzeł.

background image

Usuwanie elementu z listy (1)

Procedura usuwania elementu z listy, gdy na liście jest jeden element, wygląda
następująco:

1. Usuń węzeł z pamięci.

2. Wartość zmiennych ogon i głowa ustaw na null.

Ponieważ w języku C# obiekty są usuwane z pamięci prze Garbage Collection
(automatyczny odśmiecacz pamięci), wystarczy wykonać tylko krok dwa.

background image

Usuwanie elementu z listy (2)

Procedura usuwania pierwszego elementu (głowy) z listy wygląda następująco:

1. Sprawdź czy lista ma jeden element, Jeżeli tak wykonaj procedurę

usuwania elementu z listy, gdy na liście jest jeden element.

2. Wskaż zmienną pomocniczą na element do usunięcia.

3. Wskaż zmienną głowa na drugi element w liście.

4. Usuń węzeł .wskazywany przez zmienną pomocniczą z pamięci.

Ponieważ w języku C# obiekty są usuwane z pamięci prze Garbage Collection
(automatyczny odśmiecacz pamięci), kroki dwa i cztery mogą być pominięte..

background image

Usuwanie elementu z listy (3)

Procedura usuwania ostatniego węzła (ogona) z listy wygląda następująco:

1. Sprawdź czy lista ma jeden element, Jeżeli tak wykonaj procedurę

usuwania elementu z listy, gdy na liście jest jeden element.

2. Wskaż zmienną pomocniczą na element do usunięcia.

3. Wskaż zmienną ogon na przedostatni element w liście. Krok ten w

listach jednokierunkowych jest operacją nieefektywną. Wymaga
przejścia całej liście. Problem efektywności tego kroku rozwiązują listy
dwukierunkowe, o których będzie mowa w dalszej części tego
rozdziału.

4. Odwołanie do następnego węzła obiektu wskazywanego przez zmienną

ogon (do tej pory przedostatni element listy) ustaw na null.

5. Usuń węzeł .wskazywany przez zmienną pomocniczą z pamięci.

Ponieważ w języku C# obiekty są usuwane z pamięci prze Garbage Collection
(automatyczny odśmiecacz pamięci), kroki dwa i pięć mogą być pominięte..

background image

Usuwanie elementu z listy (4)

Procedura usuwania ostatniego (ogona) węzła z listy wygląda następująco:

1. Sprawdź czy lista ma jeden element, Jeżeli tak, wykonaj procedurę

usuwania elementu z listy, gdy na liście jest jeden element.

2. Wskaż zmienną pomocniczą na element do usunięcia.

3. Jeżeli zmienna pomocnicza odwołuje się do pierwszego elementu listy

(głowy) wykonaj procedurę usuwania pierwszego elementu (głowy) z
listy. Jeżeli zmienna pomocnicza odwołuje się do ostatniego elementu
listy (ogona), wykonaj procedurę usuwania ostatniego węzła (ogona) z
listy.

4. Wskaż zmienną poprzedni na element poprzedzający element do

usunięcia.

5. Ustaw odwołanie do następnego węzła obiektu wskazywanego przez

zmienną poprzedni na węzeł występujący po węźle do skasowania.

6. Usuń węzeł wskazywany przez zmienną pomocniczą z pamięci.

Ponieważ w języku C# obiekty są usuwane z pamięci prze Garbage Collection
(automatyczny odśmiecacz pamięci), krok sześć może być pominięty..

background image

Inne rodzaje list

Usuwanie ostatniego elementu listy (ogona) z listy jednokierunkowej jest
operacją nieefektywną. Problem ten można rozwiązać stosując tak zwane listy
dwukierunkowe. W listach dwukierunkowych każdy węzeł oprócz wskazania
na swojego następnika, zawiera również pole pokazujące poprzednika. Wartość
poprzednika węzła głowa jest ustawiona na null.

Innym rodzajem listy, przydatnym w specyficznych sytuacjach są listy
cykliczne Specyficzną sytuacją jest np. zarządzanie przydziałem pewnego
zasobu dla kilku klientów - procesów, każdy proces ma dostęp do zasobu przez
pewien określony czas, po czym zasób jest przejmowany przez następny
proces.. W listach cyklicznych węzły tworzą pierścień. Każdy węzeł ma swój
następnik.

background image

Pytania sprawdzające

1. Zdefiniuj klasę Samochod, która będzie zawierać następujące pola: marka,

model, rok produkcji, przebieg

Odp.
class Samochod
{

public string Marka;

public string Model;

public int RokProdukcji;

public ulong Przebieg;

}

2. Jaki popełniono błąd w poniższym programie?


class Klasa{

public int Pole;

}
...
static void Main(){

Klasa a;

a.Pole = 10;

}

Odp.
W powyższym przykładzie używamy zmienną, która nie zawiera odwołania
do żadnego obiektu.

background image

Laboratorium

Ćwiczenie 1:
Napisz program, który będzie zawierał implementacje listy jednokierunkowej.
Do listy będą dodawane obiekty klasy Osoba. Klasa Osoba jest
zaimplementowana w projekcie Biblioteka. Projekt Biblioteka jest częścią
rozwiązania Kurs\Modul12\Start\Modul12\Modul12.sln, gdzie
Kurs jest katalogiem, gdzie skopiowano pliki kursu. Program będzie składał
się z dwóch podzespołów:

Biblioteki dll, o nazwie Listy, która będzie zawierała implementację listy
jednokierunkowej. W klasie lista będą zaimplementowane następujące
metody:

o IsEmpty - sprawdzenie czy lista jest pusta

o AddToHead - dodanie elementu na początek listy

o AddToTail - dodanie elementu na koniec listy

o DeleteFromHead - usunięcie elemntu z początku listy

o DeleteFromTail - usunięcie elementu z końca listy

o PrintAll - wypisanie na ekranie danych wszystkich elementów listy

o GetCount - zwraca ilość elementów w liście

Programu głównego, w którym przetestujemy listę.

background image

1. Skopiuj rozwiązanie

Kurs\Modul12\Start\Modul12\Modul12.sln, gdzie Kurs jest
katalogiem, gdzie skopiowano pliki kursu.

2. Otwórz skopiowane rozwiązanie Modul12.sln

3. Dodaj do bieżącego rozwiązania nowy projekt

a. Z menu File wybierz Add/New Project...

b. W oknie dialogowym Add New Project określ następujące

właściwości:

c. typu projektu: Visual C#/Windows

i. szablon: Class Library

ii. lokalizacja: Moje Dokumenty\Visual Studio 2005\Projects\

iii. nazwa projektu: Listy.

4. Podłącz do programu Listy, podzespół Biblioteka.

a. W okienku Solution Explorer, z menu kontekstowego związanego z

elementem reprezentującym projekt Listy wybierz Add Reference...

b. W okienku Add Reference przejdź do zakładki Projects, zaznacz

projekt Biblioteka i naciśnij OK.

5. Zaznacz, że będziemy korzystać z przestrzeni nazw Biblioteka.


using Biblioteka;

6. Zmień nazwę pliku Class1.cs na List.cs.

7. Zmień nazwę klasy z Class1 na List Wewnątrz klasy List zdefiniuj

klasę Node (Węzeł). .Do klasy Node dodaj następujące pola: pole Data
(Dane) typu Osoba, pole Next (Nastepny) typu Node. Do klasy List
dodaj pole Head (Glowa) i Tail (Ogon) typu Node.

public class List
{
public class Node
{
public Osoba Data;
public Node Next;
}
public Node Head, Tail;
}

8. Do klasy List dodaj metodę IsEmpty::


public static bool IsEmpty (List lista)
{
return lista.Head == null;
}

9. Do klasy List dodaj metodę AddToHead::


public static void AddToHead(List lista,Osoba os)
{

background image

Node tmp = new Node();
tmp.Data = os;
tmp.Next = lista.Head;
lista.Head = tmp;
if (lista.Tail == null)
lista.Tail = tmp;
}

10. Do klasy List dodaj metodę AddToTail::


public static void AddToTail (List lista,Osoba os)
{
Node tmp = new Node();
tmp.Data = os;
if (lista.Tail == null)
lista.Tail = lista.Head = tmp;
else
{
lista.Tail.Next = tmp;
lista.Tail = tmp;
}
}

11. Do klasy List dodaj metodę DeleteFromHead::


public static Osoba DeleteFromHead (List lista)
{
if (lista.Head == null) //lista pusta
throw new InvalidOperationException(

"Lista jest pusta");

Osoba x = lista.Head.Data;
if (lista.Head == lista.Tail
lista.Head = lista.Tail = null;
else
lista.Head = lista.Head.Next;
return x;
}

12. Do klasy List dodaj metodę DeleteFromTail::


public static Osoba DeleteFromTail (List lista)
{
if (lista.Tail == null) //lista pusta
throw new InvalidOperationException(

"Lista jest pusta");

Osoba x = lista.Tail.Data;
if (lista.Head == lista.Tail)
lista.Head = lista.Tail = null;
else
{
Node tmp;
for (tmp = lista.Head;

tmp.Next != lista.Tail; tmp = tmp.Next);

lista.Tail = tmp;
lista.Tail.Next = null;
}

background image

return x;
}

13. Do klasy List dodaj metodę PrintAll::


public static void PrintAll(List lista)
{
for (Node tmp = lista.Head; tmp != null;

tmp = tmp.Next)

{
Osoba.WypiszOsobe(tmp.Data);
Console.WriteLine();
}
}

14. Do klasy List dodaj metodę GetCount::


public static int GetCount(List lista)
{
int i;
Node tmp;
for (i = 0, tmp = lista.Head; tmp != null;

i++, tmp = tmp.Next) ;

return i;
}

15. Do rozwiązania dodaj nowy projekt, w którym będziemy testowali listę.

a. Z menu File wybierz Add/New Project...

b. W oknie dialogowym Add New Project określ następujące

właściwości:

i. typu projektu: Visual C#/Windows

ii. szablon: Console Application

iii. nazwa projektu: TestListy.

c. Uczyń nowo utworzony projekt projektem startowym

d.

Podłącz do programu TestListy, podzespóły Biblioteka oraz Listy.

e.

Zaznacz, że będziemy korzystać z przestrzeni nazw Biblioteka
oraz Listy.

using Biblioteka;
using Listy;

16. Napisz kod testujący listę


static char Menu()
{
Console.Clear();
Console.WriteLine("\n\t\tA - Dodaj osobę do

¬początku listy");

Console.WriteLine("\n\t\tB - Usuń pierwszą

¬osobę z listy");

Console.WriteLine("\n\t\tC - Dodaj osobę na

¬koniec listy");

background image

Console.WriteLine("\n\t\tD - Usuń ostatnią

¬osobę z listy");

Console.WriteLine("\n\t\tE - Podaj liczbę osób

¬na liście");

Console.WriteLine("\n\t\tF - Wypisz osoby z

¬listy");

Console.WriteLine("\n\t\tK - Koniec");
return Console.ReadKey(true).KeyChar;
}

static void Main(string[] args)
{
List mojaLista = new List();
Osoba tmp;
char c;

do
{
c = Menu();
switch (c)
{
case 'a':
case 'A':
Osoba.WprowadzOsobe(out tmp);
List.AddToHead(mojaLista, tmp);
break;
case 'b':
case 'B':
Console.WriteLine("Usunięta osoba to:");
Osoba.WypiszOsobe(

List.DeleteFromHead(mojaLista));

Console.ReadKey();
break;
case 'c':
case 'C':
Osoba.WprowadzOsobe(out tmp);
List.AddToTail(mojaLista, tmp);
break;
case 'd':
case 'D':
Console.WriteLine("Usunięta osoba to:");
Osoba.WypiszOsobe(

List.DeleteFromHead(mojaLista));

Console.ReadKey();
break;
case 'e':
case 'E':
Console.WriteLine("Liczba osób na liście

¬wynosi: {0}",

List.GetCount(mojaLista));
Console.ReadKey();
break;
case 'f':
case 'F':
List.PrintAll(mojaLista);
Console.ReadKey();

background image

break;
}
}
while (!(c == 'k' || c == 'K'));
}

17. Skompiluj i uruchom program.


Ćwiczenie 2:
Wymagania:
Wymagane jest ukończenie poprzedniego ćwiczenia.

Napisz program, który będzie zawierał implementacje kolejki FIFO przy
pomocy listy. Do kolejki będziemy dodawać zmienne typu Osoba. Klasa
Lista była zaimplementowana w poprzednim ćwiczeniu w programie Listy.
Program będzie składał się z dwóch podzespołów:

Biblioteki dll, o nazwie Kolejka, która będzie zawierała implementację
kolejki FIFO.

Programu głównego, w którym przetestujemy kolejkę.

1. Dodaj do bieżącego rozwiązania nowy projekt

a. Z menu File wybierz Add/New Project...

b. W oknie dialogowym Add New Project określ następujące

właściwości:

i. typu projektu: Visual C#/Windows

ii. szablon: Class Library

iii. nazwa projektu: KolejkaFIFO.

2. Podłącz do programu KolejkaFIFO, podzespóły Biblioteka oraz Listy.

c. W okienku Solution Explorer, z menu kontekstowego związanego z

elementem reprezentującym projekt KolejkaFIFO wybierz Add
Reference...

d. W okienku Add Reference przejdź do zakładki Projects, zaznacz

projekty Biblioteka oraz Listy i naciśnij OK.

3. Zaznacz, że będziemy korzystać z przestrzeni nazw Biblioteka i

Listy.

using Biblioteka;
using Listy;

4. Zmień nazwę pliku Class1.cs na Queue.cs.

5. Zmień nazwę klasy z Class1 na Queue. Do klasy Queue dodaj pole:

Kolejka typu List i :od razu je zainicjalizuj

public class Queue
{
public List Kolejka = new List();;

background image

...
}

6. Do klasy Queue dodaj metodę Enqueue:


public static void Enqueue(Queue q,Osoba os)
{
List.AddToTail(q.Kolejka, os);
}

7. Do klasy Queue dodaj metodę IsEmpty:


public static bool IsEmpty(Queue q)
{
return List.IsEmpty(q.Kolejka);
}

8. Do klasy Queue dodaj metodę Dequeue:


public static Osoba Dequeue(Queue q)
{
return List.DeleteFromHead(q.Kolejka);
}

9. Do klasy Queue dodaj metodę GetLength:


public static int GetLength(Queue q)
{
return List.GetCount(q.Kolejka);
}

10. Do rozwiązania dodaj nowy projekt, w którym będziemy testowali kolejkę.

a. Z menu File wybierz Add/New Project...

b. W oknie dialogowym Add New Project określ następujące

właściwości:

i. typu projektu: Visual C#/Windows

ii. szablon: Console Application

iii. nazwa projektu: KomitetKolejkowy.

c.

Uczyń nowo utworzony projekt projektem startowym

d.

Podłącz do programu KomitetKolejkowy, podzespół Biblioteka oraz
KolejkaFIFO.

e.

Zaznacz, że będziemy korzystać z przestrzeni nazw Biblioteka
oraz KolejkaFIFO.

using Biblioteka;
using KolejkaFIFO;

f. Napisz kod testujący kolejkę


static char Menu()
{
Console.Clear();

background image

Console.WriteLine("\n\t\tA - Dodaj osobę do

¬kolejki");

Console.WriteLine("\n\t\tB - Usuń osobę z

¬kolejki");

Console.WriteLine("\n\t\tC - Podaj liczbę

¬osób w kolejce");

Console.WriteLine("\n\t\tK - Koniec");
return Console.ReadKey(true).KeyChar;
}

static void Main(string[] args)
{
Queue mojaKolejka = new Queue();
Osoba tmp;
char c;

do
{
c = Menu();
switch (c)
{
case 'a':
case 'A':
Osoba.WprowadzOsobe(out tmp);
Queue.Enqueue(mojaKolejka, tmp);
break;
case 'b':
case 'B':
Osoba.WypiszOsobe(

Queue.Dequeue(mojaKolejka));

Console.ReadKey();
break;
case 'c':
case 'C':
Console.WriteLine("Liczba osób w

¬kolejce wynosi: {0}",

Queue.GetLength(mojaKolejka));
Console.ReadKey();
break;
}
}
while (!(c == 'k' || c == 'K'));
}

11. Skompiluj i uruchom program.

background image

Ćwiczenie 3:
Wymagania:
Wymagane jest ukończenie ćwiczenia pierwszego.

Napisz program, który będzie zawierał implementacje kolejki LIFO. Na stos
będziemy wkładać zmienne typu Osoba. Struktura Osoba była
zaimplementowana w ćwiczeniu pierwszym w programie Biblioteka. Koleka
LIFO będzie zaimplementowana przy pomocy listy jednokierunkowej, która
była utworzona w programie pierwszym. Program będzie składał się z dwóch
podzespołów:

Biblioteki dll, o nazwie Stos, która będzie zawierała implementację kolejki
LIFO.

Programu głównego, w którym przetestujemy stos.

1. Dodaj do bieżącego rozwiązania nowy projekt

e. Z menu File wybierz Add/New Project...

f. W oknie dialogowym Add New Project określ następujące

właściwości:

g. typu projektu: Visual C#/Windows

i. szablon: Class Library

ii. nazwa projektu: Stos.

2. Podłącz do programu Stos, podzespoły Biblioteka i Listy.

h. W okienku Solution Explorer, z menu kontekstowego związanego z

elementem reprezentującym projekt Stos wybierz Add Reference...

i.

W okienku Add Reference przejdź do zakładki Projects, zaznacz
projekt Biblioteka oraz Listy i naciśnij OK.

3. Zaznacz, że będziemy korzystać z przestrzeni nazw Biblioteka.i

Listy

using Biblioteka;
using Listy;

4. Zmień nazwę pliku Class1.cs na

Stack

.cs.

5. Zmień nazwę klasy z Class1 na Stack. Do klasy Stack dodaj pole

Czarownice typu List:i od razu je zainicjalizuj:

public struct Stack
{
List Czarownice = new List();
}

6. Do klasy Stack dodaj metodę Push:


public static void Push(Stack s,Osoba os)
{
List.AddToHead(s, os);
}

background image

7. Do klasy Stack dodaj metodę IsEmpty:


public static bool IsEmpty(Stack s)
{
return List.IsEmpty(s.Czarownice);
}

8. Do klasy Stack dodaj metodę Pop:


public static Osoba Pop(Stack s)
{
return List.DeleteFromHead(s.Czarownice);
}

9. Do klasy Stack dodaj metodę GetLength:


public static uint GetLength(Stack s)
{
return (uint)List.GetCount(s.Czarownice);
}

10. Do rozwiązania dodaj nowy projekt, w którym będziemy testowali stos.

a. Z menu File wybierz Add/New Project...

b. W oknie dialogowym Add New Project określ następujące

właściwości:

i. typu projektu: Visual C#/Windows

ii. szablon: Console Application

iii. nazwa projektu: Inkwizytor.

c.

Uczyń nowo utworzony projekt projektem startowym.

d.

Podłącz do programu Inkwizytor, podzespoły Biblioteka oraz Stos.

e. Zaznacz, że będziemy korzystać z przestrzeni nazw Biblioteka

oraz Stos.

using Biblioteka;
using Stos;

f. Napisz kod testujący kolejkę


static char Menu()
{
Console.Clear();
Console.WriteLine("\n\t\tA - Dodaj

¬czarownicę do stosu");

Console.WriteLine("\n\t\tB - Usuń czarownicę

¬ze stosu");

Console.WriteLine("\n\t\tC - Podaj liczbę

¬czarownic na stosie");

Console.WriteLine("\n\t\tK - Koniec");
return Console.ReadKey(true).KeyChar;
}

static void Main(string[] args)

background image

{
Stack mojaStos = new Stack();
Osoba tmp;
char c;

do
{
c = Menu();
switch (c)
{
case 'a':
case 'A':
Osoba.WprowadzOsobe(out tmp);
Stack.Push(mojaStos, tmp);
break;
case 'b':
case 'B':
Osoba.WypiszOsobe(

Stack.Pop(mojaStos));

Console.ReadKey();
break;
case 'c':
case 'C':
Console.WriteLine("Liczba czarownic

¬na stosie wynosi: {0}",

Stack.GetLength(mojaStos));

Console.ReadKey();
break;
case 'd':
case 'D':
Stack.Clear(ref mojaStos);
Console.WriteLine(

"Stos oprózniony!!!");

Console.ReadKey();
break;
}
}
while (!(c == 'k' || c == 'K'));
}

11. Skompiluj i uruchom program.


Wyszukiwarka

Podobne podstrony:
listy ang id 270580 Nieznany
Listy MAT id 270609 Nieznany
FM listy id 178271 Nieznany
listy do swiata id 270586 Nieznany
FM listy id 178271 Nieznany
Abolicja podatkowa id 50334 Nieznany (2)
4 LIDER MENEDZER id 37733 Nieznany (2)
katechezy MB id 233498 Nieznany
metro sciaga id 296943 Nieznany
perf id 354744 Nieznany
interbase id 92028 Nieznany
Mbaku id 289860 Nieznany
Probiotyki antybiotyki id 66316 Nieznany
miedziowanie cz 2 id 113259 Nieznany
LTC1729 id 273494 Nieznany
D11B7AOver0400 id 130434 Nieznany
analiza ryzyka bio id 61320 Nieznany

więcej podobnych podstron