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