Sunteți pe pagina 1din 8

Ministerul Educaiei al Republicii Moldova

Universitatea Tehnic a Moldovei


Facultatea Calculatoare Informatic i Microelectronic

RAPORT
Lucrare de laborator NR.1
Obiectul: Matematica Discreta

Tema: PSTRAREA GRAFURILOR N MEMORIA CALCULATORULUI

A efectuat: St.gr. TI-144 Gorduz Daniel


A verificat: Cioban Gheorgher

Chiinu 2015
SARCINA DE BAZ

1. Elaborai procedura introducerii unui graf n memoria calculatorului n form de


matrice de inciden, matrice de adiacen i list de adiacen cu posibiliti de
analiz a corectitudinii.
2. Elaborai proceduri de transformare dintr-o form de reprezentare n alta.
3. Folosind procedurile menionate elaborai programul care va permite:
*
ntroducerea grafului reprezentat sub oricare din cele trei forme cu posibiliti de
corecie a datelor;
* Pstrarea grafului n memoria extern n form de list de adiacen;
* Extragerea informaiei ntr-una din cele trei forme la imprimant i display.
1. LISTINGUL PROGRAMULUI
#include
#include
#include
#include

<stdio.h>
<stdlib.h>
<string.h>
<conio.h>

typedef struct arc{


int vi;
int vf;
}arc;
// Alocarea memoriei
int** aloc(int n,int m){
int **vect=NULL;
int i;
vect=(int**)malloc(n*sizeof(int*));
if(vect==NULL)
return vect;
for(i=0;i<n;i++){
vect[i]=(int*)malloc(m*sizeof(int));
if(vect[i]==NULL)
return NULL;
}
return vect;
}
//Eliberarea memoriei
int** freemem(int **vect,int n){
int i;
if(vect==NULL)
return vect;
for(i=0;i<n;i++)
free(vect[i]);
free(vect);
vect=NULL;
return vect;

//Calcul matrice adiacenta


void ma_ad(arc *a,int **vect,int u,int x){
int i,j,l,k=0;
for(i=0;i<x;i++){
for(j=0;j<x;j++){
for(l=0;l<u;l++){
if(a[l].vi==i+1 && a[l].vf==j+1){
vect[i][j]=1;
k++;
}
}
if(!k)
vect[i][j]=0;
k=0;
}
}
}
//Calcul lista adiacenta
void li_ad(arc *a,int **LA,int u,int x){
int i,j,l,k=1;
for(i=0;i<x;i++){
LA[i][0]=i+1;
k=1;
for(j=1;j<x+1;j++){
for(l=0;l<u;l++){
if(a[l].vi==i+1 && a[l].vf==j){
LA[i][k]=j;
k++;
}
}
}
LA[i][k]=0;
}

}
//Introducerea datelor
void read(arc *a,int u,int x){
int i;
for(i=0;i<u;i++){
in: system("cls");
printf("Introduceti datele arcului %d\n",i+1);
printf("Introduceti inceputul X: ");
scanf("%d",&a[i].vi);
printf("Introduceti sfirsitul X: "); scanf("%d",&a[i].vf);
if(!(a[i].vi >=1 && a[i].vi <= x && a[i].vf >=1 && a[i].vf
<= x)){
printf("\a\nVALOARE INCOMPATIBILA!\nPentru a continua
tastati ENTER...\n");
getch();
goto in;
}
}
}
//Calcul matrice incidenta
void ma_in(arc *a,int **vect,int u,int x){
int i,j;

for(i=0;i<u;i++){
for(j=0;j<x;j++){
if(a[i].vi==a[i].vf && a[i].vi==j+1)
vect[i][j]=2;
else if(a[i].vi==j+1)
vect[i][j]=-1;
else if(a[i].vf==j+1)
vect[i][j]=1;
else vect[i][j]=0;
}
}

}
//Modificarea arcelor
void modif(arc *a,int ar){
printf("*************************\n");
printf("Datele arcului %d",ar);
printf(" Din %d in %d\n\n",a[ar-1].vi,a[ar-1].vf);
printf("Introduceti inceputul X: ");
scanf("%d",&a[ar1].vi);
printf("Introduceti sfirsitul X: ");
scanf("%d",&a[ar1].vf);
}
//Afisare matrici
void showm(int **vect,int n, int m){

int i,j;
for (i=0; i<m; i++){printf("\tX%d",i+1 );}
printf("\n");
for(i=0;i<n;i++){
printf("U%d", i+1);
for(j=0;j<m;j++)
printf("\t%d",vect[i][j]);
printf("\n\n");
}
getch();
}
//Afisare arce
void showl(arc *a,int u){
int i;
for(i=0;i<u;i++){
printf("Datele arcului %d\n",i+1);
printf("%d -> %d\n\n",a[i].vi,a[i].vf);
}
getch();
}
//Afisare lista
void showli(int **vect,int n,int m){
int i,j;
for(i=0;i<n;i++){
printf("%d -> ",vect[i][0]);
for(j=1;j<m;j++){
printf(" %d",vect[i][j]);
if(vect[i][j]==0)
break;
}
printf("\n\n");
}
getch();
}
//int delete_arc()
int adda(arc *a,int u,int x){
int i;
u++;
for(i=u-1;i<u;i++){
in: system("cls");
printf("**************************\n");
printf("Introduceti datele arcului %d\n",u);
printf("Introduceti inceputul X: ");
scanf("%d",&a[i].vi);
printf("Introduceti sfirsitul X: "); scanf("%d",&a[i].vf);
if(!(a[i].vi >=1 && a[i].vi <= x && a[i].vf >=1 && a[i].vf
<= x)){
printf("\a\nVALOARE INCOMPATIBILA!\nPentru a continua
tastati ENTER...\n");
getch();
goto in;
}
}
}
int main(){
arc *a=NULL; //ARCE struct
int **MI=NULL; //Matricea incidenta
int **MA=NULL; //Matricea adiacenta
int **LA=NULL; //Lista adiacenta
int i, u=0, x=0;
int ar, m=1, op;
while (1){
system("cls");
printf("\n\t\t\t********** MENU *************");
printf("\n\t\t\t*>> 1.Introduceti datele.
*");
printf("\n\t\t\t********** AFISARE ************");
printf("\n\t\t\t*>> 2.Afisare arce.
*");
printf("\n\t\t\t*>> 3.Afisare matrice incidenta.*");
printf("\n\t\t\t*>> 4.Afisare matrice adiacenta.*");
printf("\n\t\t\t*>> 5.Afisare lista adiacenta. *");
printf("\n\t\t\t******** MODIFICARE ***********");
printf("\n\t\t\t*>> 6.Modificare arce.
*");
printf("\n\t\t\t*>> 7.Adaugare arce.
*");
printf("\n\t\t\t*********************************");
printf("\n\t\t\t*>> 0.Iesire.
*");
printf("\n\t\t\t*********************************");
printf("\n\n\t\t\tAlegeti optiunea: \n\t\t\t>>
scanf("%d", &op);
switch (op){

");

case 1: printf("\n\t\t\tIntroduceti numarul arcelor


u=
"); scanf("%d",&u);
printf("\n\t\t\tIntroduceti numarul de varfuri x =
"); scanf("%d",&x);
a=(arc*)malloc(u*sizeof(arc));
read (a,u,x);
break;
case 2: showl(a,u);
break;
case 3: printf("\nMATRICE DE INCIDENTA");
printf("\n************************************\n\n")
;
if(MI){
showm(MI,u,x);
}else{
MI=aloc(u,x);
ma_in(a,MI,u,x);
showm(MI,u,x);
}
break;
case 4: printf("\nMATRICE DE ADIACENTA");
printf("\n************************************\n\n")
;
if(MA){
showm(MA,u,x);
}else{
MA=aloc(x,x);
ma_ad(a,MA,u,x);
showm(MA,x,x);
}
break;
case 5: printf("\nLISTA DE ADIACENTA");
printf("\n************************************\n\n")
;
if(LA!=NULL){
showli(LA,x,x+2);
}else{
LA=aloc(x,x+2);
li_ad(a,LA,u,x);
showli(LA,x,x+2);
}
break;
case 6:
lm:
system("cls");
showl(a,u);
printf("\n\nIntrodu numarul arcului pentru
modificare: "); scanf("%d",&ar);
if(!(ar >= 1 && ar <= u)){
system("cls");
printf("\aArcul introdus nu exista! Incercati din
nou.\n");
system("pause");
goto lm;
}
system("cls");
modif(a,ar);
break;
case 7:
case 0: if(a)
free(a);
if(MI)
MI=freemem(MI,u);
if(MA)
MA=freemem(MA,x);
if(LA)
LA=freemem(LA,x+2);
exit(0);
break;
default: printf("\nAti introdus o comanda gresita!");
printf("\nPentru a continua tastati ENTER...");
getch();
break;
}//sfarsit switch
}//sfarsit while
getch();
return 0;
}

2. INTERFATA PROGRAMULUI
MENU principal

Introducerea datelor din Graf

Afisarea datelor din Graf

Afisarea Matricei de Incidenta

Afisarea Matricei de Adiacenta

Afisarea Listei de Adiacenta

3. GRAFUL FOLOSIT LA VERIFICAREA PROGRAMULUI

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