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 edy- tować przy wykorzystaniu wskaźniów kolejki w stylu FIFO czyli zgodnie z za- sadą:[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 N U LL.
∗ 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. Przechodz- imy całą listę element po elemencie (pomocniczy = pomocniczy→ next) tak długo dopóki pomocniczy → next nie wskazuje na N U LL. (Rysunek 4)
Rysunek 1: Lista jest jeszcze pusta
Rysunek 2: Dodajemy pierwszy element
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 N U LL (rysunek 5). Teraz lista wygląda następująco (rysunek 6): W tym celu należy się przesunąć element po elemencie aż do
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
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ł.
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>
#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
{
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();
else break;
}while (znak !=’k’);
system("PAUSE");
return 0;
}
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ępu- ją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 el- ement 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 el- ement 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.