Sunteți pe pagina 1din 6

Ministerul Educaiei al Republicii Moldova

Universitatea Tehnic a Moldovei


Faculatea Calulatore, Informatic i Microelectronic

Tema: ALGORITMUL DE CUTARE N ADNCIME


I ALGORITMUL DE CUTARE N LRGIME

A efectuat:

A verificat:

Lisnic Inga

Chiinu 2015

LUCRAREA DE LABORATOR Nr. 2

1. SCOPUL LUCRRII:
Studierea algoritmilor de cutare n graf i a diferitor forme de pstrare i prelucrare a datelor.
Elaborarea procedurii de cutare n adncime.
2.

NOTE DE CURS

Structuri de date: liste


Fiecare tip de list definete o mulime de iruri finite de elemente de tipul declarat. Numrul de elemente care se
numete lungimea listei poate varia pentru diferite liste de acelai tip. Lista care nu conine nici un element se va
numi vid. Pentru list sunt definite noiunile nceputul, sfritul listei i respectiv primul i ultimul element, de
asemenea elementul curent ca i predecesorul i succesorul elementului curent. Element curent se numete acel unic
element care este accesibil la momentul dat.

Structuri de date : fire de ateptare


Firele de ateptare (FA, rnd, coad, ir de ateptare) 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 fost incluse n ea (primul sosit - primul servit).
Operaiile de baz cu firele de ateptare:

Formarea unui FA vid;


Verificare dac FA nu este vid;
Alegerea primului element cu eliminarea lui din FA;
Introducerea unei valori noi n calitate de ultim element al FA.

Structuri de date - arbori


Se va defini o mulime de structuri fiecare din care va consta dintr-un obiect de baz numit vrf sau rdcina
arborelui dat i o list de elemente din mulimea definit, care (elementele) se vor numi subarbori ai arborelui dat.
Arborele pentru care lista subarborilor este vid se va numi arbore trivial, iar rdcina lui - frunz.

Rdcina arborelui se va numi tatl vrfurilor care servesc drept rdcini pentru subarbori; aceste
vrfuri se vor mai numi copiii rdcinii arborelui: rdcina primului subarbore se va numi fiul
cel mai mare, iar rdcina fiecrui subarbore urmtor n list se va numi frate.
Operaiile de baz pentru arbori vor fi:

Formarea unui arbore trivial;


Alegerea sau nlocuirea rdcinii arborelui;
Alegerea sau nlocuirea listei rdcinilor subarborilor;
Operaiile de baz care sunt valabile pentru liste.

Cutare n adncime
La cutarea n adncime (parcurgerea unui graf n sens direct, n preordine) vrfurile grafului vor
fi vizitate n conformitate cu urmtoarea procedur recursiv:
mai nti va fi vizitat rdcina arborelui q, apoi, dac rdcina arborelui nu este frunz - pentru fiecare fiu p al
rdcinii q ne vom adresa recursiv procedurii de parcurgere n adncime pentru a vizita vrfurile tuturor
subarborilor cu rdcina p ordonate ca fii ai lui q.
3. SARCINA DE BAZ
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.

LUCRAREA DE LABORATOR Nr. 3


TEMA: ALGORITMUL DE CUTARE N LRGIME
1.

SCOPUL LUCRRII:

Studierea algoritmului de cutare n lrgime;


Elaborarea programului de cutare n lrgime.
2. NOTE DE CURS

Algoritmul de cutare n lrgime


Parcurgerea grafului n lrgime, ca i parcurgerea n adncime, va garanta vizitarea fiecrui vrf al grafului exact o
singur dat, ns principiul va fi altul. Dup vizitarea vrfului iniial, de la care va ncepe cutarea n lrgime, vor fi
vizitate toate vrfurile adiacente cu vrful dat, apoi toate vrfurile adiacente cu aceste ultime vrfuri .a.m.d. pn
vor fi vizitate toate vrfurile grafului. Evident, este necesar ca graful s fie conex. Aceast modalitate de parcurgere
a grafului (n lrgime sau postordine), care mai este adesea numit parcurgere n ordine orizontal, realizeaz
parcurgerea vrfurilor de la stnga la dreapta, nivel dup nivel.
Vom nota c procedura parcurgerii grafului n lrgime permite s realizm arborele de cutare i n acelai timp s
construim acest arbore. Cu alte cuvinte, se va rezolva problema determinrii unei rezolvri sub forma vectorului (a1,
a2,...) de lungime necunoscut, dac este cunoscut c exist o rezolvare finit a problemei.
Algoritmul pentru cazul general este analogic cu cel pentru un graf n form de arbore cu o mic modificare care
const n aceea c fiecare vrf vizitat va fi marcat pentru a exclude ciclarea algoritmului.
3. SARCINA DE BAZ
1.

Elaborai procedura care va realiza algoritmul de parcurgere a grafului n lrgime;

2.

Folosind procedurile din lucrrile precedente, elaborai programul care va permite:

introducerea grafului n calculator;


parcurgerea grafului n lrgime;
extragerea datelor la display i printer.

Listingul programului:
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>
struct lista
{
int inf;
lista *next;
} *ls;
typedef struct list
{
int info;
struct list *next;
} *stack;
stack push(stack s,int info);
stack pop(stack s, int *pinfo);
void pop_end(stack &s, int *pinfo);
int este(int v, int n, int t[]);
int getst(stack s);
lista *inss(lista *cap, int k);
void afisl(lista *cap);

int mdfcontine(lista *cap,int n,int t[]);


void InitDrum();
void InitTL();
void IntrTL();
void AfisTL();
void P_Adincime();
void P_Latime();
void AfisDrum();
int menu();
int tab[25],n,i,j=0;
struct lista *tl[25];
stack s=NULL,s2=NULL;
void main(void)
{
for (;;)
switch(menu())
{
case 1
:
clrscr();InitTL();IntrTL();br
eak;
case 2
:
clrscr();AfisTL();getch();bre
ak;
case 3
:
clrscr();InitDrum();s=NULL;j=
0;
P_Latime();AfisDrum();getch()
;break;
case 4
:
clrscr();InitDrum();s=NULL;j=
0;
P_Adincime();AfisDrum();getch
();break;
case 5
: ;
case 27
:
exit(1)
;break;
}
}
lista *inss(lista *cap, int
k)
{
//Insereaza la sfirsitul
listei
lista *t=(lista
*)malloc(sizeof(lista)),*temp
;
t->inf=k;t->next=NULL;
if (!cap) return t;
temp=cap;
while (temp->next) temp=temp>next;
temp->next=t;
return cap;
}
void afisl(lista *cap)
//afiseaza lista

{
if (cap) {printf("%5d",cap>inf);afisl(cap->next);} else
return;
}
stack push(stack s,int info)
{
//Pune virful in topul stivei
stack t;
t=(stack)malloc(sizeof(list))
;
t->info=info;
t->next=s;
return t;
}
stack pop(stack s, int
*pinfo)
{
//Extrage virful din topul
stivei
stack t;
if (!s) return NULL;
else
{
*pinfo=s->info;t=s>next;
free(s); return(t);
}
}
int este(int v, int n, int
t[])
{
//Verific daca virful se afla
in tabloul ce contine drumul
int val=0,i;
for (i=0;i<=n;i++) if
(v==t[i]) {val=1;break;}
return val;
}
int getst(stack s)
{
//Scoate val 1-ului element
din lista
if (!s) return -1;
else
return(s->info);
}
int mdfcontine(lista *cap,int
n,int t[])
{
while (cap)
if (este(cap->inf,n,t))
cap=cap->next;
else return(cap->inf);
return (-1);
}

void InitDrum()
{
int i;
for (i=0;i<25;i++) tab[i]=999;
}
void InitTL()
{
int i;
for (i=0;i<25;i++)
tl[i]=NULL;
}
void IntrTL()
{
textbackground(BLUE);
clrscr();
int v;
printf("introdu numarul de
noduri: ");scanf("%d",&n);
for (i=1;i<=n;i++)
{printf("%d |",i);do
{scanf("%d",&v);
tl[i]=inss(tl[i],v);}
while(v!=0);}
}
void AfisTL()
{
for (i=1;i<=n;i++)
{printf("%d |
",i);afisl(tl[i]);puts("");}
}
void P_Adincime()
{
clrscr();
textbackground(BLUE);
int v1,vc,k;
l:printf("introdu virful de
la care vom incepe:
");scanf("%d",&v1);
if(v1<1 || v1>n) {puts("Virf
inexistent!");getch();goto
l;}
else if (v1==999) return;
else {tab[j+
+]=v1;s=push(s,v1);}
while (s) { vc=getst(s);
if (tl[vc] &&
tl[vc]->inf!=0){
int
c=mdfcontine(tl[vc],j-1,tab);
if (c!=-1 && c)
{tab[j+
+]=c;s=push(s,c);}
else
s=pop(s,&k);}
else s=pop(s,&k);
}
}

void AfisDrum()
{
for (i=0;i<j;i++) printf("%d
",tab[i]);
}
int menu()
{
textmode(C4350);
textbackground(BLUE);
clrscr();
int func=1;
while (1)
{
gotoxy(23,12);
textcolor(GREEN);
textbackground(BLACK);
cputs("
");
gotoxy(23,13);
cputs("");
textcolor(MAGENTA);
cputs("
M E
N I U
");
textcolor(GREEN);
cputs("");
gotoxy(23,14);
cputs("
");
gotoxy(23,15);
cputs("
");
textbackground(BLACK);
textcolor(GREEN);
gotoxy(23,16);
cputs("");
textbackground(4*(func==1));
textcolor(3+12*(func==1));
cputs("Introducere
lista de incidenta
");
textbackground(BLACK);
textcolor(GREEN);
cputs("");
gotoxy(23,17);
cputs("
");
gotoxy(23,18);
cputs("");
textbackground(4*(func==2));
textcolor(3+12*(func==2));
cprintf("Afisarea
listei de incidenta
");
textbackground(BLACK);
textcolor(GREEN);
cputs("");
gotoxy(23,19);

cputs("
");
gotoxy(23,20);
cputs("");
textbackground(4*(func==3));
textcolor(3+12*(func==3));
cprintf("Parcurgerea in
largime
");
textbackground(BLACK);
textcolor(GREEN);
cputs("");
gotoxy(23,21);
cputs("
");
gotoxy(23,22);
cputs("");
textbackground(4*(func==4));
textcolor(3+12*(func==4));
cprintf("Parcurgerea in
adincime
");
textbackground(BLACK);
textcolor(GREEN);
cputs("");
gotoxy(23,23);
cputs("
");
gotoxy(23,24);
cputs("");
textbackground(4*(func==5));
textcolor(1+12*(func==5));
cprintf("
Iesire
");
textbackground(BLACK);
textcolor(GREEN);
cputs("");
gotoxy(23,25);
cputs("
");
switch(getch())
{
case
80:if(func<5)func++;else if
(func==5) func=1; break;
case
72:if(func>1)func--;else if
(func==1) func=5; break;
case 13:return func;
case 27:exit(0);
}
}
}
void P_Latime()
{

textbackground(BLUE);
clrscr();
int v1,vc,b;
struct lista *ctl[25];
for (i=1;i<=n;i++)
ctl[i]=tl[i];
l:clrscr();printf("Introdu
primul virf:
");scanf("%d",&v1);
if(v1<1 || v1>n) {puts("Virf
inexistent!");getch();goto
l;}
else s=push(s,v1);
while (s || s2)
{
if (s)
{
pop_end(s,&vc);if (!
este(vc,j-1,tab) && vc!=0)
tab[j++]=vc;
if (ctl[vc]->inf!=0)
while (ctl[vc]->next)
{if (!este(ctl[vc]>inf,j-1,tab))
s2=push(s2,ctl[vc]>inf);ctl[vc]=ctl[vc]->next;}
}
else
{
stack temp=s;
s=s2;s2=temp;
}
}
}
void pop_end(stack &s, int
*pinfo)
{
if (!s) return ;
if (s->next) pop_end(s>next,pinfo);
else {*pinfo=s>info;s=NULL;} }

S-ar putea să vă placă și