Sunteți pe pagina 1din 8

Ministerul Educaiei al Republicii Moldova

Universitatea Tehnic a Moldovei

Catedra: Automatica i Tehnologii Informaionale

RAPORT
Lucrare de laborator Nr.2
la Matematica Discreta
Tema:Algoritmul de cautare in adincime

A efectuat:

st. gr. TI

A verificat:

lect. G.Ceban

Chiinu 2015
Scopul lucrrii:

Studierea algoritmilor de cutare n graf i a diferitor forme de pstrare i prelucrare a


datelor.
Elaborarea procedurii de cutare n adncime.

Enuntul problemei:
1. Elaborai procedura cutrii n adncime ntr-un graf arbitrar;
2. Elaborai un program cu urmtoarele posibiliti:
introducerea grafului n calculator,
parcurgerea grafului n adncime,
vizualizarea rezultatelor la display i imprimant.

Listingul programului:
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
typedef struct stack
{
int inf;
struct stack *next;
} stack;
int **saveList(int **graf, int n);
void viewList(int **graf, int n);
void clearMem(int **graf, int n, int *list);
int pushStack(stack *&next, int inf, int l);
int popStack(stack *&next, int &l);
int parGraf(int *&list, int n, int vI, int **graf, stack *st);
int main()
{
int **graf, n, vI, i, opt;
int *list = 0;
stack *st = 0;
FILE *fp;
printf("Introduceti numarul de virfuri ale grafului: ");
scanf("%d", &n);
printf("\nIntroduceti matricea de adiacenta\n\n");
graf = saveList(graf, n);
system("cls");
do
{

system("cls");
printf("

Parcurgerea grafului in adincime \n");

printf("*

*\n");

printf("* 1.Afisarea listei de adiacenta

*\n");

printf("* 2.Afisarea drumului in largime


printf("* 0.Iesire

*\n");

*\n");

printf("*

*\n");

printf("Alegeti optiunea dorita: ");


opt = getche();
switch(opt)
{
case '1':
viewList(graf, n);
printf("\n\nApasati orice tasta pentru revenire...");
getch();
system("cls");
break;
case '2':
viewList(graf, n);
printf("\nIntroduceti virful din care doriti sa inceapa parcurgerea: ");
scanf("%d", &vI);
parGraf(list, n, vI, graf, st);
printf("Drumul obtinut este: ");
for(i = 0; i < n; i++)
printf("%d ", list[i]);
printf("\n\nApasati orice tasta pentru revenire...");
free(list);
getch();
break;
}
}while(opt != '0');
return 0;
}
//Functiile
//Functia de introducere a listei de adiacenta
int **saveList(int **graf, int n)
{
int i, j;
graf = (int **)malloc(n * sizeof(int *));

for(i = 0; i < n; i++)


{
graf[i] = (int *)malloc(sizeof(int));
printf("%d |", i + 1);
j = 0;
do
{
graf[i] = (int *)realloc(graf[i], (j + 1) * sizeof(int));
scanf("%d", &graf[i][j]);
j++;
}while(graf[i][j - 1] != 0);
}
return graf;
}
//Functia pentru afisarea listei
void viewList(int **graf, int n)
{
int i, j;
for(i = 0; i < n; i++)
{
printf("\n%d |", i + 1);
j = 0;
do
{
printf("%d ", graf[i][j]);
j++;
}while(graf[i][j - 1] != 0);
}
}
//Functia pentru eliberarea memoriei ocupate de lista
void clearMem(int **graf, int n, int *list)
{
int i;
for(i = 0; i < n; i++)
free(graf[i]);
free(graf);
}
//Functii pentru lucrur cu stiva
//Adaugarea unui element nou in stiva

int pushStack(stack *&next, int inf, int l)


{
stack *newEl = (stack *)malloc(sizeof(stack));//Declaram o variabila noua dinamica de tipstack
newEl->inf = inf;//Iscriem valoarea primita in functie in elementul stivei
newEl->next = next;//Facem legatura dintre elementul precedent si elementul nou creat
next = newEl;//Elementul nou devine capul stivei
l++;
return l;
}
//Stergerea unui elemet din stiva
int popStack(stack *&next, int &l)
{
int temp;
l--;
stack *newEl = next;//Memoram pointerul la capul stivei
next = next->next;//Cap devine elementul anterior
if(l != 0)
temp = next->inf;//Salvam in variabila temp valoarea elementului anterior
else
temp = 0;
free(newEl);//Eliberam memoria ocupata de elementul care urmeaza sa fie scos
return temp;
}
//Functia de parcurgere a grafului in latime
int parGraf(int *&list, int n, int vI, int **graf, stack *st)
{
int i, j, k, c, ind, pos, l = 0;
list = (int *)malloc(n * sizeof(int));
k = 0;
do
{
pos = vI - 1;
ind = 0;
if(ind != 1)
{
list[k] = vI;
l = pushStack(st, vI, l);
for(j = 0; graf[pos][j] != 0; j++)

{
for(i = 0; i <= k; i++)
{
if(graf[pos][j] != list[i])
{
ind = 0;
}else{
ind = 1;
break;
}
}
if(ind == 0)
{
vI = graf[pos][j];
break;
}
}
if(graf[pos][j] == 0)
{
do
{
vI = popStack(st, l);
if(l == 0)
{
ind = 0;
break;
}
pos = vI - 1;
for(j = 0; graf[pos][j] != 0; j++)
{
for(i = 0; i <= k; i++)
{
if(graf[pos][j] != list[i])
{
ind = 0;
}else{
ind = 1;

break;
}
}
if(ind == 0)
{
vI = graf[pos][j];
break;
}
}
}while(ind != 0);
if(l == 0)
{
ind = 0;
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
if(i + 1 == list[j])
{
ind = 0;
break;
}else{
ind = 1;
}
if(ind == 1)
{
vI = i + 1;
break;
}
}
if(k == n)
return 0;
}
}
}
k++;
}while(k != n);
return 0;
}

Concluzie:
In acest laborator neam invatat sa parcurgem un gram in adincime din orice virf a lui.Pentru
aceasta a fost creata o lista cu ahutorul unui vector si o stiva creata cu ajutorul unei liste simplu
inlantuite.Scopul final a fost atins programul se executa fara erori.Prograful salveaza datele intrun fisier text ca utilizator sa poata vizualiza rezultatele obtinute.