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);
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;
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
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
// 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",
{ int ile=0, ktory, stan;
OSOBA*tab[N];
...
chesschempion