Documente Academic
Documente Profesional
Documente Cultură
Moldova
RAPORT
Lucrare de laborator
nr.3 la Matematici
Speciale
Leca Vitalie
A efectuat:
st. gr. CR-202
A verificat: lect.
univ.
Gorban Maria
Chişinău -2021
Lucrarea de laborator nr.3
1. SCOPUL LUCRĂRII:
Studierea algoritmilor de căutare în graf și a diferitor forme de păstrare și prelucrare a datelor.
Elaborarea procedurii de căutare în adâncime.
2. NOTE DE CURS
Structuri de date: liste
Fiecare tip de listă definește o mulțime de șiruri finite de elemente de tipul declarat. Numărul de
elemente, care se numește lungimea listei, poate varia pentru diferite liste de același tip. Lista care nu
conține nici un element se va numi vidă. Pentru listă sunt definite noțiunile începutul, sfârșitul listei și,
respective, primul și ultimul element, de asemenea elemental current ca și predecesorul și succesorul
elementului current. Elementul current se numește acel unic element care este accesibil la momentul
dat.
Firele de așteptare (FA, rând, coadă, șir de așteptare) se vor folosi pentru a realiza algoritmul de
prelucrare a elementelor listei, în conformitate cu care elementele vor fi eliminate din listă în ordinea
în care au fot inclise în ea (primul sosit – primul servit)
Se va define o mulțime de structure, fiecare din care va consta dintr-un obiect de bază, numit vârf sau
rădăcina arborelui dat, și o listă de elemente din mulțimea definite, care (elementele) se vor numi
subarbori ai arborelui dat. Arborele petru care lista subarborilor este vidă se va numi arbore trivial,
iar rădăcina lui – frunză.
Rădăcina arborelui se va numi tatăl vârfurilor, care servesc drept rădăcini pentru subarbori; aceste
vârfuri se vor mai numi copiii rădăcinii arborelui: rădăcina primului subarbore se va numi fiul cel
mai mare, iar rădăcina fiecărui subarbore următor în listă se va numi frate.
3. SARCINA DE BAZĂ
1. Elaborați procedura căutării în adâncime într-un graf arbitrar. Elaboraţi procedura care va realiza
algoritmul de parcurgere a grafului în lărgime;
Mersul lucrării:
Pentru parcurgerea în lărgime am folosit funcția void Parcurgerea_latime(int
varf_de_incep)
1. care afișează datele prin analizarea matricei de adiacență:
void Parcurgerea_latime(int varf_de_incep)
{
printf("%d ",varf_de_incep);
int i,linie,delete,add;
delete=add=1;
S[1]=varf_de_incep;
varf[varf_de_incep]=1;
while(delete<=add)
{
linie=S[delete];
for(i=1; i<=r; i++)
if(varf[i]==0 && g[linie][i]==1)
{
varf[i]=1;
printf("%d ",i);
S[++add]=i;
}
delete++;
}
Pentru parcurgerea în adâncime am folosit funcția parcurgerea_adincime(int pornire),
în care indic rădăcina (vârful inițial) necesar pentru parcurgere:
void parcurgerea_adincime(int pornire)
{
varf_curent[pornire]=1;
printf("%d ",pornire);
for(int i=1; i<=r; i++)
{
if(g[pornire][i]==1 && varf_curent[i]==0)
{
parcurgerea_adincime(i);
}
}
}
Code program:
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
//---------------------------
int main()
{
int i, j, k, l, n, s, x, y, h;
char ch;
//---------------------------
L1:
static int a[30][20], b[30];
system("cls");
printf("\n\t");
printf("Introduceti numarul de virfuri ale arborelui : ");
scanf("%i", &n);
printf("\n\t");
printf("Introduceti lista de adiacenta :\n\n ");
for (i = 0; i<n; i++)
{
printf("\r%2i|", i + 1);
scanf("%i", &a[i][0]);
for (j = 1; j<n + 1; j++)
if (a[i][j - 1] != 0) scanf("%i", &a[i][j]);
else break;
}
//----------------------------
for (i = 0; i<n; i++) b[i] = i + 1;
for (i = 0; i<n; i++)
for (j = 0; j<n; j++)
if (a[i][j] != 0)
if (b[a[i][j] - 1] != 0 && 0<a[i][j] && a[i][j] <= n) b[a[i][j] - 1] = 0;
else goto l2; // Eror!
else break;
for (i = 0, x = 0; x<n; x++)
if (b[x] != 0) { b[0] = x + 1; i++; }
if (i>1) goto l2; // Eror!
x = y = 0;
printf("\n\n\r");
printf("Parcurgerea in largime :\n\r");
while (1)
{
ch = _getch();
if (ch == 27) exit(0);
if (ch == 13) goto L1;
}
}
Concluzii