• Nie Znaleziono Wyników

Wykład 8 - Dynamiczne struktury danych -uporządkowane(część II) 8.1. Lista jednokierunkowa uporządkowana 8.2. Lista dwukierunkowa 8.3. Drzewo binarne poszukiwań

N/A
N/A
Protected

Academic year: 2021

Share "Wykład 8 - Dynamiczne struktury danych -uporządkowane(część II) 8.1. Lista jednokierunkowa uporządkowana 8.2. Lista dwukierunkowa 8.3. Drzewo binarne poszukiwań"

Copied!
1
0
0

Pełen tekst

(1)

Wykład 8 - Dynamiczne struktury danych -uporządkowane(część II) 8.1. Lista jednokierunkowa uporządkowana

8.2. Lista dwukierunkowa

8.3. Drzewo binarne poszukiwań

Algorytmy stosowane w strukturach uporządkowanych sterowane są wartościami przechowywanymi w poszczególnych elementach tej struktury, w odróżnieniu od algorytmów dla struktur nieuporządkowanych, które sterowane są kolejnością powstawania elementów struktur ( stosy, kolejki...).

(2)

8.1. Lista jednokierunkowa uporządkowana

8.1.1. Wyszukanie w liście uporządkowanej za pomocą funkcji Szukaj 1) Lista pusta: Poczatek= NULLl; stąd Gdzie= NULL oraz Szukaj = 0

Dane_2

„A”

Nastepny Poczatek

jeśli (Poczatek) != NULL

Nast Dane_2

„A”

Nastepny

Poczatek Dane_3

„C”

Nastepny NULL

jeśli (strcmp(Poczatek^.Dane.Nazwisko, Klucz) == 0 ) wtedy Gdzie= NULL, Szukaj= 1, w przeciwnym wypadku

jeśli (strcmp(Poczatek^.Dane.Nazwisko, Klucz) > 0) wtedy Gdzie = NULL , Szukaj= 0;

2) Wyszukanie elementu na początku listy:

Dane_1

„D”

Nastepny NULL

3) Wyszukanie w środku lub na końcu listy:

 Gdzie=NULL;

 Nast=Poczatek;

 jeśli to nie jest ostatni element listy (Nast->Nastepny != NULL) i jeśli jeszcze można odszukać element równy kluczowi ( strcmp(Nast->Dane.Nazwisko, Klucz) = -1) wtedy:

 Gdzie= Nast;

 Nast= Nast->Nastepny;

w przeciwnym przypadku :

 Gdzie->Nastepny wskazuje na poszukiwany element równy Kluczowi i Szukaj = 1;

 lub Szukaj = 0 i Gdzie-> Nastepny wskazuje na element większy od Klucza

 lub Szukaj= 0 i Gdzie= Nast wskazuje na ostatni element listy mniejszy od Klucza Dane_1

„D”

Nastepny Gdzie

Gdzie= NULL Klucz= „A”

kolejność wstawiania elementów do listy

Klucz := „C”

(3)

Implementacja operacji wyszukania miejsca do wstawienia (Szukaj = 0) oraz elementu do usunięcia (Szukaj= 1)

#include <string.h>

#include "mlistaln.h"

#include "mlistalu.h"

{reszta funkcji jak dla listy nieuporządkowanej}

int Szukaj(PELEMENT Poczatek, char* Klucz, PELEMENT &Gdzie) { PELEMENT Nast;

Gdzie = NULL;

if (Pusty(Poczatek)) return 0;

Nast= Poczatek;

while (strcmp(Nast->Dane.Nazwisko,Klucz) < 0 &&

!Pusty(Nast->Nastepny)) {

Gdzie= Nast;

Nast = Nast->Nastepny;

}

if (strcmp(Nast->Dane.Nazwisko, Klucz)==0) return 1;

else {nie znaleziono w liście elementu większego od klucza}

if (strcmp(Nast->Dane.Nazwisko, Klucz) < 0) Gdzie= Nast;

return 0;

}

(4)

8.1.2. Wstawianie w miejsce wyszukane przez funkcję Szukaj= 0, gdy znalazła element większy od Klucza lub koniec listy (operacje implementowane jak dla listy nieuporządkowanej - wykład 11)

 Nowy->Nastepny= Poczatek

 Poczatek= Nowy

Nowy= new ELEMENTD, gdzie N=1,2,...N Nowy Dane_N

Nastepny NULL

if (Poczatek = NULL) Poczatek= Nowy;

Nowy

Dane_2

„A”

Nastepny Poczatek

Nowy Dane_2

„A”

Nastepny

Poczatek Dane_3

„C”

Nastepny NULL

2.2) wstawianie na początku listy, Szukaj= 0

Poczatek

if (Gdzie = NULL):

1) Tworzenie kolejnego elementu Nowy na stercie:

2) Wstawianie do listy kolejnego elementu Nowy

Nowy Dane_1

„D”

Nastepny NULL

2.1) wstawianie do listy pustej , Szukaj= 0

Dane_1

„D”

Nastepny

NULL

2.3) wstawianie wewnątrz lub na końcu listy (Szukaj= 0:)

jeśli Gdzie nie wskazuje na ostatni element listy, to Gdzie wskazuje na element większy od Klucza i wstawiaj wewnątrz listy,

 Nowy->Nastepny= Gdzie->Nastepny;

 Gdzie->Nastepny= Nowy

Dane_1

„D”

Nastepny Gdzie

„A” < „D”

„C” < „D”

Gdzie Dane_2

„A”

Nastepny

Poczatek Dane_1

„D”

Nastepny NULL

Dane_3

„E”

Nastepny

„E” > „D” Nowy

NULL

w przeciwnym przypadku Gdzie wskazuje na element mniejszy od Klucza i wstawiaj na końcu listy (te same przypisania):

8.1.3. Usuwanie w miejscu wyszukanym przez funkcję Szukaj= 1, gdy znalazła

(5)

element równy Kluczowi (operacje implementowane jak dla listy nieuporządkowanej - wykład 11)

Pom

Pom Dane_1

Nastepny

Poczatek Dane_2

Nastepny

Dane_3 Nastepny

NULL Gdzie

NULL 1) Usuwanie na początku listy: Szukaj=1 Gdzie= NULL

2) Usuwanie elementu w środku listy lub na końcu:

Dane_2

„A”

Nastepny

Poczatek Dane_3

„C”

Nastepny

Dane_2

„D”

Nastepny NULL

Dane_1 Nastepny Poczatek

Dane_2 Nastepny

Dane_3 Nastepny

NULL Gdzie

Gdzie= NULL

Klucz=”A jeśli Gdzie= NULL wtedy:

 Pom= Poczatek;

 Poczatek= Poczatek->Nastepny

 delete Pom;

Pom

jeśli Gdzie!= NULL wtedy usuwany jest element wskazywany przez Gdzie->Nastepny

 Pom= Gdzie->Następny;

 Gdzie->Następny = Pom->Nastepny

 delete Pom;

Gdzie != NULL nigdy nie wskazuje na ostatni element listy, stąd ostatni element listy jest wskazywany przez Gdzie->Nastepny i jest usuwany tak samo jak wewnątrz listy

(6)

8.2. Lista dwukierunkowa

Lista dwukierunkowa uporządkowana ma identycznie zaimplementowane procedury wstawiania, usuwania i przejścia przez strukturę (wykład 11), natomiast funkcja Szukaj, umożliwiająca wyszukanie elementów może być zaimplementowana podobnie jak dla listy jednokierunkowej lub z uwzględnieniem przejścia w obie strony

8.2.1. Wyszukanie zawsze od początku listy, podobnie jak dla listy jednokierunkowej

#include <string.h>

#include "mlistdln.h"

#include "mlistdl1.h"

{reszta funkcji jak dla listy nieuporządkowanej}

int Szukaj(PELEMENTD Poczatek, char* Klucz, PELEMENTD &Gdzie) { int wynik= 0;

Gdzie = Poczatek;

if (Pusty(Poczatek)) return wynik;

while (strcmp(Gdzie->Dane.Nazwisko, Klucz) < 0 &&

!Pusty(Gdzie->Nastepny)) Gdzie = Gdzie->Nastepny;

if (strcmp(Gdzie->Dane.Nazwisko, Klucz)== 0) wynik= 1;

{ znaleziono w liście element większy lub równy kluczowi}

if (strcmp(Gdzie->Dane.Nazwisko, Klucz) >= 0) Gdzie= Gdzie->Poprzedni;

return wynik;

}

(7)

8.2.2. Wyszukanie zawsze od miejsca ostatniego wyszukania, charakterystyczne dla listy dwukierunkowej

#include <string.h>

#include "mlistdln.h"

#include "mlistdl2.h"

{reszta funkcji jak dla listy nieuporządkowanej}

int Szukaj(PELEMENTD Poczatek, char* Klucz, PELEMENTD &Gdzie) { int wynik= 0;

if (Pusty(Poczatek)) {

Gdzie = Poczatek;

return wynik;

}

if (Pusty(Gdzie)) Gdzie= Poczatek;

if (strcmp(Gdzie->Dane.Nazwisko, Klucz)< 0)

while (strcmp(Gdzie->Dane.Nazwisko, Klucz) < 0 &&

!Pusty(Gdzie->Nastepny)) Gdzie = Gdzie->Nastepny;

else

if (strcmp(Gdzie->Dane.Nazwisko, Klucz)> 0)

while (strcmp(Gdzie->Dane.Nazwisko, Klucz) > 0 &&

!Pusty(Gdzie->Poprzedni)) Gdzie = Gdzie->Poprzedni;

if (strcmp(Gdzie->Dane.Nazwisko, Klucz)== 0) wynik= 1;

{ znaleziono w liście element większy lub równy kluczowi}

if (strcmp(Gdzie->Dane.Nazwisko, Klucz) >= 0) Gdzie= Gdzie->Poprzedni;

return wynik;

}

(8)

#include <conio.h> {przykład zastosowania}

#include <stdio.h>

#include <string.h>

#include "mlistdl2.h"

#include "elementy.h"

char * Tab_menu[POZ] = {"1 : Wstawianie","2 : Usuwanie",

"3 : Wydruk listy", "4 : Usun liste", " >4 Koniec programu"};

void Wstaw_do_listy(PELEMENTD& Poczatek,PELEMENTD& Gdzie);

void Usun_z_listy(PELEMENTD& Poczatek, PELEMENTD& Gdzie);

void Podaj_klucz(char* klucz);

void main(void)

{ PELEMENTD Poczatek, Gdzie; char Wybor;

clrscr(); Inicjalizacja(Poczatek);

do

{ Wybor= Menu(POZ, Tab_menu);

switch (Wybor)

{ case '1' : Wstaw_do_listy(Poczatek, Gdzie); break;

case '2' : Usun_z_listy(Poczatek, Gdzie); break;

case '3' : if (Dla_kazdego(Poczatek, Pokaz_dane)) Blad();break;

case '4' : Usun_Pamiec(Poczatek);

}

} while (Wybor < '5' && Wybor >'0' );}

void Podaj_klucz(char* klucz) { char bufor[DL+2];

bufor[0]= DL;

printf("\nPodaj klucz "); strcpy(klucz, cgets(bufor));}

void Wstaw_do_listy(PELEMENTD& Poczatek,PELEMENTD& Gdzie) { OSOBA Dana;

Dana= Dane();

if (!Szukaj(Poczatek, Dana.Nazwisko, Gdzie)) { if (Wstaw(Poczatek, Dana, Gdzie)) Blad();

else Dla_jednego(Poczatek, Gdzie, Pokaz_dane); } else Blad(); }

void Usun_z_listy(PELEMENTD& Poczatek, PELEMENTD& Gdzie) { char klucz[DL];

Podaj_klucz(klucz);

if (Szukaj(Poczatek, klucz, Gdzie)) {if( Usun(Poczatek, Gdzie)) Blad();}

else Blad(); }

(9)

8.3. Drzewo binarne poszukiwań 8.3.1. Podstawowe definicje

 nazwa typu wskaźnika na funkcję dla funkcji przejścia przez drzewo typedef void(* zrob)(OSOBA&);

 definicja elementu drzewa

typedef struct ELEMENTD* PELEMENTD;

struct OSOBA { int Numer;

char Nazwisko[DL];

};

struct ELEMENTD {OSOBA Dane;

PELEMENTD Lewy, Prawy;

};

8.3.2. Budowa interfejsu

void Inicjalizacja (PELEMENTD &Wezel);

{ działanie: inicjuje drzewo

warunki wstępne: Wezel wskazuje na pierwszy element, zwany korzeniem warunki końcowe: drzewo zostaje zainicjowane jako puste}

PELEMENTD Szukaj(PELEMENTD Wezel, char* Klucz);

{ działanie: szuka elementu w drzewie

warunki początkowe: Wezel wskazuje na zainicjowane drzewo, Klucz jest poszukiwanym elementem,

warunki końcowe: jeśli to możliwe, funkcja szuka elementu w drzewie równego Kluczowi idąc na lewo każdego z węzłów, jeśli element w węźle jest większy i na prawo, jeśli element w węźle jest mniejszy, natomiast jeśli znajdzie węzeł równy Kluczowi, zwraca wskazanie na ten element drzewa, w przeciwnym wypadku zwraca adres pusty}

(10)

int Wstaw(PELEMENTD &Wezel, PELEMENTD Pozycja);

{działanie: dodaje element do drzewa

warunki początkowe: Pozycja jest daną wstawianą do zainicjowanego drzewa, Wezel wskazuje na korzeń drzewa poszukiwań binarnych

warunki końcowe: jeśli to możliwe, funkcja dodaje daną Pozycja do drzewa idąc na lewo każdego z węzłów, jeśli element w węźle jest większy od Pozycja i na prawo, jeśli element w węźle jest mniejszy aż do osiągnięcia węzła z wolnym łączem Wezel, który po wstawieniu wskazuje na element Pozycja i zwraca wynik równy 0, natomiast jeśli znajdzie węzeł wskazywany przez Wezel z równym elementem, to kończy poszukiwania, usuwa element Pozycja i zwraca wynik równy 1}

void Us(PELEMENTD &Gdzie, PELEMENTD &Usuwany);

{działanie: usuwa element z drzewa

warunki początkowe: Gdzie jest węzłem początkowym będącym lewym następcą elementu Usuwany, Usuwany jest węzłem z usuwanymi danymi

warunki końcowe: jeśli jest to możliwe, funkcja szuka elementu największego idąc w prawo od węzła Gdzie, następnie wstawia kopię wartości znalezionego elementu do usuwanego węzła Usuwany i ustawia w Usuwany wskazanie na element Gdzie ze znalezionym elementem oraz podłącza lewego następcę znalezionego elementu Gdzie na jego miejsce w drzewie}

int Usun(PELEMENTD &Wezel, char* Klucz);

{działanie: usuwa element z drzewa

warunki początkowe: Wezel jest zainicjowanym drzewem, Klucz zawiera dane poszukiwane w drzewie

warunki końcowe: jeśli jest to możliwe, funkcja szuka elementu w drzewie równego Kluczowi idąc na lewo każdego z węzłów, jeśli element w węźle jest większy i na prawo, jeśli element w węźle jest mniejszy, natomiast jeśli znajdzie węzeł równy Kluczowi, to jeśli ma on tylko jednego następcę (prawego lub lewego), zostaje nim zastąpiony, następnie usunięty i zwraca wynik równy 0, a w przeciwnym przypadku (węzeł równy Kluczowi nie jest liściem) funkcja szuka elementu największego za pomocą funkcji Us, przekazując jej lewego następcę usuwanego węzła. Funkcja Us wyszukuje największy element drzewa, idąc na prawo, który może zastąpić element usuwany; po znalezieniu kopiuje jego wartość do elementu usuwanego, następnie podłącza do drzewa w miejsce skopiowanego elementu jego lewego następcę i przekazuje wskazanie na ten skopiowany element do funkcji Usun. Funkcja Usun usuwa ten element i zwraca wynik równy 0. W przypadku, kiedy nie znaleziono elementu, funkcja zwraca wynik równy 1}

(11)

void Usun_pamiec (PELEMENTD Wezel);

{ działanie: usuwa elementy z drzewa

warunki początkowe: Wezel jest zainicjowanym drzewem

warunki końcowe: funkcja przechodzi przez wszystkie gałęzie aż do osiągnięcia liści i usuwa je z pamięci zaczynając zawsze od lewego liścia. Każdy węzeł z usuniętymi liśćmi staje się liściem. Po zakończeniu usuwania liczba elementów w drzewie jest równa 0}

void Usun_drzewo(PELEMENTD &Wezel);

{ działanie: usuwa elementy z drzewa i inicjuje drzewo jako puste warunki początkowe: Wezel jest zainicjowanym drzewem

warunki końcowe: po wykonaniu funkcji Usun_pamiec, przekazując jej wskazanie Wezel, inicjuje wskazanie Wezel jako puste }

void Dla_kazdego (PELEMENTD Wezel, zrob funkcja);

{działanie: wykonuje funkcje na każdym wstawionym elemencie do drzewa

warunki początkowe: Węzeł jest zainicjowanym drzewem, zrob jest typem funkcji, która pobiera element drzewa i nie zwraca wartości

warunki końcowe: jeśli jest to możliwe, funkcja typu zrób jest wykonywana tylko raz dla każdego elementu wstawionego do drzewa zaczynając od najmniejszego elementu }

void Dla_jednego (PELEMENTD Wezel, char* Klucz, zrob funkcja);

{ działanie: wykonuje funkcja na elemencie wyszukanym w drzewie

warunki początkowe: Wezel jest zainicjowanym drzewem, zrob jest typem funkcji, która pobiera element z drzewa i nie zwraca wartości

warunki końcowe: funkcja typu zrób jest wykonywana tylko raz dla elementu z drzewa Wezel o wartości Klucza, jeśli zostanie wyszukany przez funkcję Szukaj}

(12)

8.3.3. Implementacja podstawowych funkcji 8.3.3.1. Wstawianie do drzewa

Należy wstawić do drzewa ciąg: 8, 5, 9, 2, 11, 1, 4, 3, 10, 15, 13, 7 , 6

8

5 9

2

1

2 3

4 1 8

8

5

8

5 9

1 2

1

2 3

8

5 9

2

4

11 1 1

1

2 3

4

7

5

6 8

5 9

2 11

1

2 3

4 5

8

5 9

2 11

1

1

2 3

4 5

8

5 9

2

1

2 3

4

11 5

8

5 9

2

4 10

11

1

1

2 3

4

7 9

5

6 8

5 9

2

4 10

11

1

1

2 3

4

7 9

5

6 6

8

5 9

2

4

3 11

1

1

2 3

4

7

8 5

6

3 8

3 8

15 10 1

6

4 7

3 8

10 9

15 10

13 11 7

12

6 13 ...

int Wstaw(PELEMENTD &Wezel, PELEMENTD Pozycja) {if (Wezel== NULL) {Wezel= Pozycja; return 0;}

if (strcmp(Pozycja->Dane.Nazwisko, Wezel->Dane.Nazwisko)<0) return Wstaw(Wezel->Lewy, Pozycja);

else

if (strcmp(Pozycja->Dane.Nazwisko, Wezel->Dane.Nazwisko)>0) return Wstaw(Wezel->Prawy, Pozycja);

else

{ delete Pozycja;

return 1;} }

(13)

8.3.3.2. Usuwanie z drzewa

8

5 9

2

4 10

11 1

1

2 3

4

7 9

5

6

3 8

15 10

13 11

8

5 9

2

4 10

11 1

1

2 3

4

7 9

5

6

15 10

13 11

8

5 9

2

4 10

11 1

1

2 3

4

7 9

5

6

13 11

8

5 9

2 4

10 1

1

2 3

4

7

9

6

13 11

7 9

2 4

10 1

3

4

7

9

6

13 11 7

12

7 12

7 12

7 12

5 12 2 613

6 13

6 13

6 13

6 13

void Us(PELEMENTD &Gdzie,PELEMENTD &Usuwany)

{ if (Gdzie->Prawy != NULL) Us(Gdzie->Prawy, Usuwany); //szukanie liścia

else //wymiana danych usuwanych z liściem

{ strcpy(Usuwany->Dane.Nazwisko, Gdzie->Dane.Nazwisko);

Usuwany= Gdzie;

Gdzie= Gdzie->Lewy;}}

int Usun(PELEMENTD &Wezel, char *Klucz) { PELEMENTD Usuwany;

if (Wezel != NULL)

if (strcmp(Klucz, Wezel->Dane.Nazwisko)<0) return Usun(Wezel->Lewy, Klucz);

else

if (strcmp(Klucz, Wezel->Dane.Nazwisko)>0) return Usun(Wezel->Prawy, Klucz);

else // znaleziono element do usunięcia

{ Usuwany= Wezel;

if (Usuwany->Prawy == NULL) Wezel= Usuwany->Lewy;

else if (Usuwany->Lewy == NULL) Wezel= Usuwany->Prawy;

else Us(Usuwany->Lewy, Usuwany);

delete Usuwany;

return 0;}

(14)

8.3.3.3. Przeszukiwanie w drzewie

PELEMENTD Szukaj(PELEMENTD Wezel, char *Klucz) {

if (Wezel == NULL) return NULL;

if (strcmp(Klucz, Wezel->Dane.Nazwisko)== 0) return Wezel;

else

if (strcmp(Klucz, Wezel->Dane.Nazwisko) < 0) return Szukaj(Wezel->Lewy, Klucz);

else

return Szukaj(Wezel->Prawy, Klucz);

}

void Dla_jednego (PELEMENTD Wezel, char* Klucz, zrob funkcja) {

PELEMENTD Gdzie;

Gdzie= Szukaj(Wezel, Klucz);

if (Gdzie!= NULL) funkcja(Gdzie->Dane);

}

Przejście uporządkowane przez drzewo

void Dla_kazdego (PELEMENTD Wezel, zrob funkcja) {

if (Wezel!= NULL)

{Dla_kazdego(Wezel->Lewy, funkcja);

funkcja(Wezel->Dane);

Dla_kazdego(Wezel->Prawy, funkcja);}}

void Usun_pamiec(PELEMENTD Wezel) {

if (Wezel != NULL)

{ Usun_pamiec((Wezel)->Lewy);

Usun_pamiec((Wezel)->Prawy);

delete Wezel; }}

void Usun_drzewo(PELEMENTD &Wezel) {

Usun_pamiec(Wezel);

Wezel=NULL;

}

(15)

#include <conio.h>

#include <string.h>

#include "mdrzewob.h"

#include "dodatki.h"

#include "we_wy.h"

char *Polecenia[POZ]={" Drzewo binarne", " Nacisnij:", " 1 - aby wstawic do drzewa "," 2 - aby usunac z drzewa ", " 3 - aby wyswietlic drzewo, ", " 4 - aby usunac drzewo, ", " 1<>5 - aby zakonczyc prace."};

void Podaj_klucz(char *Klucz);

void Wstaw_(PELEMENTD &Korzen);

void Usun_(PELEMENTD &Korzen);

void main(void)

{char Co; PELEMENTD Korzen;

Inicjalizacja(Korzen);

do

{Co = Menu(POZ,Polecenia);

switch(Co)

{ case '1' : Wstaw_(Korzen); break;

case '2' : Usun_(Korzen); break;

case '3' : Dla_kazdego(Korzen, Pokaz_dane); break;

case '4' : Usun_drzewo(Korzen); break;

default : Komunikat("\r\nKoniec programu");

}}while (Co < '6' && Co >'0');}

void Podaj_klucz(char* Klucz) {char bufor[DL+2]; bufor[0]=DL;

cprintf("\r\nPodaj klucz: ");

strcpy(Klucz,cgets(bufor));}

void Wstaw_(PELEMENTD &Korzen) { OSOBA Dana; PELEMENTD Nowy;

Dana= Dane();

if ((Nowy= Nowy_element(Dana)) == NULL) Komunikat("\r\nBrak pamieci");

else

if (Wstaw(Korzen, Nowy)) Komunikat("\r\nElement jest juz w drzewie");

else Dla_jednego(Korzen, Dana.Nazwisko, Pokaz_dane); } void Usun_(PELEMENTD &Korzen)

{char Klucz[DL];

Podaj_klucz(Klucz);

if (Usun(Korzen,Klucz)) Komunikat("\r\nNie znaleziono elementu");

Cytaty

Powiązane dokumenty

Określ długość pręta drgającego z taką samą częstotliwością.. Oblicz maksymalną wartość energii potencjalnej i

Określ długość pręta drgającego z taką samą

W ściance bocznej dużego zbiornika, 5 m pod powierzchnią lustra wody znajduje się malutki otwór. Do jakiego ciśnienia należy napompować dętkę, aby zapewnić

Określ długość pręta drgającego z taką samą częstotliwością.. Oblicz maksymalną wartość energii potencjalnej i

• Jeśli lista jest pusta (rozpoznajemy po tym, że pierwszy wskaźnik nadal wskazuje na początek listy, a drugi pozostał na NULL):. • dodajemy element

Na kolejnych slajdach przedstawiono podstawowe operacje na liście dwukierunkowej:. • dodanie elementu na początku

Zad 3) Zestaw lampek choinkowych składa się z żarówek o napięciu znamionowym 14V i mocy 5W. Z ilu żarówek musi składad się zestaw, aby mógł byd zasilany

Używając pakietu R, przeprowadzić analizy opisane w Rozdziale 8 książki Agresti (2002) dla danych ankietowych dotyczących używek (A-Alcohol, C-Cigarette, M-Marijuana) z Tabeli