Download as pdf or txt
Download as pdf or txt
You are on page 1of 6

1:

2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:

//grafuri
#include <iostream>//pt cout
#include <stdlib.h>
#define nrVarfuri 6
using namespace std;//pt scrierea prescurtata, fara std::cout, etc
typedef int info;

typedef struct varf{


info informatie;
varf *varfUrmator;//adresa varfului urmator
struct arc *capListaArce;//adresa de inceput a listei de legaturi cu
celelalte noduri
14: } VARF, *PVARF;//graf orientat/neorientat
15:
16: typedef struct arc{
17:
PVARF varfDestinatie;
18:
int pondereLegatura;
19:
arc *arculUrmator;
20: } ARC, *PARC;//sau poate fi muchie, pt graf orientat
21:
22: typedef struct stiva{
23:
PVARF varf;
24:
stiva *urmatorulDinStiva;
25: } STIVA, *PSTIVA;
26:
27: typedef struct lista{
28:
PVARF varf;
29:
lista *urmatorulDinCoada;
30: } LISTA, *PLISTA;
31:
32: typedef struct{
33:
PLISTA inceput;
34:
PLISTA sfarsit;
35: } COADA;
36:
37: PVARF grafDinMatriceAdiacenta(int matrice[nrVarfuri][nrVarfuri], int nrNoduri);
38:
39: PVARF inserareVarfNou(PVARF primulVarf, int informatie);
40:
41: void inserareArcNou(PVARF primulVarf, int sursa, int destinatie, int pondere);
42:
43: void parcurgereGrafInAdancime(PVARF primulVarf);
44:
45: void parcurgereGrafInLatime(PVARF primulVarf);
46:
47: void stergeGraf(PVARF primulVarf);
48:
49: int main(){
50:
51: // info matriceAdiacenta[nrVarfuri][nrVarfuri] = {
52: //
{0, 1, 2, 3, 0, 0},
53: //
{1, 0, 4, 0, 5, 0},
54: //
{2, 4, 0, 6, 7, 8},
55: //
{3, 0, 6, 0, 0, 9},
56: //
{0, 5, 7, 0, 0, 0},
57: //
{0, 0, 8, 9, 0, 0}
58: //
};
59:

60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:

info matriceAdiacenta[nrVarfuri][nrVarfuri] = {
{0, 1, 0, 1, 0, 0},
{1, 0, 0, 0, 1, 0},
{0, 0, 0, 1, 0, 1},
{1, 0, 1, 0, 0, 1},
{0, 1, 0, 0, 0, 0},
{0, 0, 1, 1, 0, 0}
};

PVARF primulVarf;
primulVarf = grafDinMatriceAdiacenta(matriceAdiacenta, nrVarfuri);
cout << "Parcurgere in adancime" << endl;
parcurgereGrafInAdancime(primulVarf);
cout << endl;
cout << "Parcurgere in latime" << endl;
parcurgereGrafInLatime(primulVarf);
cout << endl;
stergeGraf(primulVarf); primulVarf = NULL;
cout << "Parcurgere in adancime" << endl;
parcurgereGrafInAdancime(primulVarf);
cout << endl;
cout << "Parcurgere in latime" << endl;
parcurgereGrafInLatime(primulVarf);
cout << endl;

system("PAUSE");//in stdlib
return 0;
}
PVARF grafDinMatriceAdiacenta(int matrice[nrVarfuri][nrVarfuri], int nr){
if(nr <= 0) return NULL;
PVARF primulVarf = NULL, temp;
for(int i = 0; i< nr; i++) primulVarf = inserareVarfNou(primulVarf, i+1);
temp = primulVarf;
for(int i = 0; i < nr; i++)
for(int j = 0; j < nr; j++)
if(matrice[i][j])
inserareArcNou(primulVarf, i+1, j+1, matrice[i][j]);
return primulVarf;
}

PVARF inserareVarfNou(PVARF primulVarf, int informatie){


PVARF varfNou = new VARF;
varfNou->informatie = informatie;
varfNou->varfUrmator = NULL;
varfNou->capListaArce = NULL;

120:
121:
if(!primulVarf) return varfNou;
122:
123:
PVARF temp = primulVarf;
124:
while(temp->varfUrmator) temp = temp->varfUrmator;
125:
temp->varfUrmator = varfNou;
126:
return primulVarf;
127: }
128:
129: PVARF cautVarf(PVARF primulVarf, int informatie){
130:
while(primulVarf) if((primulVarf->informatie) != informatie) primulVarf =
primulVarf->varfUrmator ;
131:
else break;
132:
return primulVarf;
133: }
134:
135: void inserareArcNou(PVARF primulVarf, int sursa, int destinatie, int pondere){
136:
PVARF varfSursa = NULL, varfDestinatie = NULL, tempVarf = primulVarf,
ultimulVarf = primulVarf;
137:
138:
varfSursa = cautVarf(primulVarf, sursa);
139:
varfDestinatie = cautVarf(primulVarf, destinatie);
140:
141:
while(ultimulVarf->varfUrmator) ultimulVarf = ultimulVarf->varfUrmator;
142:
if(!varfSursa){
143:
primulVarf = inserareVarfNou(primulVarf, sursa);
144:
ultimulVarf = ultimulVarf->varfUrmator;
145:
varfSursa = ultimulVarf;
146:
}
147:
if(!varfDestinatie){
148:
primulVarf = inserareVarfNou(primulVarf, destinatie);
149:
ultimulVarf = ultimulVarf->varfUrmator;
150:
varfDestinatie = ultimulVarf;
151:
}
152:
153:
PARC tempArc, arcNou;
154:
tempArc = varfSursa->capListaArce;
155:
if(!tempArc){//dc nu gaseste legatura de la sursa la destinatie
156:
arcNou = new ARC;
157:
arcNou->arculUrmator = NULL;
158:
arcNou->varfDestinatie = varfDestinatie;
159:
varfSursa->capListaArce = arcNou;
160:
return;
161:
}
162:
while(tempArc->arculUrmator){
163:
if(tempArc->varfDestinatie->informatie != destinatie) tempArc = tempArc>arculUrmator;
164:
else break;
165:
}//iese pe elementul deja existent, sau pe ultimul, pe care treb sa il
testam
166:
if(tempArc->varfDestinatie->informatie != destinatie){//dc nu gaseste
legatura de la sursa la destinatie
167:
arcNou = new ARC;
168:
arcNou->arculUrmator = NULL;
169:
arcNou->varfDestinatie = varfDestinatie;
170:
tempArc->arculUrmator = arcNou;
171:
}
172: }
173:
174: PSTIVA push(PSTIVA varfStiva, PVARF varf){

175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:

PSTIVA temp = new STIVA;//noul element din stiva


if(temp){
temp->urmatorulDinStiva = varfStiva;
temp->varf = varf;
}
return temp;
}

PSTIVA pop(PSTIVA varfStiva, PVARF *pPVarf){


if(!varfStiva) return NULL;
PSTIVA varfSters;
varfSters = varfStiva;
varfStiva = varfStiva->urmatorulDinStiva;
*pPVarf = varfSters->varf;
delete varfSters;
return varfStiva;
}

void vizitareVarf(PVARF varf, bool vizitat[]){


vizitat[varf->informatie-1] = true;
}
void parcurgereGrafInAdancime(PVARF primulVarf){//functia incearca sa ajunga
cat mai departe de primul nod
if(!primulVarf) return;
bool vizitat[10];//avem un graf, pe care il parcurgem in adancime
int nr_noduri = 0;//calculam numarul de noduri, presupunand graful dat doar
prin primul varf
PVARF varfCurent = primulVarf;
while(varfCurent){
vizitat[nr_noduri] = false;//nici un nod nu-i inca vizitat
nr_noduri++;
varfCurent = varfCurent->varfUrmator;
}

PVARF varfPop;
PARC tempArc;
PSTIVA varfStiva = NULL;
varfStiva = push(varfStiva, primulVarf);
vizitareVarf(varfStiva->varf, vizitat);
cout << varfStiva->varf->informatie;
do{
varfStiva = pop(varfStiva, &varfPop);
varfCurent = varfPop;
tempArc = varfCurent->capListaArce;
while(tempArc){
if(!vizitat[tempArc->varfDestinatie->informatie-1]){
//cout << endl << varfCurent->informatie << "->" << tempArc>varfDestinatie->informatie << endl;
varfStiva = push(varfStiva, tempArc->varfDestinatie);
vizitareVarf(varfStiva->varf, vizitat);
cout << varfStiva->varf->informatie;
}
tempArc = tempArc->arculUrmator;
}
}while(varfStiva);

232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267:
268:
269:
270:
271:
272:
273:
274:
275:
276:
277:
278:
279:
280:
281:
282:
283:
284:
285:
286:
287:
288:

COADA introduceCoada(COADA coada, PVARF varf){


PLISTA nou = new LISTA;
nou->varf= varf;
nou->urmatorulDinCoada = NULL;
if(!coada.inceput) coada.sfarsit = coada.inceput = nou;
else{
coada.sfarsit->urmatorulDinCoada = nou;
coada.sfarsit = nou;
}
return coada;
}
COADA extrageCoada(COADA coada, PVARF *pPVarf){
if(!coada.inceput) return coada;
*pPVarf = coada.inceput->varf;
PLISTA temp;
temp = coada.inceput;
coada.inceput = coada.inceput->urmatorulDinCoada;
delete temp;
if(!coada.inceput) coada.sfarsit = NULL;
return coada;
}

void parcurgereGrafInLatime(PVARF primulVarf){//functia parcurge graful nivel


cu nivel
if(!primulVarf) return;
bool vizitat[10];//avem un graf, pe care il parcurgem in adancime
int nr_noduri = 0;//calculam numarul de noduri, presupunand graful dat doar
prin primul varf
PVARF varfCurent = primulVarf;
while(varfCurent){
vizitat[nr_noduri] = false;//nici un nod nu-i inca vizitat
nr_noduri++;
varfCurent = varfCurent->varfUrmator;
}
PVARF varfExtras;
PARC tempArc;
COADA coada = {NULL, NULL};
coada = introduceCoada(coada, primulVarf);
vizitareVarf(coada.sfarsit->varf, vizitat);
cout << coada.sfarsit->varf->informatie;
do{
coada = extrageCoada(coada, &varfExtras);
varfCurent = varfExtras;
tempArc = varfCurent->capListaArce;
while(tempArc){
if(!vizitat[tempArc->varfDestinatie->informatie-1]){
//cout << endl << varfCurent->informatie << "->" << tempArc>varfDestinatie->informatie << endl;
coada = introduceCoada(coada, tempArc->varfDestinatie);
vizitareVarf(coada.sfarsit->varf, vizitat);
cout << coada.sfarsit->varf->informatie;
}

289:
tempArc = tempArc->arculUrmator;
290:
}
291:
}while(coada.inceput);
292: }
293:
294: void stergeGraf(PVARF primulVarf){
295:
if(!primulVarf) return;
296:
stergeGraf(primulVarf->varfUrmator);
297:
PARC temp;
298:
while(primulVarf->capListaArce){
299:
temp = primulVarf->capListaArce;
300:
primulVarf->capListaArce = primulVarf->capListaArce->arculUrmator;
301:
delete temp;
302:
}
303:
delete primulVarf;
304: }
305:

You might also like