From 23e23f916e21b72854d0f7e249328f823cc88549 Mon Sep 17 00:00:00 2001 From: Vytor Calixto <vytorcalixto@gmail.com> Date: Fri, 12 May 2017 11:20:15 -0300 Subject: [PATCH] Add um monte de coisas --- libs/grafo.c | 4 ++-- libs/lista.c | 38 +++++++++++++++++++++++++++++++++++--- libs/lista.h | 9 +++++++++ libs/vertice.c | 2 ++ libs/vertice.h | 2 ++ main.c | 11 +++++++++-- tests/runTests.sh | 2 +- 7 files changed, 60 insertions(+), 8 deletions(-) diff --git a/libs/grafo.c b/libs/grafo.c index 07774be..d3f4729 100644 --- a/libs/grafo.c +++ b/libs/grafo.c @@ -19,8 +19,8 @@ Vertice insereVertice(Grafo g, Vertice v) { } void criaArco(Vertice v, Vertice w) { - insereLista(w, v->filhos); - insereLista(v, w->pais); + insereUnicoLista(w, v->filhos); + insereUnicoLista(v, w->pais); } void tabuleiroParaGrafo(Tblr t, Grafo g) { diff --git a/libs/lista.c b/libs/lista.c index d6cfac5..5362d1f 100644 --- a/libs/lista.c +++ b/libs/lista.c @@ -8,7 +8,7 @@ struct Lista { unsigned int tamanho; int padding; // só pra evitar warning - No primeiro; + No primeiro, ultimo; }; //--------------------------------------------------------------------------- // devolve o número de nós da Lista l @@ -34,6 +34,7 @@ Lista constroiLista(void) { return NULL; l->primeiro = NULL; + l->ultimo = NULL; l->tamanho = 0; return l; @@ -76,6 +77,31 @@ int destroiLista(Lista l, int destroi(void *)) { // ou NULL em caso de falha No insereLista(void *conteudo, Lista l) { + No novo = criaNo(); + + if ( ! novo ) + return NULL; + + setConteudo(novo, conteudo); + ++l->tamanho; + if(l->tamanho == 1) { + l->primeiro = novo; + } + if(l->ultimo) { + setSucessorNo(l->ultimo, novo); + } + l->ultimo = novo; + + return novo; +} + +//--------------------------------------------------------------------------- +// insere um novo nó na Lista l cujo conteúdo é p +// +// devolve o No recém-criado +// ou NULL em caso de falha + +No insereUnicoLista(void *conteudo, Lista l) { // Não insere se já estiver na lista for(No n = primeiroNoLista(l); n; n = getSucessorNo(n)) { if(getConteudo(n) == conteudo) { @@ -88,10 +114,16 @@ No insereLista(void *conteudo, Lista l) { return NULL; setConteudo(novo, conteudo); - setSucessorNo(novo, primeiroNoLista(l)); ++l->tamanho; + if(l->tamanho == 1) { + l->primeiro = novo; + } + if(l->ultimo) { + setSucessorNo(l->ultimo, novo); + } + l->ultimo = novo; - return l->primeiro = novo; + return novo; } //------------------------------------------------------------------------------ diff --git a/libs/lista.h b/libs/lista.h index 2056e1a..43179ca 100644 --- a/libs/lista.h +++ b/libs/lista.h @@ -25,6 +25,15 @@ No primeiroNoLista(Lista l); // ou NULL em caso de falha No insereLista(void *conteudo, Lista l); + +//------------------------------------------------------------------------------ +// insere um Novo nó na Lista l cujo conteúdo é p se p não estiver na lista +// +// devolve o No recém-criado +// ou NULL em caso de falha + +No insereUnicoLista(void *conteudo, Lista l); + //------------------------------------------------------------------------------ // cria uma Lista vazia e a devolve // diff --git a/libs/vertice.c b/libs/vertice.c index 105720b..019059d 100644 --- a/libs/vertice.c +++ b/libs/vertice.c @@ -1,4 +1,5 @@ #include <stdlib.h> +#include <stdbool.h> #include "vertice.h" #include "lista.h" @@ -7,6 +8,7 @@ Vertice criaVertice() { v->cor = -1; v->peso = 0; + v->grupo = false; v->pais = constroiLista(); v->filhos = constroiLista(); return v; diff --git a/libs/vertice.h b/libs/vertice.h index c707a56..3b509c7 100644 --- a/libs/vertice.h +++ b/libs/vertice.h @@ -1,10 +1,12 @@ #ifndef _VERTICE_ #define _VERTICE_ #include "lista.h" +#include <stdbool.h> struct Vertice { int cor; int peso; + bool grupo; Lista pais; Lista filhos; }; diff --git a/main.c b/main.c index 7b9e482..c9b43ff 100644 --- a/main.c +++ b/main.c @@ -1,6 +1,7 @@ #include <stdio.h> #include <stdlib.h> #include <stdio.h> +#include <stdbool.h> #include <time.h> #include "libs/tabuleiro.h" #include "libs/no.h" @@ -20,11 +21,17 @@ int main() { // Lista com o grupo inicial Lista grupo = constroiLista(); insereLista(t->celulas[0]->vert, grupo); // A célula na posição 0 do array é a célula no canto superior esquerdo + t->celulas[0]->vert->grupo = true; - // Desaloca lista do grupo - destroiLista(grupo, NULL); // Desaloca tabuleiro destroiTblr(t); + + // printf("Número de grupos: %d\n", tamanhoLista(g->vertices)); + Lista jogadas = constroiLista(); + + destroiLista(jogadas, NULL); + // Desaloca lista do grupo + destroiLista(grupo, NULL); // Desaloca grafo destroiGrafo(g); return 0; diff --git a/tests/runTests.sh b/tests/runTests.sh index 9cb373f..26e5f34 100755 --- a/tests/runTests.sh +++ b/tests/runTests.sh @@ -7,7 +7,7 @@ tempo_max=10000 #10s tams=(4 8 16 25 32 50 64 75 100 128) # lista de cores -cores=(2 3 4 5 6 7 8 16 32) +cores=(2 3 4 5 6 7 8 10) #-- Cores do terminal RED='\033[0;31m' -- GitLab