Problem jest taki że nie zgadzają mi się wskaźniki.
Oczywiście błędów brak tylko waningi.
Ten program ma znaleźć cykle proste w grafie, reprezentacja jest w postaci tablicy list sąsiadów i tu jest chyba główny problem że źle się odwołuje do tych tablic.
W tym skrypcie do budowy stosu używam tych samych funkcji co do listy tutaj to powinno na jedno wyjść, to tak informacyjnie.
Graf jest nieskierowany.
Proszę o pomoc kod:
//23.Mając dany graf nieskierowanego G(V,E) wyznacz cykle proste w grafie.
//Zakładamy reprezentację w postaci tablicy list sąsiedztwa.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
//dla stosu będziemy kożystac z tego samego co lista
typedef struct el {
int x;
struct el *nast;
} elem;
typedef elem *wsk;
typedef wsk *wwsk;
wsk dodpw(wsk *l, int y) {
wsk q = malloc(sizeof(elem));
q->x = y;
q->nast = *l;
*l = q;
}
void usunpie(wsk *l)
{
wsk p;
if (*l != 0)
{
p = *l;
*l = (*l)->nast;
free(p);
}
}
void drukb(wsk l)
{
if (l == NULL)return;
if (l->nast != NULL)
{
drukb(l->nast);
}
printf("=>%d", l->x);
}
int topS(wsk S) //zwraca szczyt stosu
{
return S->x;
}
wsk DFS_C(wsk *tab, int V, int W, wsk S, wsk *tabO)
{
int u;
wsk l;
tabO[W] = 1;
l = &tab[W]; //LOL
while(l)
{
u = l->x;
if(u != topS(S))
{
dodpw(&S, W);
if (u == V)return 1; //?
if ((tabO[u] != 1) && DFS_C(tab, V, u, S, tabO))return 1; //?
usunpie(&S);
}
l = l->nast;
}
return 0;
}
main()
{
wsk *tab;
wsk *tabO;
wsk S;
int V;
int u;
int x;
int o = 1;
int i = 1;
int s;
int ii=1;
int c;
printf("Podaj liczbe wierzcholkow\n");
scanf("%d",&V);
V++; //bo z zerowego indeksu nie biore
tab=malloc(sizeof(elem)*V);
tabO=malloc(sizeof(int)*V);
for (i = 1; i < V; i++) tab[i] = NULL;
i = 1;
while (i!=V)
{
printf("Podaj liste sasiadow wierzcholka %d\n",i);
scanf("%d",&s);
while(s!=0)
{
dodpw(&tab[i],s);
scanf("%d", &s);
}
i++;
}
printf("Reprezentacja twojego grafu\n");
while (ii != V)
{
drukb(tab[ii]);
printf("\n");
ii++;
}
printf("Szukam Cykli\n");
for(c = 1; c < V;c++)
{
for (o = 1; o < V; o++) tabO[o] = 0; //tablica odwiedzonych zerowanie
dodpw(&S,-1); //znacznik początkowej ściezki stosu
printf("Wierzcholek startowy może byc dowolny u nas 1\n");
//Szukanie Cykli
if (!DFS_C(&tab, c, c, S, &tabO))
{
usunpie(&S);
printf("Brak Cyklu\n");
}
else
{
while (S != NULL)
{
u = topS(S);
usunpie(&S);
if (u > -1) printf("%d\n",u);
else printf("-\n"); //brak pomyslu
}
}
}
/*
Kod testowy czy funkcje dzialają
wsk l=NULL;
int x;
int i=0;
printf("x=\n");
scanf("%d",&x);
i++;
while (x != 0)
{
dodpw(&l,x);
scanf("%d",&x);
i++;
}
drukb(l);
while (i != 0)
{
usunpie(&l);
i--;
};
if (l != NULL)
{
drukb(l);
}
else
{
printf("Lista pusta\n");
}*/
system("pause");
}