Cykle w Grafie Reprezentacja Tablica List Sąsiadów

0

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");
}
0

Trochę to zmodyfikowałam i teraz stos coś nie łapie a przynajmniej tak twierdzi debugger.

0

@xXMamboXx debugera trzeba umieć używać. On nie służy do tego że odpalasz program w trybie debug a błędy się same naprawią. Postaw łaskawie breakpoint na początku tego kodu a potem pod debugerem wykonuj program instrukcja po instrukcji patrząc jakie wartości maja zmienne i co się dokładnie dzieje.

0

Nie takie było pytanie. Złośliwość raczej jeszcze nikomu nie pomogła.

1 użytkowników online, w tym zalogowanych: 0, gości: 1