print all cycles with mat vec
This commit is contained in:
parent
dee4624ab3
commit
0ac868fb25
@ -29,7 +29,7 @@ int main(int argc, char *argv[])
|
|||||||
graph_mco gmc = mcgragh();
|
graph_mco gmc = mcgragh();
|
||||||
// find_funcs("/home/user/files/dot_files/st/x.c", &gv, &gmc);
|
// find_funcs("/home/user/files/dot_files/st/x.c", &gv, &gmc);
|
||||||
// find_funcs("test.c", &gv, &gmc);
|
// find_funcs("test.c", &gv, &gmc);
|
||||||
findAndParse("/home/user/files/dot_files/dwm/", &gv, &gmc);
|
findAndParse("/home/user/files/dot_files/st/", &gv, &gmc);
|
||||||
// int n = mcis_in(gmc, m);
|
// int n = mcis_in(gmc, m);
|
||||||
// printf("%d\n", n);
|
// printf("%d\n", n);
|
||||||
// mcprint_edges(gmc, n);
|
// mcprint_edges(gmc, n);
|
||||||
@ -43,7 +43,8 @@ int main(int argc, char *argv[])
|
|||||||
// }
|
// }
|
||||||
// printf("TEST: %s %d\n", gmc.func[2], gmc.vec[2].j);
|
// printf("TEST: %s %d\n", gmc.func[2], gmc.vec[2].j);
|
||||||
//
|
//
|
||||||
// vprint_nodes(gv.node[n]);
|
// vprint_nodes(gv.node[0]);
|
||||||
|
vfind_cycles(&gv);
|
||||||
mcdelete_graph(&gmc);
|
mcdelete_graph(&gmc);
|
||||||
vdot_graph(gv, true);
|
vdot_graph(gv, true);
|
||||||
vdelete_graph(&gv);
|
vdelete_graph(&gv);
|
||||||
|
@ -1,8 +1,10 @@
|
|||||||
#include "matcom.h"
|
#include "matcom.h"
|
||||||
#include <stdlib.h>
|
#include "stack.h"
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <string.h>
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
graph_mco mcgragh(void)
|
graph_mco mcgragh(void)
|
||||||
{
|
{
|
||||||
|
@ -14,8 +14,8 @@ struct graph_mco {
|
|||||||
int nbs; // nombre de sommets
|
int nbs; // nombre de sommets
|
||||||
int nba; // nombre d'aretes
|
int nba; // nombre d'aretes
|
||||||
int vcap; // capacité de vec
|
int vcap; // capacité de vec
|
||||||
int fcap; // capacité de vec
|
int fcap; // capacité de func
|
||||||
fix_str *func; // noms de fonction
|
fix_str *func; // noms de fonctions
|
||||||
struct edge *vec; // vecteur d'aretes
|
struct edge *vec; // vecteur d'aretes
|
||||||
};
|
};
|
||||||
|
|
||||||
|
44
src/stack.c
Normal file
44
src/stack.c
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
#include "stack.h"
|
||||||
|
#include <assert.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
stack_t init_stack(void)
|
||||||
|
{
|
||||||
|
stack_t s;
|
||||||
|
s.p = malloc((s.cap = 128) * sizeof(int));
|
||||||
|
assert(s.p);
|
||||||
|
s.top = -1;
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
void push(stack_t *stack, int v)
|
||||||
|
{
|
||||||
|
if (stack->top >= stack->cap) {
|
||||||
|
stack->p = realloc(stack->p, (stack->cap += 128) * sizeof(int));
|
||||||
|
assert(stack->p);
|
||||||
|
}
|
||||||
|
stack->top++;
|
||||||
|
stack->p[stack->top] = v;
|
||||||
|
}
|
||||||
|
|
||||||
|
int pop(stack_t *stack)
|
||||||
|
{
|
||||||
|
return stack->p[stack->top--];
|
||||||
|
}
|
||||||
|
|
||||||
|
int empty(stack_t stack)
|
||||||
|
{
|
||||||
|
return stack.top < 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int top(stack_t stack)
|
||||||
|
{
|
||||||
|
return stack.p[stack.top];
|
||||||
|
}
|
||||||
|
|
||||||
|
void free_stack(stack_t *s)
|
||||||
|
{
|
||||||
|
if (s->p)
|
||||||
|
free(s->p);
|
||||||
|
s->p = NULL;
|
||||||
|
}
|
20
src/stack.h
Normal file
20
src/stack.h
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
#ifndef STACK_H
|
||||||
|
|
||||||
|
#define STACK_H
|
||||||
|
|
||||||
|
typedef struct stack_t stack_t;
|
||||||
|
|
||||||
|
struct stack_t {
|
||||||
|
int *p;
|
||||||
|
int top;
|
||||||
|
int cap;
|
||||||
|
};
|
||||||
|
|
||||||
|
void push(stack_t *stack, int v);
|
||||||
|
int pop(stack_t *stack);
|
||||||
|
int empty(stack_t stack);
|
||||||
|
int top(stack_t stack);
|
||||||
|
stack_t init_stack(void);
|
||||||
|
void free_stack(stack_t *s);
|
||||||
|
|
||||||
|
#endif /* end of include guard: STACK_H */
|
52
src/vec.c
52
src/vec.c
@ -1,3 +1,4 @@
|
|||||||
|
#include "stack.h"
|
||||||
#include "vec.h"
|
#include "vec.h"
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@ -25,6 +26,7 @@ void vinsert_node(graph_vec *g, fix_str str)
|
|||||||
n->num = g->n;
|
n->num = g->n;
|
||||||
n->nbs = 0;
|
n->nbs = 0;
|
||||||
n->vu = 0;
|
n->vu = 0;
|
||||||
|
n->dvu = 0;
|
||||||
n->cap = 5;
|
n->cap = 5;
|
||||||
n->succ = malloc(5 * sizeof(nodept));
|
n->succ = malloc(5 * sizeof(nodept));
|
||||||
strcpy(n->func, str);
|
strcpy(n->func, str);
|
||||||
@ -102,7 +104,7 @@ void main_graph(FILE *fp, nodept node)
|
|||||||
if (node->vu == 1)
|
if (node->vu == 1)
|
||||||
return;
|
return;
|
||||||
node->vu = 1;
|
node->vu = 1;
|
||||||
printf("NODE: %s\n", node->func);
|
// printf("NODE %d: %s\n", node->num, node->func);
|
||||||
for (i = 0; i < node->nbs; ++i) {
|
for (i = 0; i < node->nbs; ++i) {
|
||||||
fprintf(fp, "\t%s -> %s;\n", node->func, node->succ[i]->func);
|
fprintf(fp, "\t%s -> %s;\n", node->func, node->succ[i]->func);
|
||||||
}
|
}
|
||||||
@ -137,3 +139,51 @@ void vdot_graph(graph_vec g, bool main)
|
|||||||
|
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum { NOT_VISITED = 0, IN_STACK = 1, DONE = 2 };
|
||||||
|
|
||||||
|
// NOTE: https://www.baeldung.com/cs/detecting-cycles-in-directed-graph
|
||||||
|
void print_cycle(graph_vec g, stack_t s, int v)
|
||||||
|
{
|
||||||
|
stack_t s2 = init_stack();
|
||||||
|
push(&s2, pop(&s));
|
||||||
|
while (top(s2) != v) {
|
||||||
|
push(&s2, pop(&s));
|
||||||
|
}
|
||||||
|
while (!empty(s2)) {
|
||||||
|
printf("%s -> ", g.node[pop(&s2)]->func);
|
||||||
|
}
|
||||||
|
printf("%s\n", g.node[v]->func);
|
||||||
|
free_stack(&s2);
|
||||||
|
}
|
||||||
|
|
||||||
|
void processDFS(nodept n, stack_t *s, graph_vec g)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < n->nbs; ++i) {
|
||||||
|
int v = n->succ[i]->num;
|
||||||
|
if (n->succ[i]->dvu == IN_STACK) {
|
||||||
|
print_cycle(g, *s, v);
|
||||||
|
} else if (n->succ[i]->dvu == NOT_VISITED) {
|
||||||
|
push(s, v);
|
||||||
|
n->succ[i]->dvu = IN_STACK;
|
||||||
|
processDFS(n->succ[i], s, g);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
n->dvu = DONE;
|
||||||
|
pop(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
void vfind_cycles(graph_vec *g)
|
||||||
|
{
|
||||||
|
int v;
|
||||||
|
for (v = 0; v <= g->n; ++v) {
|
||||||
|
if (g->node[v]->dvu == NOT_VISITED) {
|
||||||
|
stack_t s = init_stack();
|
||||||
|
push(&s, v);
|
||||||
|
g->node[v]->dvu = IN_STACK;
|
||||||
|
processDFS(g->node[v], &s, *g);
|
||||||
|
free_stack(&s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
10
src/vec.h
10
src/vec.h
@ -9,17 +9,18 @@ typedef struct node *nodept;
|
|||||||
typedef struct nodes graph_vec;
|
typedef struct nodes graph_vec;
|
||||||
|
|
||||||
struct nodes {
|
struct nodes {
|
||||||
int n;
|
int n; // nombre de noeuds
|
||||||
int cap;
|
int cap; // capacité (pour realloc)
|
||||||
nodept *node;
|
nodept *node; // toutes les nodes
|
||||||
};
|
};
|
||||||
|
|
||||||
struct node {
|
struct node {
|
||||||
|
int dvu;
|
||||||
int vu;
|
int vu;
|
||||||
int num; // le numero de noeud
|
int num; // le numero de noeud
|
||||||
int nbs; // nombre de successeurs
|
int nbs; // nombre de successeurs
|
||||||
fix_str func; // noms de fonctions
|
fix_str func; // noms de fonctions
|
||||||
int cap;
|
int cap; // capacité (pour realloc)
|
||||||
nodept *succ; // les successeurs
|
nodept *succ; // les successeurs
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -29,5 +30,6 @@ void vdelete_graph(graph_vec *g);
|
|||||||
int vis_in(graph_vec g, fix_str func);
|
int vis_in(graph_vec g, fix_str func);
|
||||||
void vdot_graph(graph_vec g, bool main);
|
void vdot_graph(graph_vec g, bool main);
|
||||||
void vprint_nodes(nodept node);
|
void vprint_nodes(nodept node);
|
||||||
|
void vfind_cycles(graph_vec *g);
|
||||||
|
|
||||||
#endif /* end of include guard: VEC_H */
|
#endif /* end of include guard: VEC_H */
|
||||||
|
Loading…
Reference in New Issue
Block a user