Vous êtes sur la page 1sur 10

#include<conio.

h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>
void setcolor(unsigned short color)
{
HANDLE hcon = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hcon,color);
}

typedef struct LISTA{


int virf;
struct LISTA *next;
}LISTA;

int din_incidenta(int ***m_adiacenta, int **m_incidenta, LISTA ***lista,int


varfuri,int arcuri)
{
LISTA **_lista=NULL, *pos=NULL;
int **_m_adiacenta=NULL;
int i,j,source,dest;

_m_adiacenta=(int**)malloc(varfuri*sizeof(int*));
if(!_m_adiacenta)return 0;
for(i=0;i<varfuri;i++)
{
_m_adiacenta[i]=(int*)malloc(varfuri*sizeof(int));
if(!_m_adiacenta[i])return 0;
for(j=0;j<varfuri;j++) _m_adiacenta[i][j]=0;
}

_lista=(LISTA**)malloc(varfuri*sizeof(LISTA*));
if(!lista)return 0;
for(i=0;i<varfuri;i++)_lista[i]=NULL;

for(i=0;i<arcuri;i++)
{
for(j=0;j<varfuri;j++)
{
if(m_incidenta[i][j]==-1)source=j;
else if(m_incidenta[i][j]==1)dest=j;
else if(m_incidenta[i][j]==2)source=dest=j;
}
_m_adiacenta[source][dest]=1;

if(!_lista[source])
{
_lista[source]=(LISTA*)malloc(sizeof(LISTA));
pos=_lista[source];
}
else
{
pos=_lista[source];
while(pos->next) pos=pos->next;
pos->next=(LISTA*)malloc(sizeof(LISTA));
pos=pos->next;
}
pos->virf=dest+1;
pos->next=NULL;
}

*m_adiacenta=_m_adiacenta;
*lista=_lista;
return 1;
}

void student ()
{
printf("\n\n\nRealizat de Neonil Rosca Gr.C171\n\n\n");
}

int din_lista(int ***m_adiacenta, int ***m_incidenta, LISTA **lista,int varfuri,int


*arcuri)
{
LISTA *pos=NULL;
int **_m_adiacenta=NULL, **_m_incidenta=NULL;
int _arcuri=0, i, j;

_m_adiacenta=(int**)malloc(varfuri*sizeof(int*));
if(!_m_adiacenta)return 0;
for(i=0;i<varfuri;i++)
{
_m_adiacenta[i]=(int*)malloc(varfuri*sizeof(int));
if(!_m_adiacenta[i])return 0;
for(j=0;j<varfuri;j++) _m_adiacenta[i][j]=0;
}

for(i=0;i<varfuri;i++)
{
pos=lista[i];
while(pos)
{
_m_adiacenta[i][pos->virf-1]=1;

_arcuri++;
_m_incidenta=(int**)realloc(_m_incidenta,_arcuri*sizeof(int*));
if(!_m_incidenta)return 0;
_m_incidenta[_arcuri-1]=(int*)malloc(varfuri*sizeof(int));
if(!_m_incidenta[_arcuri-1])return 0;
for(j=0;j<varfuri;j++) _m_incidenta[_arcuri-1][j]=0;
if(i==pos->virf-1) _m_incidenta[_arcuri-1][i]=2;
else
{
_m_incidenta[_arcuri-1][i]=-1;
_m_incidenta[_arcuri-1][pos->virf-1]=1;
}

pos=pos->next;
}
}
*m_incidenta=_m_incidenta;
*arcuri=_arcuri;
*m_adiacenta=_m_adiacenta;
return 1;
}

int din_adiacenta(int **m_adiacenta, int ***m_incidenta, LISTA ***lista,int


varfuri,int *arcuri)
{
LISTA **_lista=NULL, *pos=NULL;
int **_m_incidenta;
int _arcuri=0, i, j, ac=0;

for(i=0;i<varfuri;i++)
for(j=0;j<varfuri;j++)
if(m_adiacenta[i][j]==1)_arcuri++;

_m_incidenta=(int**)malloc(_arcuri*sizeof(int*));
if(!_m_incidenta)return 0;
for(i=0;i<_arcuri;i++)
{
_m_incidenta[i]=(int*)malloc(varfuri*sizeof(int));
if(!_m_incidenta[i])return 0;
for(j=0;j<varfuri;j++) _m_incidenta[i][j]=0;
}

_lista=(LISTA**)malloc(varfuri*sizeof(LISTA*));
if(!lista)return 0;

for(i=0;i<varfuri;i++)
{
_lista[i]=NULL;
for(j=0;j<varfuri;j++)
{
if(m_adiacenta[i][j]==1)
{
if(i==j)_m_incidenta[ac][i]=2;
else
{
_m_incidenta[ac][i]=-1;
_m_incidenta[ac][j]=1;
}
ac++;

if(!_lista[i])
{
_lista[i]=(LISTA*)malloc(sizeof(LISTA));
pos=_lista[i];
}
else
{
pos->next=(LISTA*)malloc(sizeof(LISTA));
pos=pos->next;
}
pos->virf=j+1;
pos->next=NULL;
}
}
}

*m_incidenta=_m_incidenta;
*arcuri=_arcuri;
*lista=_lista;
return 1;
}

int main()
{
int **m_incidenta=NULL, **m_adiacenta=NULL;
int i, j, buf, x, y, option, varfuri, arcuri, source, dest;
LISTA **lista=NULL, *pos=NULL,*next=NULL;
char s[100],*ptr;

while (1)
{
system("cls");
setcolor(2);
printf("\n\n\n\t\t ++++++++++++++++MENIU++++++++++++++++");
printf ("\n\t _________________________________________________________");
printf("\n\n\
Introducerea grafului prin intermediul: \n\n\
� 1.Matricii de adiacenta �\n\
� 2.Matricii de incidenta �\n\
� 3.Listei de adiacenta �\n\n");

printf ("\t _________________________________________________________");

printf("\n\n\
Afisarea grafului prin intermediul: \n\n\
� 4.Matricii de adiacenta �\n\
� 5.Matricii de incidenta �\n\
� 6.Listei de adiacenta �\n\n");

printf("\n\n\

� �\n\
� 0.Iesire �\n\

������������������������������������������������
�����ͼ\n");
setcolor(3);
printf("\n Alegeti comanda>>> ");
scanf("%d",&option);

switch (option)
{

case 1:
system("cls");
setcolor(3);
if(m_adiacenta!=NULL) puts(" Erorare !!! : Memoria este ocupata.");
else
{ setcolor(3);
printf(" Numarul de varfuri al grafului: ");
scanf("%d",&varfuri);

m_adiacenta=(int**)malloc(varfuri*sizeof(int*));
if(!m_adiacenta)exit(1);
for(i=0;i<varfuri;i++)
{
m_adiacenta[i]=(int*)malloc(varfuri*sizeof(int));
if(!m_adiacenta[i])exit(1);
}

setcolor(3);
puts("\n Itroduceti elementele matricii de adiacenta:\n");
printf(" ");
for(i=0;i<varfuri;i++)
{
printf(" X%d",i+1);
}
printf("\n");
for(i=0;i<varfuri;i++)
{
printf("X%d",i+1);
printf(" ");
for(j=0;j<varfuri;j++)
{

if( getch()!='1' ) m_adiacenta[i][j]=0;


else m_adiacenta[i][j]=1;
printf(" %d ",m_adiacenta[i][j]);
}
printf("\n");
}
}
setcolor(12);
if(!din_adiacenta(m_adiacenta,&m_incidenta,&lista,varfuri,&arcuri))

puts("\n Eroare !!!: Conversie esuata!");


getch();
break;

case 2:
system("cls");
if(m_incidenta!=NULL)
{ setcolor(12);
puts(" Erorare !!!: Memorie ocupata.");
getch();
}
else
{

setcolor(3);
printf(" Numarul de varfuri ale grafului: ");
scanf("%d",&varfuri);
printf(" Numarul de arcuri ale grafului : ");
scanf("%d",&arcuri);
m_incidenta=(int**)malloc(arcuri*sizeof(int*));
if(!m_incidenta)exit(1);
for(i=0;i<arcuri;i++)
{
m_incidenta[i]=(int*)malloc(varfuri*sizeof(int));
if(!m_incidenta[i])exit(1);
}

for(i=0;i<arcuri;i++)
{

setcolor(3);
printf("\n Muchia %d:\n",i+1);
setcolor(10);
printf(" Originea :\n");
scanf("%d",&source);
setcolor(10);
printf("Destinatia:\n");

scanf("%d",&dest);

if( source>varfuri || source<1 || dest>varfuri || dest<1 )


{ setcolor(12);
puts("Ati introdus niste valori inexistente!");
getch();
i--;
continue;
}
source--;
dest--;
for(j=0;j<varfuri;j++)
{
if(j!=source && j!=dest) m_incidenta[i][j]=0;
else if(j==source && j==dest)m_incidenta[i][j]=2;
else if(j==source) m_incidenta[i][j]=-1;
else if(j==dest) m_incidenta[i][j]=1;
}
}
}
if(!din_incidenta(&m_adiacenta,m_incidenta,&lista,varfuri,arcuri))
{ setcolor(12);
puts("\n Eroare !!!: Conversie esuata!");
getch();
}
break;

case 3:
system("cls");
if(lista!=NULL)
{ setcolor(12);
puts(" Erorare: Memorie ocupata.");
getch();
}
else
{
printf(" Numarul de varfuri a grafului: ");
scanf("%d",&varfuri);

lista=(LISTA**)malloc(varfuri*sizeof(LISTA*));
if(!lista)exit(1);

for(i=0;i<varfuri;i++)
{
printf(" Introduceti prin virgula elementele adiacente virfului %d:
",i+1);
fflush(stdin);
gets(s);
pos=lista[i]=NULL;

if( (ptr=strtok(s,",")) )
{
buf=atoi(ptr);
if(buf>0 && buf<=varfuri)
{
lista[i]=(LISTA*)malloc(sizeof(LISTA));
if(!lista[i]) exit(1);
pos=lista[i];
pos->next=NULL;
pos->virf=buf;
}

while( (ptr=strtok(NULL,",")) )
{
buf=atoi(ptr);
if(buf>0 && buf<=varfuri)
{
if(!lista[i])
{
lista[i]=(LISTA*)malloc(sizeof(LISTA));
if(!lista[i]) exit(1);
pos=lista[i];
pos->next=NULL;
pos->virf=buf;
}
else
{
pos->next=(LISTA*)malloc(sizeof(LISTA));
if(!pos->next) exit(1);
pos=pos->next;
pos->virf=buf;
pos->next=NULL;
}
}
}
}
}
}
if(!
din_lista(&m_adiacenta,&m_incidenta,lista,varfuri,&arcuri))
{
puts("\n Eroare !!!: Conversie esuata!");
getch();
}
break;

case 4:
system("cls");
if(!m_adiacenta)

puts(" Erorare !!!: Graful nu e introdus.");


else
{
puts(" Reprezentarea grafului introdus in forma matricii de
adiacenta:");

printf(" ");
for (i=0;i<varfuri;i++)
{
printf(" X%d",i+1);
}

for(i=0;i<varfuri;i++)
{
printf("\n");
printf("X%d ",i+1);
for(j=0;j<varfuri;j++)
{

printf(" %d ",m_adiacenta[i][j]);
}
}
}
getch();
break;

case 5:
system("cls");
if(!m_incidenta)

puts(" Erorare !!!: Graful nu e introdus.");


else
{
puts(" Reprezentarea grafului introdus in forma matricii de
incidenta:");

printf(" ");
for (i=0;i<varfuri;i++)
{
printf(" X%d",i+1);
}

printf("\n");
for(i=0;i<arcuri;i++)
{

printf("E(%d)",i+1);
for(j=0;j<varfuri;j++)
{

if(m_incidenta[i][j]!=-1) printf(" %d",m_incidenta[i][j]);


else printf(" %d",m_incidenta[i][j]);

}
printf("\n");
} }
getch();
break;

case 6:
system("cls");

if(!lista) puts(" Eroare !!!: Graful nu e introdus.");


else
{
puts(" Reprezentarea grafului introdus in forma listei de
adiacenta:\n");

for(i=0;i<varfuri;i++)
{
printf(" %d:",i+1);
pos=lista[i];
while(pos)
{
printf(" %d,",pos->virf);
pos=pos->next;
}
printf(" 0\n");
}

}
getch();
break;

case 7:
system("cls");
if(m_incidenta!=NULL)
{
for(i=0;i<arcuri;i++) free(m_incidenta[i]);
free(m_incidenta);
m_incidenta=NULL;
}

if(m_adiacenta!=NULL)
{
for(i=0;i<varfuri;i++) free(m_adiacenta[i]);
free(m_adiacenta);
m_adiacenta=NULL;
}

if(lista!=NULL)
{
for(i=0;i<varfuri;i++)
{
pos=lista[i]->next;
free(lista[i]);
while(pos)
{
next=pos->next;
free(pos);
pos=next;
}
}
free(lista);
lista=NULL;
} setcolor(12);
puts(" Graful a fost sters din memoria calculatorului");
getch();
break;

case 1999:
system("cls");
student ();
system ("pause");
break;

case 0:
system("cls");
return 0;
default:
puts("Ati introdus o comanda inexistenta!");
getch();

}
}

Vous aimerez peut-être aussi