Witam,
mam duuzy problem z wyszukaniem cyklu eulera przy pomocy listy incydencji, z nie wiadomych powodow program sie wywala modyfikowalem go "rozniscie" i niestety ciagle problemy :/
najpierw deklaracja struktur i zmiennych:
struct plista;
typedef struct plista lista;
struct plista
{
lista *nast;
int krawedz;
};
lista *first,*nowy,*wsk,*temp,**lista_i;
int *stos;
int *cykl;
int top_cykl=0;
int top_stos=0;
program glowny:
int main(int argc, char *argv[])
{
int x;
printf("Podaj liczbe wierzcholkow: \n");
scanf("%d",&x);
printf("Tworzenie grafu z cyklem Eulera...\n");
generuj_graf(x);
printf("\nGraf stworzony i zapisany do pliku plik.txt.\n");
tworz_macierz_s();
tworz_liste_i();
printf("\nCykl Euler'a:\n");
stos = calloc( (int)(lw*(lw-1))/2,sizeof(int) );
cykl = calloc( (int)(lw*(lw-1))/2,sizeof(int) );
cykl_eulera_lista();
while(top_cykl)
{
if(top_cykl!=1)
printf("%d -> ",cykl[--top_cykl]);
else
printf("%d",cykl[--top_cykl]);
}
free(stos);
stos=NULL;
free(cykl);
cykl=NULL;
printf("\n");
system("PAUSE");
return 0;
}
funkcje tworzaca liste incydencji:
void tworz_liste_i()
{
FILE *plik;
int i,j,n,k;
int wartosc;
int flaga=0;
plik=fopen("plik.txt","r");
printf("Tworzenie listy incydencji z plik.txt\n");
fscanf(plik,"%d",&n);
//printf("Liczba wierzcholkow z pliku %d\n",n);
lw=n;
//alokacja w pamieci macierzy sasiedztwa
lista_i=calloc(n,sizeof(lista *));
for(i=0;i<n;i++)
{
lista_i[i]=malloc(sizeof(lista*));
}
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
fscanf(plik,"%d",&k);
if(k==1)
{
if(flaga==0)
{
lista_i[i]->krawedz=j;
lista_i[i]->nast=NULL;
flaga=1;
}
else
create(j,lista_i[i]);
}
}
flaga=0;
}
fclose(plik);
//WYPISANIE LISTY INCYDENCJI NA EKRAN
for(i=0; i<n; i++)
{
printf("[%d] -> ",i);
wsk=lista_i[i];
while(wsk->nast != NULL)
{
printf("%d -> ",wsk->krawedz);
wsk=wsk->nast;
}
printf("%d -> ",wsk->krawedz);
printf("NULL\n");
}
}
void create(int value,lista *wsk)
{
lista *newelement;
newelement = malloc(sizeof(lista));
newelement->krawedz = value;
while(wsk->nast!= NULL)
{
wsk = wsk->nast;
}
newelement->nast = NULL;
wsk->nast = newelement;
}
funckja szukajaca cyklu eulera
void cykl_eulera_lista()
{
int v;
int i;
int start=0;
do
{
wsk=lista_i[start];
if(wsk==NULL)
{
printf("aaaaaa");
cykl[top_cykl++]=stos[--top_stos];
start=stos[top_stos-1];
}
else
{
v=wsk->krawedz;
del(start,lista_i[v],v);
del(v,lista_i[start],start);
stos[top_stos++]=v;
start=v;
}
}
while(top_stos);
}
Dodam, ze program wczytuje poprawny graf eulerowski z pliku tak wiec tam nie ma bledu.
Pozdrawiam !!!
Licze na Wasza pomoc :D
P.S.
mam problemy z zalogowaniem oraz z przypomnieniem hasla :(