Documente Academic
Documente Profesional
Documente Cultură
Departamentul ISA
Raport
Chișinău 2018
Cuprins
2. Sarcina lucrării
1. Elaborarea a unui program care să permită introducerea unui graf arbitrar.
a) Matrice de incidență
b) Matrice de adiacență
c) Listă de adiacență
3. Redacatare grafului:
Se numește graf, G=(X,F), ansamblu format dintr-o mulțime finită X si o aplicație F a lui X în X.
Elementele mulțimii X se numesc vârfurile grafului. Perechea de vârfuri (x,y) se numește arc, vârful x se
numeste originea sau extremitatea inițială a arcului (x,y) iar vârful y se numește extremitatea finală sau
terminală.
Dacă un vârf nu este extremitatea nici unui arc el se numeste vârf izolat, iar dacă este extremitatea a
mai mult de două arce- nod. Un arc (x,y) pentru care extremitatea inițială coincide cu cea finală se numește
buclă.
Matricea de incidenţă
Este o matrice de tipul mxn, în care m este numărul de muchii sau arce (pentru un graf orientat), iar n este
numărul vârfurilor. La intersecţia liniei i cu coloana j se vor considera valori de 0, 1 sau -1 în conformitate
cu următoarea regulă:
1 - dacă muchia/arcul i "intră" în vârful j în cazul unui graf orientat;
0 - dacă muchia (arcul) i şi vârful j nu sunt incidente;
-1 - dacă arcul i "iese" din vârful j.
Matricea de adiacenţă
Este o matrice pătrată nxn, aici n este numărul de vârfuri. Fiecare element poate fi 0, dacă vârfurile respective
nu sunt adiacente, sau 1, în caz contrar.
Lista de adiacenţă
Lista de adiacenţă este o listă cu n linii (după numărul de vârfuri n), în linia cu numărul i vor fi scrise numerele
vârfurilor adiacente cu vârful i.
Xi F(xi) MA x1 x2 x3 x4 x5 x1 x2 x3 x4 x5
MI
x1 2,0 x1 0 1 0 0 0
x2 4,0 x2 0 0 0 1 0 u1 0 1 0 0 -1
x3 2,4,0 x3 0 1 0 1 0 u2 1 0 0 0 -1
x4 0 x4 0 0 0 0 0
x5 1 1 1 0 0 u3 -1 1 0 0 0
x5 1,2,3,0
u4 0 0 1 0 -1
Fig.1 Lista Fig.2 Matricea de adiacenta
u5 0 0 -1 1 0
u6 0 1 -1 0 0
u7 0 -1 0 1 0
Fig.3 Matricea de incidenta
4. Mersul lucrării
Sarcina nr.1
apoi introducem elementele matricei, k, sub formă de -1 (plecarea din vârf), 1(sosirea în vârf), și
0, în cazul cînd nu există drum.
for(i=1; i<=b; i++)
{
SetColor(MAGENTA);
printf("%3d: ", i);
SetColor (WHITE);
for(j=1; j<=n; j++)
{
t=NULL;
scanf("%d", &k);
if(k==1)
node=j;
else if (k==-1)
t=find_node(*begin,j);
else if(k!=0)
{
node=j;
t=find_node(*begin,j);
}
}
Elementele se vor citi sub forma unei matrici cu dimensiunea nxb, unde n - numărul de vârfuri, b -
numărul de arce. Pentru convertirea ulterioară a grafului în celelatle forme, efectuăm toate
sarcinile alocînd memoria dinamic.
Sarcina nr.2
while(begin)
{
lst=begin->bow;
while(lst)
{
if (lst->node==begin->node)
mat[i++][lst->node-1]=2;
else
{
mat[i][lst->node-1]=1;
mat[i++][begin->node-1]=-1;
}
lst=lst->next;
}
begin=begin->next;
b) Afișarea ca matrice de adiacență
Pentru aceasta, am creat o funcție show_matad. Apoi declar o matrice 2d patratică: int **mat,
cărieia ulterior îi atribui funcția get_matad, prin care în cazul în care valoarea vârfului inițial va
coincide cu numărul unei linii și valoarea vârfului final cu număru unei coloane, intersecției liniei
și coloanei respective i se atribuia valoarea 1:
while(begin){
lst=begin->bow;
while(lst){
mat[begin->node-1][lst->node-1]=lst->weight;
lst=lst->next; }
begin=begin->next; }
astfel parcurgând întraga matrice.
while (begin)
{
SetColor(MAGENTA);
printf("%3d: ",begin->node);
SetColor(WHITE);
t=begin->bow;
while(t) {
ft_putnbr(t->node);
putchar(' ');
t=t->next;
}
ft_putnbr(0);
putchar('\n');
begin=begin->next;
}
Sarcina nr.3
Redacatare grafului:
dacă vârful sursă nu va fi depistat, se va afișa eroarea : ”nod inexistent”, în caz contrar trecem la funcția
list_add:
if(*begin)
{ g=*begin;
while (g->next)
g=g->next;
g->next=t; }
prin care se reverifică ordinea tuturor vârfurilor sursă, și se va readăuga arcul nou introdus.
(g->node)--;
g=g->next;
}
Această lucrare de laborator a avut un rol important în procesul de studiere a materialelor teoretice la
matematica discretă, precum și în studierea aprofundată a limbajului de programare C. Totuși cel mai
semnificativ impact rămâne îmbunătățirea gândirii și a logicii, ce poate fi aplicată ulterior în toate
domeniile posibile.
Anexa
Listingul programului
#define WAIT putstr("Apasati orice tasta pentru a iesi .."); getch(); putchar('\n')
#define UNKNOWN ft_error("Optiune necunoscuta")
#define SUCCES SetColor (GREEN); puts("succes!"); SetColor(WHITE);
#define PARAM t_list**, int, int*
#define RED 12
#define GREEN 10
#define MAGENTA 13
#define CYAN 11
#define WHITE 15
#define MAX 10000000
#define MIN -10000000*/
} t_list;
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<windows.h>
#include<dos.h>
#include<dir.h>
#include<conio.h>
#include<limits.h>
puts(str);
SetColor (WHITE);
}
mat=(int**)malloc(sizeof(int*) *m);
if (!mat)
return (NULL);
for (i=0; i<m; i++)
{
mat[i]=(int*)malloc(sizeof(int) *n);
if (!mat[i])
return(NULL);
}
return(mat);
}
if(*mat==NULL)
return;
for(i=0; i<m; i++)
free((*mat)[i]);
free(*mat);
}
void ft_putnbr(int n) // introducerea nr de varfuri
{
long k;
k=(n<0)?-n:n;
if(n<0)
putchar('-');
if(k>=0 && k<=9)
putchar('0' + k);
else
{
ft_putnbr(k/10);
putchar(k % 10 + '0');
}
}
void putstr(char*str)
{
while(*str)
putchar(*(str++));
}
int ft_intlen(int k)
{
int i;
i=0;
if(k==0)
return(1);
if(k<0)
i++;
while(k)
{
k/=10;
i++;
}
return(i);
}
int putnchar(char c, int n)
{
while (n-- >0)
putchar(c);
return 0;
}
int ft_maxlen(int **mat, int m, int n)
{
int i;
int j;
int max;
if(!mat)
return(0);
max = ft_intlen(**mat);
for(i=0; i<m; i++)
for(j=0; j<n; j++)
if(max<ft_intlen(mat[i][j]))
max=ft_intlen(mat[i][j]);
return(max);
}
void ft_showmat(int **mat, int m, int n, char type)
{
int i;
int j;
int k;
int max_len;
int type_len;
max_len=ft_maxlen(mat, m , n)+2;
if ( max_len < ft_intlen(n)+1)
max_len=ft_intlen(n)+1;
type_len=ft_intlen(m)+1;
putnchar(' ', type_len+1);
SetColor(MAGENTA);
for(i=1; i<=n; i++)
{
putnchar(' ', max_len-ft_intlen(i)-1);
putchar('X');
ft_putnbr(i);
}
SetColor(WHITE);
putchar('\n');
for(i=0; i<m; i++)
{
SetColor(MAGENTA);
putnchar(' ', type_len-ft_intlen(i+1));
putchar(type);
ft_putnbr(i+1);
SetColor(WHITE);
for(j=0; j<n; j++)
{
k=mat[i][j];
putnchar(' ', max_len-ft_intlen(k));
if(k!=0)
SetColor(GREEN);
ft_putnbr(mat[i][j]);
SetColor(WHITE);
}
putchar('\n');
}
}
void not_found(int k)
{
SetColor(RED);
putstr("Nu a fost gasit varful");
ft_putnbr(k);
puts("din graf!");
SetColor(WHITE);
}
int check_graph(t_graph *begin)
{
int nodes;
t_graph *t;
t_list *list;
nodes=0;
t= begin;
while(t)
{
t=t->next;
nodes++;
}
while(begin)
{
list=begin-> bow;
while(list)
{
if(list->node>nodes|| list->node<1)
{
not_found(list->node);
return(1);
}
list=list->next;
}
begin=begin->next;
}
return(0);
}
void free_list(t_list**begin)
{
t_list *t;
while(*begin)
{
t=*begin;
*begin=t->next;
free(t);
}
}
void free_graph(t_graph **begin)
{
t_graph *t;
while(*begin)
{
t=*begin;
*begin=(*begin)->next;
free_list(&(t->bow));
free(t);
}
*begin=NULL;
}
t_list *list_new(int node, int weight)
{
t_list *t;
t=(t_list*)malloc(sizeof(t_list));
if(!t)
{
ft_error("erroare la alocare!");
exit(1);
}
t->node=node;
t->weight=weight;
t->next=NULL;
return(t);
}
void list_add(t_list**begin, int node, int weight)
{
t_list *t;
t_list *g;
t=list_new(node, weight);
if(*begin)
{
g=*begin;
while (g->next)
g=g->next;
g->next=t;
}
else
*begin=t;
}
t_graph *graph_add(t_graph **begin, int node)
{
t_graph *t;
t_graph *g;
t=(t_graph*)malloc(sizeof(t_graph));
t->bow=NULL;
t-> node=node;
t->next=NULL;
if(*begin)
{
g=*begin;
while(g->next)
g=g->next;
g->next=t;
}
else
*begin=t;
return(t);
}
void submenu(char *str)
{
SetColor(CYAN);
puts(str);
SetColor(WHITE);
}
void menu_list(char *str)
{
SetColor (GREEN);
while(*str!='-'&& *str)
putchar(*(str++));
SetColor(WHITE);
puts(str);
}
void read_glist(t_graph **begin) //citeste mat ca lista de adiacenta
{
int n;
int i;
int k;
t_graph *t;
if (*begin)
free_graph(begin);
submenu("\nCitirea grafului");
puts("Cum doriti sa fie citit graful ?");
menu_list("1 - Matricea de incidenta");
menu_list("2 - Matricea de adiacenta");
menu_list("3 - Lista de adiacenta");
menu_list("4 - Inapoi");
c=getch();
c=toupper(c);
if(c=='1')
read_matinc(begin);
else if(c=='2')
read_matadc(begin);
else if (c=='3')
read_glist(begin);
else if(c=='4')
return;
else
{
UNKNOWN;
read_graph(begin);
return ;
}
WAIT;
}
void get_graphsize(t_graph *t, int *n, int *b)
{
t_list *lst;
*n=0;
*b=0;
while(t)
{
(*n)++;
lst=t->bow;
while(lst)
{
lst=lst->next;
(*b)++;
}
t=t->next;
}
}
void show_matinc(t_graph*begin) //afisarea ca matrice de incidenta
{
int i=0;
int n;
int b;
int **mat;
t_list *lst;
submenu("\nAfisarea Grafului ca matricie de incidenta");
if(!begin)
{
ft_error("Graful este vid");
return;
}
get_graphsize(begin, &n, &b);
mat=ft_newmat(b, n);
ft_initmat(mat, b, n, 0);
while(begin)
{
lst=begin->bow;
while(lst)
{
if (lst->node==begin->node)
mat[i++][lst->node-1]=2;
else
{
mat[i][lst->node-1]=1;
mat[i++][begin->node-1]=-1;
}
lst=lst->next;
}
begin=begin->next;
}
ft_showmat(mat, b, n, 'U');
ft_freemat(&mat, b);
}
int **get_matadc(t_graph *begin, int*n)
{
int i;
int **mat;
t_list *lst;
get_graphsize(begin, n, &i);
mat=ft_newmat(*n,*n);
ft_initmat(mat, *n, *n ,0);
while(begin)
{
lst=begin->bow;
while(lst)
{
mat[begin->node-1][lst->node-1]=lst->weight;
lst=lst->next;
}
begin=begin->next;
}
return(mat);
}
void show_matadc(t_graph *begin) //afisarea ca mat de adiacenta
{
int n;
int **mat;
}
}
void show_graph(t_graph*begin) //afisarea mat menu
{
char c;
submenu("\nAfisarea Grafului");
puts("Cum doriti sa fie graful?");
menu_list("1-Matricea de incidenta");
menu_list("2-Matricea de adiacenta ");
menu_list("3-Lista de adiacenta");
menu_list("4-Inapoi");
c=getch();
c=toupper(c);
if (c=='1')
show_matinc(begin);
else if (c=='2')
show_matadc(begin);
else if(c=='3')
show_list(begin);
else if(c=='4')
return;
else
{
UNKNOWN;
show_graph(begin);
return;
}
WAIT;
}
void add_bow(t_graph *begin) //adaugare arc
{
int k;
int weight;
t_graph *t;
t_list *lst;
if(!*begin)
return;
t=*begin;
if((*begin)->node==node)
{
*begin=(*begin)->next;
free(t);
}
else
{
while (t->node !=node && t->next)
{
g=t;
t=t->next;
}
if(t->node==node)
{
g->next=t->next;
free(t);
}
}
}
void del_bow(t_graph *begin) //stergere arc
{
int k;
t_graph *t;
t_list *lst;
submenu("\nStergerea arcului:");
putstr("Sursa");
scanf("%d",&k);
t=find_node(begin,k);
if(!t)
ft_error("nod inexistent");
else
{
putstr("Destinatia");
scanf("%d",&k);
lst=t->bow;
while(lst && lst->node!=k)
lst=lst->next;
if(!lst)
ft_error("Arcul dat nu exista");
else
{
list_del(&(t->bow),k);
SUCCES;
}
}
}
void add_node(t_graph **begin) //adaugarea varfurilor
{
int i=1;
//char c;
t_graph *t;
if(*del==*begin)
{
*begin=(*begin)->next;
(*del)->next=NULL;
free_graph(del);
}
else
{
g=*begin;
while(g->next!=*del)
g=g->next;
g->next=(*del)->next;
(*del)->next=NULL;
free_graph(del);
}
}
void del_node(t_graph **begin) //stergerea varfurilor
{
int node;
t_graph *t;
t_graph *g;
t_list *lst;
submenu("\nStergerea varfului:");
putstr("Nr.de varfuri: ");
scanf("%d",&node);
t=find_node(*begin, node);
if(!t)
{
ft_error("varful dat nu exista!");
return;
}
g=t->next;
free_node(begin, &t);
while(g)
{
(g->node)--;
g=g->next;
}
t=*begin;
while(t)
{
list_del(&(t->bow),node);
lst=t->bow;
while(lst)
{
if (lst->node>node)
(lst->node)--;
lst=lst->next;
}
t=t->next;
}
SUCCES;
}
void modify_graph(t_graph **begin) //modificarea grafilui menu
{
char c;
else if (c=='4')
search_graph(begin);
else if (c=='5')
return;
else UNKNOWN;
showmenu(begin);
}
int main()
{
t_graph *begin;
begin=NULL;
showmenu(&begin);
free_graph(&begin);
return 0;
}
Bibliografie
V.Beșliu „Matematica Discretă.Ciclu de prelegeri”, Chișinău,2002