/** Função que aloca memória para uma instância da estrutura Lista e inicializa os seus campos. */ Lista LIS_Criar() { string VALOR_QUALQUER = "extremo"; Lista lista = (Lista)malloc(sizeof(tpLista)); if( lista == NULL ) { return NULL; } lista->tamanho = 0; lista->cauda = CriarNo((string)VALOR_QUALQUER); if( lista->cauda == NULL ) { return NULL; } lista->cabeca = CriarNo(VALOR_QUALQUER); if( lista->cabeca == NULL ) { return NULL; } lista->cauda->anterior = lista->cabeca; lista->cauda->proximo = NULL; lista->cabeca->proximo = lista->cauda; lista->cabeca->anterior = NULL; return lista; }
ARV_tpCondRet CriarNoRaiz( char ValorParm ) { ARV_tpCondRet CondRet ; tpNoArvore * pNo ; if ( pArvore == NULL ) { CondRet = ARV_CriarArvore( ) ; if ( CondRet != ARV_CondRetOK ) { return CondRet ; } /* if */ } /* if */ if ( pArvore->pNoRaiz == NULL ) { pNo = CriarNo( ValorParm ) ; if ( pNo == NULL ) { return ARV_CondRetFaltouMemoria ; } /* if */ pArvore->pNoRaiz = pNo ; pArvore->pNoCorr = pNo ; return ARV_CondRetOK ; } /* if */ return ARV_CondRetNaoCriouRaiz ; } /* Fim função: ARV Criar nó raiz da árvore */
ARV_tpCondRet ARV_InserirEsquerda( ARV_tppArvore pArvore, void * conteudoNo ) { ARV_tpCondRet CondRet ; tppNoArvore pNo ; /* Tratar árvore inexistente */ if ( pArvore == NULL ) { return ARV_CondRetArvoreInexistente; } /* if */ /* fim ativa: Tratar árvore inexistente */ /* Tratar árvore vazia */ if ( pArvore->pNoRaiz == NULL ) { return ARV_CondRetArvoreVazia; } /* if */ /* fim ativa: Tratar árvore vazia */ /* Tratar nó corrente NULL, erro de estrutura */ if ( pArvore->pNoCorr == NULL ) { return ARV_CondRetErroEstrutura ; } /* if */ /* fim ativa: Tratar nó corrente NULL, erro de estrutura */ /* Tratar folha esquerda, criar nó à esquerda */ if ( pArvore->pNoCorr->pNoEsq == NULL ) { pNo = CriarNo ( conteudoNo ) ; if ( pNo == NULL ) { return ARV_CondRetFaltouMemoria ; } /* if */ pNo->pNoPai = pArvore->pNoCorr; pArvore->pNoCorr->pNoEsq = pNo; pArvore->pNoCorr = pNo; pArvore->numNos++; return ARV_CondRetOK ; } /* if */ /* fim ativa: Tratar folha à esquerda, criar nó à esquerda */ /* Tratar não folha à esquerda */ return ARV_CondRetNaoEhFolha ; } /* Fim função: ARV Adicionar filho à esquerda */
/* Função que insere um valor numa determinada posição da lista. Após a execução desta função, o elemento inserido será o i-esimo elemento da lista. @param lista - lista em que será feita a inserção @param v - valor a ser inserido na lista @param i - indica a posição que o novo elemento ocupará após a inserção @return true se inseriu com sucesso, false caso contrário */ bool LIS_Inserir(Lista lista, int v, int i) { No novo = CriarNo(v); if( novo == NULL ){ return false; } No no = lista->cabeca; if (i > lista->tamanho+1 || i <= 0){ return false; } if(i == lista->tamanho+1){ return LIS_InserirFim(lista,v); } if(lista->tamanho == 0){ return LIS_InserirInicio(lista,v); } while (--i){ no = no->proximo; } novo->anterior = no; novo->proximo = no->proximo; no->proximo->anterior = novo; no->proximo = novo; lista->tamanho++; return true; }
ARV_tpCondRet ARV_InserirDireita( void* pArvoreParm, void* ListaCharParm ) { tpArvore * pArvore ; ARV_tpCondRet CondRet ; tpNoArvore * pCorr ; tpNoArvore * pNo ; if ( pArvoreParm == NULL ) { return ARV_CondRetArvoreNaoExiste ; } pArvore = ( tpArvore* )( pArvoreParm ); /* Tratar vazio, direita */ CondRet = CriarNoRaiz( pArvore, ListaCharParm ) ; if ( CondRet != ARV_CondRetNaoCriouRaiz ) { return CondRet ; } /* if */ /* Criar nó à direita de folha */ pCorr = pArvore->pNoCorr ; if ( pCorr == NULL ) { return ARV_CondRetErroEstrutura ; } /* if */ if ( pCorr->pNoDir == NULL ) { pNo = CriarNo( pArvore, ListaCharParm ) ; if ( pNo == NULL ) { return ARV_CondRetFaltouMemoria ; } /* if */ pNo->pNoPai = pCorr ; pCorr->pNoDir = pNo ; pArvore->pNoCorr = pNo ; return ARV_CondRetOK ; } /* if */ /* Tratar não folha à direita */ return ARV_CondRetNaoEhFolha ; } /* Fim função: ARV Adicionar filho à direita */
/** Função que aloca memória para uma instância da estrutura Lista e inicializa os seus campos. */ Lista LIS_Criar(){ Lista lista = (Lista)malloc(sizeof(tpLista)); if( lista == NULL ){ return NULL; } lista->cabeca = CriarNo(VALOR_QUALQUER); if( lista->cabeca == NULL ){ return NULL; } lista->cauda = CriarNo(VALOR_QUALQUER); if( lista->cauda == NULL ){ return NULL; } lista->cabeca->proximo = lista->cauda; lista->cauda->anterior = lista->cabeca; lista->cabeca->anterior = NULL; lista->cauda->proximo = NULL; return lista; }
/* Função que insere um valor no início da lista. Após a execução desta função, o elemento inserido será o primeiro elemento da lista. @param lista - lista em que será feita a inserção @param v - valor a ser inserido na lista @return true se inseriu com sucesso, false caso contrário */ bool LIS_InserirInicio(Lista lista, int v) { No no = CriarNo(v); if( no == NULL ){ return false; } No primeiro = lista->cabeca->proximo; lista->cabeca->proximo = no; no->anterior = lista->cabeca; no->proximo = primeiro; primeiro->anterior = no; return true; }
/* Função que insere um valor no fim da lista. Após a execução desta função, o elemento inserido será o último elemento da lista. @param lista - lista em que será feita a inserção @param v - valor a ser inserido na lista @return true se inseriu com sucesso, false caso contrário */ bool LIS_InserirFim(Lista lista, int v) { No no = CriarNo(v); if( no == NULL ){ return false; } No ultimo = lista->cauda->anterior; lista->cauda->anterior = no; no->proximo = lista->cauda; no->anterior = ultimo; ultimo->proximo = no; lista->tamanho++; return true; }
bool LIS_InserirFim(Lista lista, string conteudo, string nome, string dataHora) { No no = CriarNo(conteudo,nome,dataHora); if( no == NULL ) { return false; } No ultimo = lista->cauda->anterior; lista->cauda->anterior = no; no->proximo = lista->cauda; no->anterior = ultimo; ultimo->proximo = no; lista->tamanho++; return true; }
ARV_tpCondRet ARV_InserirDireita( char ValorParm ) { ARV_tpCondRet CondRet ; tpNoArvore * pCorr ; tpNoArvore * pNo ; /* Tratar vazio, direita */ CondRet = CriarNoRaiz( ValorParm ) ; if ( CondRet != ARV_CondRetNaoCriouRaiz ) { return CondRet ; } /* if */ /* Criar nó à direita de folha */ pCorr = pArvore->pNoCorr ; if ( pCorr == NULL ) { return ARV_CondRetErroEstrutura ; } /* if */ if ( pCorr->pNoDir == NULL ) { pNo = CriarNo( ValorParm ) ; if ( pNo == NULL ) { return ARV_CondRetFaltouMemoria ; } /* if */ pNo->pNoPai = pCorr ; pCorr->pNoDir = pNo ; pArvore->pNoCorr = pNo ; return ARV_CondRetOK ; } /* if */ /* Tratar não folha à direita */ return ARV_CondRetNaoEhFolha ; } /* Fim função: ARV Adicionar filho à direita */
ARV_tpCondRet ARV_CriarNoRaiz ( ARV_tppArvore pArvore, void * conteudoNo ) { ARV_tpCondRet CondRet; tppNoArvore pNo; /* Tratar árvore inexistente */ if ( pArvore == NULL ) { return ARV_CondRetArvoreInexistente ; } /* if */ /* fim ativa: Tratar árvore inexistente */ /* Tratar árvore vazia */ if ( pArvore->pNoRaiz == NULL ) { pNo = CriarNo ( conteudoNo ) ; if ( pNo == NULL ) { return ARV_CondRetFaltouMemoria ; } /* if */ pArvore->pNoRaiz = pNo ; pArvore->pNoCorr = pNo ; pArvore->numNos++; return ARV_CondRetOK ; } /* if */ /* fim ativa: Tratar árvore vazia */ /* Tratar não folha à direita */ return ARV_CondRetNaoCriouRaiz ; } /* Fim função: ARV Criar nó raiz da árvore */
ARV_tpCondRet CriarNoRaiz( tpArvore* pArvore, void* ListaCharParm ) { tpNoArvore * pNo ; ARV_tpCondRet CondRet ; if ( pArvore->pNoRaiz == NULL ) { pNo = CriarNo( pArvore, ListaCharParm ) ; if ( pNo == NULL ) { return ARV_CondRetFaltouMemoria ; } /* if */ pArvore->pNoRaiz = pNo ; pArvore->pNoCorr = pNo ; return ARV_CondRetOK ; } /* if */ return ARV_CondRetNaoCriouRaiz ; } /* Fim função: ARV Criar nó raiz da árvore */
MAT_tpCondRet PreparaEstruturaMatriz( MAT_tpMatriz * tpMat, GRA_tppGrafo pGrafo , int numElementos ){ int i = 0, j = 0; char * IdVertices[64] = { "A1","A2","A3","A4","A5","A6","A7","A8", "B1","B2","B3","B4","B5","B6","B7","B8", "C1","C2","C3","C4","C5","C6","C7","C8", "D1","D2","D3","D4","D5","D6","D7","D8", "E1","E2","E3","E4","E5","E6","E7","E8", "F1","F2","F3","F4","F5","F6","F7","F8", "G1","G2","G3","G4","G5","G6","G7","G8", "H1","H2","H3","H4","H5","H6","H7","H8" }; tpElemMatriz * tpElemLesteCabeca = NULL; tpElemMatriz * tpElemSudesteCabeca = NULL; tpElemMatriz * tpElemSulCabeca = NULL; tpElemMatriz * tpElemLesteNo = NULL; tpElemMatriz * tpElemSudesteNo = NULL; tpElemMatriz * tpElemSulNo = NULL; tpElemMatriz * tpElem = CriarNo( pGrafo , IdVertices[0] ); if(tpElem == NULL) { return MAT_CondRetFaltouMemoria ; } if(numElementos == 1){ tpMat->pNoCorr = tpElem; tpMat->pNoRaiz = tpElem; tpMat->pNoIndLinha = tpElem; return MAT_CondRetOK; } numElementos = numElementos - 1; for(i=0;i<=numElementos;i++){ for(j=0;j<=numElementos;j++){ /* testa a condicão para 3 adjacentes */ if((i==0 || i==numElementos) && (j==0 || j==numElementos)){ if(i==0 && j==0){ tpMat->pNoCorr = tpElem; tpMat->pNoRaiz = tpElem; tpMat->pNoIndLinha = tpElem; tpElemLesteCabeca = CriarNo( pGrafo , IdVertices[1] ); tpElemSudesteCabeca = CriarNo( pGrafo , IdVertices[9] ); tpElemSulCabeca = CriarNo( pGrafo , IdVertices[8]); if(tpElemLesteCabeca==NULL || tpElemSudesteCabeca==NULL || tpElemSulCabeca==NULL){ return MAT_CondRetFaltouMemoria ; } tpMat->pNoCorr->pNoLeste = tpElemLesteCabeca; tpMat->pNoCorr->pNoSudeste = tpElemSudesteCabeca; tpMat->pNoCorr->pNoSul = tpElemSulCabeca; } if(i==0 && j==numElementos){ tpMat->pNoCorr->pNoLeste->pNoSul = tpMat->pNoCorr->pNoSudeste; tpMat->pNoCorr->pNoLeste->pNoSudoeste = tpMat->pNoCorr->pNoSul; tpMat->pNoCorr->pNoLeste->pNoOeste = tpMat->pNoCorr; tpMat->pNoCorr = tpMat->pNoCorr->pNoLeste ; /* seta como corrente */ } if(i==numElementos && j==0){ tpMat->pNoIndLinha->pNoSul->pNoNorte = tpMat->pNoIndLinha; tpMat->pNoIndLinha->pNoSul->pNoNordeste = tpMat->pNoIndLinha->pNoLeste; tpMat->pNoIndLinha->pNoSul->pNoLeste = tpMat->pNoIndLinha->pNoSudeste; tpMat->pNoCorr = tpMat->pNoIndLinha->pNoSul; /* seta como corrente */ tpMat->pNoIndLinha = tpMat->pNoIndLinha->pNoSul; /* seta como indice da linha */ } if(i==numElementos && j==numElementos){ tpMat->pNoCorr->pNoLeste->pNoNorte = tpMat->pNoCorr->pNoNordeste; tpMat->pNoCorr->pNoLeste->pNoNoroeste = tpMat->pNoCorr->pNoNorte; tpMat->pNoCorr->pNoLeste->pNoOeste = tpMat->pNoCorr; tpMat->pNoCorr = tpMat->pNoCorr->pNoLeste; /* seta como corrente */ } } /* testa a condição para 5 adjacentes */ else if(i==0 || i==numElementos || j==0 || j==numElementos){ if(i==0 && (j!=numElementos || j!=0)){ tpMat->pNoCorr->pNoLeste->pNoSul = tpMat->pNoCorr->pNoSudeste; tpMat->pNoCorr->pNoLeste->pNoSudoeste = tpMat->pNoCorr->pNoSul; tpMat->pNoCorr->pNoLeste->pNoOeste = tpMat->pNoCorr; tpElemLesteNo = CriarNo( pGrafo , IdVertices[j+1]); tpElemSudesteNo = CriarNo( pGrafo , IdVertices[(numElementos * (i+1)) + (j+2)]); if(tpElemLesteNo==NULL || tpElemSudesteNo==NULL){ return MAT_CondRetFaltouMemoria ; } tpMat->pNoCorr->pNoLeste->pNoLeste = tpElemLesteNo; tpMat->pNoCorr->pNoLeste->pNoSudeste = tpElemSudesteNo; tpMat->pNoCorr = tpMat->pNoCorr->pNoLeste; /* seta como corrente */ } if(j==0 && (i!=numElementos || i!=0)){ tpMat->pNoIndLinha->pNoSul->pNoLeste = tpMat->pNoIndLinha->pNoSudeste; tpMat->pNoIndLinha->pNoSul->pNoNordeste = tpMat->pNoIndLinha->pNoLeste; tpMat->pNoIndLinha->pNoSul->pNoNorte = tpMat->pNoIndLinha; tpElemSulNo = CriarNo( pGrafo , IdVertices[(numElementos * (i+1)) + (i+1)]); tpElemSudesteNo = CriarNo( pGrafo , IdVertices[(numElementos * (i+1)) + (i+2)]); if(tpElemSulNo==NULL || tpElemSudesteNo==NULL){ return MAT_CondRetFaltouMemoria ; } tpMat->pNoIndLinha->pNoSul->pNoSudeste = tpElemSudesteNo; tpMat->pNoIndLinha->pNoSul->pNoSul = tpElemSulNo; tpMat->pNoCorr = tpMat->pNoIndLinha->pNoSul; /* seta como corrente */ tpMat->pNoIndLinha = tpMat->pNoIndLinha->pNoSul; /* seta como indice da linha */ } if(i==numElementos && (j!=numElementos || j!=0)){ tpMat->pNoCorr->pNoLeste->pNoLeste = tpMat->pNoCorr->pNoNordeste->pNoSudeste; tpMat->pNoCorr->pNoLeste->pNoNordeste = tpMat->pNoCorr->pNoNordeste->pNoLeste; tpMat->pNoCorr->pNoLeste->pNoNorte = tpMat->pNoCorr->pNoNordeste; tpMat->pNoCorr->pNoLeste->pNoNoroeste = tpMat->pNoCorr->pNoNorte; tpMat->pNoCorr->pNoLeste->pNoOeste = tpMat->pNoCorr; tpMat->pNoCorr = tpMat->pNoCorr->pNoLeste; /* seta como corrente */ } if(j==numElementos && (i!=numElementos || i!=0)){ tpMat->pNoCorr->pNoLeste->pNoNorte = tpMat->pNoCorr->pNoNordeste; tpMat->pNoCorr->pNoLeste->pNoSul = tpMat->pNoCorr->pNoSudeste; tpMat->pNoCorr->pNoLeste->pNoSudoeste = tpMat->pNoCorr->pNoSul; tpMat->pNoCorr->pNoLeste->pNoOeste = tpMat->pNoCorr; tpMat->pNoCorr->pNoLeste->pNoNoroeste = tpMat->pNoCorr->pNoNorte; tpMat->pNoCorr = tpMat->pNoCorr->pNoLeste; /* seta como corrente */ } } /* 8 adjacentes */ else{ tpMat->pNoCorr->pNoLeste->pNoNorte = tpMat->pNoCorr->pNoNordeste; tpMat->pNoCorr->pNoLeste->pNoNordeste = tpMat->pNoCorr->pNoNordeste->pNoLeste; tpMat->pNoCorr->pNoLeste->pNoLeste = tpMat->pNoCorr->pNoNordeste->pNoSudeste; tpMat->pNoCorr->pNoLeste->pNoSul = tpMat->pNoCorr->pNoSudeste; tpMat->pNoCorr->pNoLeste->pNoSudoeste = tpMat->pNoCorr->pNoSul; tpMat->pNoCorr->pNoLeste->pNoOeste = tpMat->pNoCorr; tpMat->pNoCorr->pNoLeste->pNoNoroeste = tpMat->pNoCorr->pNoNorte; tpElemSudesteNo = CriarNo( pGrafo , IdVertices[(numElementos * (i+1)) + ((j+1)+(i+1))]); if(tpElemSudesteNo==NULL){ return MAT_CondRetFaltouMemoria ; } tpMat->pNoCorr->pNoLeste->pNoSudeste = tpElemSudesteNo; tpMat->pNoCorr = tpMat->pNoCorr->pNoLeste; /* seta como corrente */ } } } return MAT_CondRetOK; }