dynamiczna struktura danych.doc

(426 KB) Pobierz
int Losuj()

Tablice struktur cd.

 

1. Dynamiczna tablica struktur

Nazwa: -                 Dynamiczna tablica nieuporządkowanych elementów

Własności: Potrafi przechować ciąg o ograniczonym rozmiarze wskazań elementów

Dostępne działania:              

Inicjalizacja tablicy

Określenie, czy lista jest pełna

Określenie, czy lista jest pusta

Powiększanie tablicy

Dodanie  elementu wewnątrz, na początku i na końcu ciągu elementów,

Usuwanie elementu wewnątrz, na początku i na końcu ciągu elementów,

Usuwanie całej tablicy i inicjowanie tablicy


#include <conio.h>              //tab22.cpp

#include <stdio.h>

#include <string.h>

// definicja typu OSOBA

const int DL=10;

struct OSOBA

{int Wzrost;

  char Nazwisko[DL];

};

//deklaracje uniwersalnych funkcji we/wy dla struktur typu OSOBA

void Pokaz_dane (OSOBA &Dana);

OSOBA Dane();

// deklaracje pomocniczych funkcji obsługujących menu programu oraz komunikaty

const int POZ=7;

char Menu(const int ile, char *Polecenia[POZ]);

 

// deklaracje funkcji dla zdefiniowanej dynamicznej tablicy struktur jako listy nieuporządkowanej

OSOBA* new_(OSOBA* tab, int ile, int &N);

int Wstaw(OSOBA*tab, OSOBA dane, int ktory, int &ile, int N);

int Usun(OSOBA*tab, int ktory, int &ile);

int Wyswietl(OSOBA*tab, int ile);

void Usunpamiec(OSOBA*&tab, int&ile, int&N);

 

//przykładowa aplikacja wykorzystująca listę nieuporządkowaną reprezentowaną przez dynamiczną //tablicę struktur (tab22.cpp)

 

char *Polecenia[POZ]={"Tablica OSOBA* tab - obsluga typu lista",

" Nacisnij:",

" 1 - aby wstawic element do listy osob",

" 2 - aby usunac element z listy osob",

" 3 - aby wyswietlic liste osob, ",

" 4 - aby usunac liste osob",

" Esc - aby zakonczyc prace."};

 

char *Stan[]=

{"Tablica pelna",

" Wstawiono poprawnie",

" Zly numer do wstawienia",

" Tablica pusta",

" Usunieto poprawie",

" Zly numer do usuwania",

" Wyswietlono poprawnie",

" Brak pamieci"};

// funkcja ogólnego przeznaczenia

int Integer(char*);


void main(void)

{int ile=0, N=0, ktory, stan;

OSOBA* tab=NULL;

char Co;

do

  { Co = Menu(POZ,Polecenia);

    swich(Co)

    {case '1' : OSOBA pom = Dane();

                    ktory = Integer("\nPodaj indeks tablicy: ");

                    if (ile == N) tab = new_(tab, ile, N);

                    if (ile == N) printf("%s\n", Stan[7]);                      

                   else

                     { stan = Wstaw(tab, pom, ktory, ile, N);

                        printf("%s\n", Stan[stan]); }                                    break;

     case '2' : ktory = Integer("\nPodaj indeks: ");

                    stan = Usun(tab, ktory, ile);

                    printf("\n%s\n", Stan[stan]);                                        break;

     case '3' : stan = Wyswietl(tab, ile);

                    printf("\n%s\n", Stan[stan]);                                        break;

     case '4' : Usunpamiec(tab, ile, N);                                               break;

     case 27 : printf("%s\n","\nKoniec programu");                             break;

     default  : printf("%s\n","\nZla opcja");

    }

    getch();

   }while (Co !=27);

   delete[] tab;

}

int Integer(char* s)

{ int ktory;

   printf("\n\n%s",s);

   scanf("%d",&ktory);

   return ktory; }

//definicje uniwersalnych funkcji we/wy dla struktur typu OSOBA

OSOBA Dane()

{ char bufor[DL+2];

   OSOBA Nowy;

   bufor[0]=DL;

   Nowy.Wzrost=Integer("\nwzrost: ");

   printf("\nnazwisko: ");

   strcpy(Nowy.Nazwisko,cgets(bufor));

   return Nowy; }

void Pokaz_dane(OSOBA &Dana)

{ printf("\n\nWzrost: %d\n", Dana.Wzrost);

   printf("Nazwisko:        %s\n", Dana.Nazwisko);

   printf("Nacisnij dowolny klawisz...\n");

   getch();  }


// definicje pomocniczych funkcji obsługujących menu programu oraz komunikaty

char Menu(const int ile, char *Polecenia[])

  { clrscr();

    for (int i=0; i<ile;i++)

       printf("\n%s",Polecenia[i]);

    return getch();   }

 

//definicje funkcji obsługujących dynamiczną tablice struktur takie jak dla statyczne tablicy //struktur

int Wstaw(OSOBA* tab, OSOBA dane, int ktory,int &ile, int N)

{ if (ile==N) return 0;

   if( ktory<0 || ktory>ile) return 2;

   for (int i=ile; i>ktory; i--)             // założenia: 0<=ile<N i 0<=ktory<=ile

       tab[i]=tab[i-1];

   tab[ktory]=dane;

   ile++;

   return 1;}

int Usun(OSOBA* tab, int ktory, int &ile)

{ if (ile==0) return 3;

    if (ktory<0 || ktory>=ile) return 5;

   for (int i=ktory; i<ile-1; i++)     // założenia: 0<ile<=N i 0<=ktory<=ile-1

           tab[i]=tab[i+1];

   ile--;

   return 4; }

int Wyswietl(OSOBA* tab, int ile)

{ if(ile==0) return 3;

   for (int i=0; i<ile;i++)

     Pokaz_dane(tab[i]);   //wykonaj czynność na elementach tablicy

   return 6; }



//zwiększanie tablicy - jeśli się powiedzie, zwracany jest adres nowej tablicy

                            //jeśli nie - zwracany jest adres tablicy dotychczasowej

OSOBA* new_(OSOBA* tab, int ile, int &N)

{ OSOBA* pom= new OSOBA[N+5];

   if (pom!=NULL)

     { N+=5;

       for (int i=0; i<ile;i++)                            //memmove(pom,tab,ile*sizeof(OSOBA));

              pom[i]=tab[i];           //kopiowanie struktur z tablicy starej do nowej, większej

       delete[] tab;                                                                                    //usuwanie tablicy starej

       tab=pom;                                          //przekazywanie adresu tablicy nowej do programu przez return

     }                                                                                                  //czyli wskaźnika pierwszego elementu

  return tab;

}

void Usunpamiec(OSOBA*&tab, int&ile, int&N)

{ delete[] tab;                                                                                     //usuwanie tablicy z pamięci

   ile=0;                                                                                                                                            //inicjowanie danych tablicy

   N=0;  

   tab=NULL; }

2.   
Statyczna tablica wskaźników na dynamiczne struktury

Nazwa:                 Statyczna tablica wskazań nieuporządkowanych elementów

Własności: Potrafi przechować ciąg o ograniczonym rozmiarze wskazań elementów

Dostępne działania:              

Inicjalizacja tablicy

Określenie, czy lista jest pełna

Określenie, czy lista jest pusta

Utworzenie elementu w pamięci i dodanie jego wskazania niepustego wewnątrz, na początku i na końcu listy,

Usuwanie elementu z pamięci i jego wskazania wewnątrz, na początku i na końcu listy,

Usuwanie pamięci dla elementów, których wskazania przechowuje tablica

 


#include <conio.h> //tab33.cpp

#include <stdio.h>

#include <string.h>

 

// definicja typu OSOBA

const int DL=10;

struct OSOBA

{int Wzrost;

  char Nazwisko[DL];

};

//deklaracje uniwersalnych funkcji we/wy dla struktur typu OSOBA

void Pokaz_dane (OSOBA &Dana);

OSOBA Dane();

// deklaracje pomocniczych funkcji obsługujących menu programu oraz komunikaty

const int POZ=7;

char Menu(const int ile, char *Polecenia[POZ]);

// deklaracje funkcji dla zdefiniowanej statycznej tablicy wskaźników na dynamiczne struktury jako listy //nieuporządkowanej

const int N=5;

int Wstaw(OSOBA**tab, OSOBA dane, int ktory, int &ile);

int Usun(OSOBA**tab, int ktory, int &ile);

int Wyswietl(OSOBA**tab, int ile);

void Usunpamiec(OSOBA**tab, int&ile);

 

//przykładowa aplikacja wykorzystująca listę nieuporządkowaną reprezentowaną

//przez statyczną tablicę wskaźników na dynamiczne struktury (tab33.cpp)

char *Polecenia[POZ]={"Tablica OSOBA* tab[N] - obsluga typu lista",

" Nacisnij:",

" 1 - aby wstawic element do listy osob",

" 2 - aby usunac element z listy osob",

" 3 - aby wyswietlic liste osob, ",

" 4 - aby usunac liste osob",

" Esc - aby zakonczyc prace."};

 

char *Stan[]=

{"Tablica pelna",

" Wstawiono poprawnie",

" Zly numer do wstawienia",

" Tablica pusta",

" Usunieto poprawie",

" Zly numer do usuwania",

" Wyswietlono poprawnie",

" Brak pamieci"};

 

// funkcja ogólnego przeznaczenia

int Integer(char*);

 

void main(void)

{ int ile=0, ktory, stan;

  OSOBA*tab[N];

  char Co;

...

Zgłoś jeśli naruszono regulamin