Materiał uzupełniający do ćwiczen z przedmiotu: Programowanie w C ++ - ćwiczenia na wskaźnikach 27 kwietnia 2012 Wiedząc, że deklarowanie typu rekordowego w języku C/ C++ wygląda następująco: struct element char * imie; element *next; ; zaś definiowanie zmiennych takiego typu złożonego (struktura w C/C++) wygląda następująco: struct element *poczatek; Napisz program wyposażony w funkcje pozwalające stworzyć a następnie edytować przy wykorzystaniu wskaźniów 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 początku. Kolejne slajdy pokazją etapy dodawania nowych elementów do listy: jeśli to pusta lista (dotąd nie stworzona) to: Początek listy (zmienna poczatek) wskazuje na N U LL. Tworzymy element typu element o nazwie nowy. Wypełniamy jego zawartość (wpisujemy imię do pola imie) oraz przypisujemy aby wskazywał on na NULL. Przepisujemy wskazanie zmiennej poczatek tam gdzie faktycznie jest początek, a więc tam gdzie teraz jest element nowy. Dodajemy kolejny element (nie pierwszy na liście) - rysunek 3. Ustawiamy się zmienną pomocniczą na początku listy. Przechodzimy całą listę element po elemencie (pomocniczy = pomocniczy next) tak długo dopóki pomocniczy next nie wskazuje na NULL. (Rysunek 4) 1
Rysunek 1: Lista jest jeszcze pusta Rysunek 2: Dodajemy pierwszy element 2
Rysunek 3: Dodajemy kolejny element (nie pierwszy na liście) Rysunek 4: Tworzenie nowego elementu.ustawiamy się na początku listy Tworzymy i wypełniamy nowy element danymi. Przepisujemy wskazanie pomocniczy next na element nowy, a nowy next na NULL (rysunek 5). Teraz lista wygląda następująco (rysunek 6): W tym celu należy się przesunąć element po elemencie aż do 3
Rysunek 5: Połączenie listy dotychczasowej z nowym elementem. Dołączenie go na końcu listy. Rysunek 6: Lista dwóch elementów końca listy (rysunek 7). void usun() Funkcja usuń ma usuwać elementy z początku listy. W tym celu należy wogóle sprawdzić czy lista czasem nie jest juz pusta (poczatek == N U LL?). Jeśli nie to przypisujemy zmienną pomocniczą pomocniczy tam gdzie wskazuje początek listy, a następnie przepisujemy wskazanie zmiennej poczatek tam gdzie wskazuje jej pole next i usuwamy zmienną pomocniczy. void wyswietl(void) Funkcja pozwala na wyświelenie po kolei wszystkich elementów listy. void szukaj(char * tekst) Funkcja pozwala wyszukać elementy o podanym 4
Rysunek 7: Dodanie kolejnego (trzeciego) elementu Rysunek 8: Przechodzenie całej listy. etap 1 tekście (imieniu). Funkcja zlicza liczbę wystapień tego tekstu i na jakich pozycjach w liscie wystąpił. 5
Rysunek 9: Przechodzenie całej listy. etap 2 Rysunek 10: Dołączenie na końcu 3 elementu Poniżej zamieszczono kod programu realizującego funkcje: tworzliste(), wyswietl() oraz usun(). #include <stdlib.h> #include <stdio.h> #include <conio.h> 6
#include <string.h> #include <iostream.h> struct osoba int i; char * imie; osoba *nast; ; struct osoba *begin; void usun() struct osoba *pom; pom = begin; if ( begin == NULL) cout<<"brak elementow"; else pom = begin; if (pom->nast!=null) begin = pom->nast; pom->nast = NULL; else begin=null; void wyswietl(void) int i=0; struct osoba *pom; if ( begin == NULL) cout<<"brak elementow"; else pom = begin; while (pom!= NULL) cout<<"\n element nr: "<<++i<< " to "<<pom->imie<<" \n"; pom = pom->nast; ; 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 7
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"; 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(); 8
else break; while (znak!= k ); system("pause"); return 0; 9
Materiał uzupełniający do ćwiczen z przedmiotu: Język programowania obiektowego - ćwiczenia na wskaźnikach część II 27 kwietnia 2012 1. Dopisz do napisanego już na poprzednich zajęciach programu wyposażonego w funkcje pozwalające stworzyć a następnie edytować przy wykorzystaniu wskaźniów kolejki w stylu FIFO czyli zgodnie z zasadą:[first In First Out]: void tworzliste(void), void wyswietl(void) oraz void usuń(void), nowe (następujące) funkcje: - int liczbaszukanychelementow(char *) funkcja pozwala zliczyć liczbę elementów o podanym kryterium (łańcuch tekstowy: imie, nazwisko); - boolean SzukajElement(char *) funkcja pozwala sprawdzić czy na liście istnieje element o podanym kryterium (łańcuch tekstowy: imie, nazwisko); - void dodajelementnapozycje(int) funkcja pozwala dodać nowy element na pozycję wskazaną indeksem będącym argumentem funkcji. Jeśli taka pozycja nie istnieje na liście to nowy element należy dodać na końcu listy; 2. Lista dwukierunkowa różni się od listy jednokierunkowej, czy stosu tym jedynie, iż w strukturze swojej ma dwa pola wskaźnikowe. Jedno wskazuje na element poprzedzający dany element na liście, drugie wskazujące na element następny. To pozwala dużo łatwiej poruszać się po takiej strukturze dynamicznej: struct element char * imie; element *next; element *prev; ; Zmodyfikuj program z trzema podstawowymi funkcjami z poprzednich zajęć tak, aby miał on formę listy dwukierunkowej. 10