Vous êtes sur la page 1sur 10

Materia uzupeniajcy do wiczen z przedmiotu: Jzyk programowania obiektowego - wiczenia na wskanikach

13 maja 2009
Uwaga !!! W ramach zaj, ktre si niestety z uwagi na Juwenalia nie odbd w dniach 15.05 oraz 22.05, prosz o wykonanie nastpujcych zada: 1. Pitek: 15 maja Wiedzc, e deklarowanie typu rekordowego w jzyku C/ C++ wyglda nastpujco: struct element { char * imie; element *next; }; za deniowanie zmiennych takiego typu zoonego (struktura w C/C++) wyglda nastpujco: struct element *poczatek; Napisz program wyposaony w funkcje pozwalajce stworzy a nastpnie edytowa przy wykorzystaniu wskaniw kolejki w stylu FIFO czyli zgodnie z zasad:[First In First Out]: Kolejne funkcje powinny pozwala:
void tworzListe(void) - funkcja pozwala tworzy list od samego pocztku. Kolejne slajdy pokazj etapy dodawania nowych elementw do listy:

jeli to pusta lista (dotd nie stworzona) to: * Pocztek listy (zmienna poczatek) wskazuje na N U LL. * Tworzymy element typu element o nazwie nowy. Wypeniamy jego zawarto (wpisujemy imi do pola imie) oraz przypisujemy aby wskazywa on na N U LL. 1

Rysunek 1: Lista jest jeszcze pusta


* Przepisujemy wskazanie zmiennej poczatek tam gdzie faktycznie jest pocztek, a wic tam gdzie teraz jest element nowy. Dodajemy kolejny element (nie pierwszy na licie) - rysunek 3. * Ustawiamy si zmienn pomocnicz na pocztku listy. Przechodzimy ca list element po elemencie (pomocniczy = pomocniczy next) tak dugo dopki pomocniczy next nie wskazuje na N U LL. (Rysunek 4) * Tworzymy i wypeniamy nowy element danymi. Przepisujemy wskazanie pomocniczy next na element nowy, a nowy next na N U LL (rysunek 5). Teraz lista wyglda nastpujco (rysunek 6): W tym celu naley si przesun element po elemencie a do koca listy (rysunek 7). void usun() Funkcja usu ma usuwa elementy z pocztku listy. W tym celu naley wogle sprawdzi czy lista czasem nie jest juz pusta (poczatek == N U LL ?). Jeli nie to przypisujemy zmienn pomocnicz pomocniczy tam gdzie wskazuje pocztek listy, a nastpnie przepisujemy wskazanie zmiennej poczatek tam gdzie wskazuje jej pole next i usuwamy zmienn pomocniczy. void wyswietl(void) Funkcja pozwala na wywielenie po kolei wszystkich elementw listy. void szukaj(char * tekst) Funkcja pozwala wyszuka elementy o podanym tekcie (imieniu). Funkcja zlicza liczb wystapie tego tekstu i na jakich pozycjach w liscie wystpi.

Rysunek 2: Dodajemy pierwszy element Poniej zamieszczono kod programu realizujcego funkcje: tworzListe(), wyswietl() oraz usun().

#include <stdlib.h> #include <stdio.h> #include <conio.h> #include <string.h> #include <iostream.h> struct osoba { int i; char * imie; osoba *nast; }; struct osoba *begin; void usun() { struct osoba *pom; 3

Rysunek 3: Dodajemy kolejny element (nie pierwszy na licie)

Rysunek 4: Tworzenie nowego elementu.Ustawiamy si na pocztku listy pom = begin; if ( begin == NULL) cout<<"brak elementow"; else {

Rysunek 5: Poczenie listy dotychczasowej z nowym elementem. Doczenie go na kocu listy.

Rysunek 6: Lista dwch elementw pom = begin; if (pom->nast !=NULL) {begin = pom->nast; pom->nast = NULL;} else begin=NULL; } } void wyswietl(void) { int i=0; struct osoba *pom;

Rysunek 7: Dodanie kolejnego (trzeciego) elementu

Rysunek 8: Przechodzenie caej listy. etap 1 if ( begin == NULL) cout<<"brak elementow"; else { 6

Rysunek 9: Przechodzenie caej listy. etap 2

Rysunek 10: Doczenie na kocu 3 elementu pom = begin; while (pom != NULL) { cout<<"\n element nr: "<<++i<< " to "<<pom->imie<<" \n"; pom = pom->nast; } } 7

}; void tworzListe(void) { struct osoba *nowy,*pocz,*biez; char *i,*p,znak; nowy=pocz=biez=NULL; cout<<"\n Program: lista jednokierunkowa do przodu.\n "; do { nowy = (struct osoba *)malloc(sizeof(struct osoba)); i=(char *)malloc(512*sizeof(char)); cout <<"Podaj imie: " <<endl; cin>>i; nowy->imie = (char *)malloc((strlen(i)+1)*sizeof(char)); strcpy(nowy->imie, i); if (pocz==NULL) { cout<<"\n To jest pierwszy elemement na liscie."; begin=nowy; pocz=nowy; biez=nowy; biez->nast = NULL; } else { biez->nast = nowy; biez=nowy; nowy->nast = NULL; } cout<<"Chcesz dodac element ?"; cin>>znak; } while(znak !=n); }

int main(int argc, char *argv[]) { struct osoba *begin; char znak; char* t; //clrscr(); begin = NULL; do { cout<<"Wybierz operacje?\n"; 8

cout<<"dodaj nowy element [d]\n"; cout<<"Pokaz cala liste [p]\n"; cout<<"Usun element z poczatku listy [u]\n"; cout<<"Zakoncz program [k]\n"; cin>>znak; if (znak == d) tworzListe(); else if (znak==p) wyswietl(); else if (znak == u)usun(); else break; }while (znak !=k); system("PAUSE"); return 0; } 2. Pitek: 22 maja: Uzupenij program z poprzednich wicze o nastpujce elementy:
Na pocztku ma si wywietla menu gwne, ktre proponuje rne moliwoci: poka ca list, szukaj wybranego elementu, usu z pocztku, usu z koca, usu wskazany elementy, zlicz elementy, zakocz. Dopisz do napisanego ju na poprzednich zajciach programu wyposaonego w funkcje pozwalajce stworzy a nastpnie edytowa przy wykorzystaniu wskaniw kolejki w stylu FIFO czyli zgodnie z zasad:[First In First Out]: void tworzListe(void), void wyswietl(void) oraz void usu(void), nowe (nastpujce) funkcje:

- int liczbaSzukanychElementow(char *) funkcja pozwala zliczy liczb elementw o podanym kryterium (acuch tekstowy: imie, nazwisko); - boolean SzukajElement(char *) funkcja pozwala sprawdzi czy na licie istnieje element o podanym kryterium (acuch tekstowy: imie, nazwisko); - void dodajElementNaPozycje(int) funkcja pozwala doda nowy element na pozycj wskazan indeksem bdcym argumentem funkcji. Jeli taka pozycja nie istnieje na licie to nowy element naley doda na kocu listy; - int zliczElementy(char *) funkcja zlicza wszystkie rekordy o podanym imieniu. Mwi, te na ktrych pozycjach listy one wystapiy.
Teraz nasz program powinien pozwala na zapis caej listy do pliku tekstowego. Ostatecznie, program powinien pozwala na zaimportowanie listy z pliku tekstowego.

Materia uzupeniajcy do wiczen z przedmiotu: Jzyk programowania obiektowego - wiczenia na wskanikach


1. Zmodykuj program z 15 i 22 maja tak by realizowa on te same funkcje ale na licie dwukierunkowej. 2. Lista dwukierunkowa rni si od listy jednokierunkowej, czy stosu tym jedynie, i w strukturze swojej ma dwa pola wskanikowe. Jedno wskazuje na element poprzedzajcy dany element na licie, drugie wskazujce na element nastpny. To pozwala duo atwiej porusza si po takiej strukturze dynamicznej: struct element { char * imie; element *next; element *prev; };

10

Vous aimerez peut-être aussi