From 0349bcf95892c3d412f8c4473b10dbfe2efa575c Mon Sep 17 00:00:00 2001 From: ed1rac Date: Tue, 19 Mar 2024 18:31:01 -0300 Subject: [PATCH] =?UTF-8?q?=C3=9Altimos=20arquivos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- UNP/2023/1 seg/Arrays/array_n_numeros.c | 6 +- UNP/ref/C/Arvores/Arvore-B/TAB.c | 315 +++++++++++++----------- 2 files changed, 181 insertions(+), 140 deletions(-) diff --git a/UNP/2023/1 seg/Arrays/array_n_numeros.c b/UNP/2023/1 seg/Arrays/array_n_numeros.c index 7c463c2..bf74838 100644 --- a/UNP/2023/1 seg/Arrays/array_n_numeros.c +++ b/UNP/2023/1 seg/Arrays/array_n_numeros.c @@ -4,14 +4,14 @@ int main() { int i, tamanho; - printf("Digite um tamanho de array [mx: 100]"); + printf("Digite um tamanho de array [máx: 100]"); scanf(" %d", &tamanho); int array[tamanho]; for (i = 0; i < tamanho; i++) { array[i] = 2 * i + 1; - printf("Endereo de array[%d] = %p\n", i, &array[i]); + printf("Endereço de array[%d] = %p\n", i, &array[i]); } printf("\n============================\n"); // exibindo @@ -20,4 +20,4 @@ int main() printf("array[%d] = %d\n", i + 1, array[i]); } return 1; -} \ No newline at end of file +} diff --git a/UNP/ref/C/Arvores/Arvore-B/TAB.c b/UNP/ref/C/Arvores/Arvore-B/TAB.c index 48d508e..26616c8 100644 --- a/UNP/ref/C/Arvores/Arvore-B/TAB.c +++ b/UNP/ref/C/Arvores/Arvore-B/TAB.c @@ -2,76 +2,89 @@ #include #include "TAB.h" -void iNP(TAB *main, TAB *pagina, int num ){ // Insere na Página +void iNP(TAB *main, TAB *pagina, int num) +{ // Insere na Página int i = main->n_chaves; - int nAP = (i > 0); // nAP: Não Achou Posição - while (nAP){ - if (num >= main->chaves[i-1]){ + int nAP = (i > 0); // nAP: Não Achou Posição + while (nAP) + { + if (num >= main->chaves[i - 1]) + { nAP = 0; break; } - main->chaves[i] = main->chaves[i-1]; - main->filhos[i+1] = main->filhos[i]; + main->chaves[i] = main->chaves[i - 1]; + main->filhos[i + 1] = main->filhos[i]; i--; if (i < 1) nAP = 0; - } + } main->chaves[i] = num; - main->filhos[i+1] = pagina; + main->filhos[i + 1] = pagina; main->n_chaves++; } -void efetuaInsercao( TAB **main, TAB **pagina, int *valida, int *nI, int num, int ordem ){ // nI: Número Inserido - if(!(*main)){ - *valida = 1; - *nI = num; - *pagina = NULL; +void efetuaInsercao(TAB **main, TAB **pagina, int *valida, int *nI, int num, int ordem) +{ // nI: Número Inserido + if (!(*main)) + { + *valida = 1; + *nI = num; + *pagina = NULL; } - else{ - int i = 1; - while( (i < (*main)->n_chaves) && (num > (*main)->chaves[i-1]) ) - i++; - if(num == (*main)->chaves[i-1]){ - printf("Erro: Chave ja inserida\n"); - *valida = 0; + else + { + int i = 1; + while ((i < (*main)->n_chaves) && (num > (*main)->chaves[i - 1])) + i++; + if (num == (*main)->chaves[i - 1]) + { + printf("Erro: Chave ja inserida\n"); + *valida = 0; + } + else + { + if (num < (*main)->chaves[i - 1]) + i--; + efetuaInsercao(&((*main)->filhos[i]), pagina, valida, nI, num, ordem); // verifica se tem ou não filhos + if (*valida) + { + if ((*main)->n_chaves < (2 * ordem)) + { // Página tem espaço + iNP(*main, *pagina, *nI); + *valida = 0; } - else{ - if(num < (*main)->chaves[i-1]) - i--; - efetuaInsercao( &((*main)->filhos[i]), pagina, valida, nI, num, ordem ); // verifica se tem ou não filhos - if(*valida){ - if((*main)->n_chaves < (2 * ordem)){ // Página tem espaço - iNP( *main, *pagina, *nI ); - *valida = 0; - } - else{ // Overflow: Página tem que ser dividida - TAB *temp = novaPagina(ordem); - if(i < ordem + 1){ - iNP( temp, (*main)->filhos[2 * ordem], (*main)->chaves[(2 * ordem) - 1] ); - (*main)->n_chaves--; - iNP( (*main), *pagina, *nI ); - } - else - iNP( temp, *pagina, *nI ); - int j; - for(j = ordem + 2; j <= (2 * ordem); j++) - iNP( temp, (*main)->filhos[j], (*main)->chaves[j-1] ); - (*main)->n_chaves = ordem; - temp->filhos[0] = temp->filhos[ordem+1]; - *nI = (*main)->chaves[ordem]; - *pagina = temp; - } - - } + else + { // Overflow: Página tem que ser dividida + TAB *temp = novaPagina(ordem); + if (i < ordem + 1) + { + iNP(temp, (*main)->filhos[2 * ordem], (*main)->chaves[(2 * ordem) - 1]); + (*main)->n_chaves--; + iNP((*main), *pagina, *nI); + } + else + iNP(temp, *pagina, *nI); + int j; + for (j = ordem + 2; j <= (2 * ordem); j++) + iNP(temp, (*main)->filhos[j], (*main)->chaves[j - 1]); + (*main)->n_chaves = ordem; + temp->filhos[0] = temp->filhos[ordem + 1]; + *nI = (*main)->chaves[ordem]; + *pagina = temp; } + } + } } } -void insercao( TAB **main, int num, int ordem ){ - int* valida, nI; - TAB* pagina; - efetuaInsercao( (&(*main)), &pagina, &valida, &nI, num, ordem); - if(valida){ // Arvore cresce na altura pela raiz +void insercao(TAB **main, int num, int ordem) +{ + int *valida, nI; + TAB *pagina; + efetuaInsercao((&(*main)), &pagina, &valida, &nI, num, ordem); + if (valida) + { // Arvore cresce na altura pela raiz TAB *temp = novaPagina(ordem); temp->n_chaves = 1; temp->chaves[0] = nI; @@ -81,170 +94,198 @@ void insercao( TAB **main, int num, int ordem ){ } } -TAB* novaPagina(int ordem){ - TAB* temp = (TAB*) malloc(sizeof(TAB)); +TAB *novaPagina(int ordem) +{ + TAB *temp = (TAB *)malloc(sizeof(TAB)); temp->n_chaves = 0; - temp->chaves = (int*) malloc(sizeof(int) * (2 * ordem)); - temp->filhos = (TAB**) malloc(sizeof(TAB) * ((2 * ordem) + 1)); + temp->chaves = (int *)malloc(sizeof(int) * (2 * ordem)); + temp->filhos = (TAB **)malloc(sizeof(TAB) * ((2 * ordem) + 1)); int i; - for(i = 0; i <= (2 * ordem); i++) - temp->filhos[i] = NULL; + for (i = 0; i <= (2 * ordem); i++) + temp->filhos[i] = NULL; return temp; } -void reconstitui( TAB **main, TAB *pai, int* valida, int indexP, int ordem ){ // indexP: Índice do pai +void reconstitui(TAB **main, TAB *pai, int *valida, int indexP, int ordem) +{ // indexP: Índice do pai - TAB *temp; + TAB *temp; int aux, j; - if (indexP < pai->n_chaves){ // temp: Pagina a direita de main - temp = pai->filhos[indexP+1]; + if (indexP < pai->n_chaves) + { // temp: Pagina a direita de main + temp = pai->filhos[indexP + 1]; aux = (temp->n_chaves - ordem + 1) / 2; (*main)->chaves[(*main)->n_chaves] = pai->chaves[indexP]; (*main)->filhos[(*main)->n_chaves + 1] = temp->filhos[0]; (*main)->n_chaves++; - if (aux > 0){ // Existe folga: transfere de temp para main + if (aux > 0) + { // Existe folga: transfere de temp para main for (j = 1; j < aux; j++) - iNP( *main, temp->filhos[j], temp->chaves[j-1] ); - pai->chaves[indexP] = temp->chaves[aux-1]; + iNP(*main, temp->filhos[j], temp->chaves[j - 1]); + pai->chaves[indexP] = temp->chaves[aux - 1]; temp->n_chaves -= aux; for (j = 0; j < temp->n_chaves; j++) - temp->chaves[j] = temp->chaves[j + aux]; + temp->chaves[j] = temp->chaves[j + aux]; for (j = 0; j <= temp->n_chaves; j++) temp->filhos[j] = temp->filhos[j + aux]; *valida = 0; } - else{ // Fusao: intercala temp em main e libera temp + else + { // Fusao: intercala temp em main e libera temp for (j = 1; j <= ordem; j++) - iNP( *main, temp->filhos[j], temp->chaves[j-1]); + iNP(*main, temp->filhos[j], temp->chaves[j - 1]); free(temp); - for (j = indexP + 1; j < pai->n_chaves; j++){ - pai->chaves[j-1] = pai->chaves[j]; - pai->filhos[j] = pai->filhos[j+1]; + for (j = indexP + 1; j < pai->n_chaves; j++) + { + pai->chaves[j - 1] = pai->chaves[j]; + pai->filhos[j] = pai->filhos[j + 1]; } pai->n_chaves--; if (pai->n_chaves >= ordem) *valida = 0; } } - else{ // temp = Pagina a esquerda de main - temp = pai->filhos[indexP-1]; + else + { // temp = Pagina a esquerda de main + temp = pai->filhos[indexP - 1]; aux = (temp->n_chaves - ordem + 1) / 2; for (j = (*main)->n_chaves; j >= 1; j--) - (*main)->chaves[j] = (*main)->chaves[j-1]; - (*main)->chaves[0] = pai->chaves[indexP-1]; + (*main)->chaves[j] = (*main)->chaves[j - 1]; + (*main)->chaves[0] = pai->chaves[indexP - 1]; for (j = (*main)->n_chaves; j >= 0; j--) - (*main)->filhos[j+1] = (*main)->filhos[j]; + (*main)->filhos[j + 1] = (*main)->filhos[j]; (*main)->n_chaves++; - if (aux > 0){ // Existe folga: transfere de temp para main + if (aux > 0) + { // Existe folga: transfere de temp para main for (j = 1; j < aux; j++) - iNP( *main, temp->filhos[temp->n_chaves - j + 1], temp->chaves[temp->n_chaves - j] ); + iNP(*main, temp->filhos[temp->n_chaves - j + 1], temp->chaves[temp->n_chaves - j]); (*main)->filhos[0] = temp->filhos[temp->n_chaves - aux + 1]; - pai->chaves[indexP-1] = temp->chaves[temp->n_chaves - aux]; + pai->chaves[indexP - 1] = temp->chaves[temp->n_chaves - aux]; temp->n_chaves -= aux; *valida = 0; } - else{ // Fusao: intercala main em temp e libera main + else + { // Fusao: intercala main em temp e libera main for (j = 1; j <= ordem; j++) - iNP(temp, (*main)->filhos[j], (*main)->chaves[j-1]); + iNP(temp, (*main)->filhos[j], (*main)->chaves[j - 1]); free(*main); pai->n_chaves--; if (pai->n_chaves >= ordem) *valida = 0; } - } + } } -void antecessor( TAB *main, TAB *pai, int *valida, int indice, int ordem ){ - if (pai->filhos[pai->n_chaves]){ - antecessor( main, pai->filhos[pai->n_chaves], valida, indice, ordem ); +void antecessor(TAB *main, TAB *pai, int *valida, int indice, int ordem) +{ + if (pai->filhos[pai->n_chaves]) + { + antecessor(main, pai->filhos[pai->n_chaves], valida, indice, ordem); if (*valida) - reconstitui( &(pai->filhos[pai->n_chaves]), pai, valida, pai->n_chaves, ordem ); + reconstitui(&(pai->filhos[pai->n_chaves]), pai, valida, pai->n_chaves, ordem); } - else{ - main->chaves[indice-1] = pai->chaves[pai->n_chaves - 1]; + else + { + main->chaves[indice - 1] = pai->chaves[pai->n_chaves - 1]; pai->n_chaves--; *valida = (pai->n_chaves < ordem); } } -void efetuaRemocao( TAB **main, int *valida, int num, int ordem){ +void efetuaRemocao(TAB **main, int *valida, int num, int ordem) +{ int i = 1, j; - if (!(*main)){ + if (!(*main)) + { printf("Erro: registro nao esta na arvore\n"); *valida = 0; - } - else{ + } + else + { TAB *temp = *main; - while ( (i < temp->n_chaves) && (num > temp->chaves[i-1]) ) + while ((i < temp->n_chaves) && (num > temp->chaves[i - 1])) i++; - if (num == temp->chaves[i-1]){ - if (!(temp->filhos[i-1])){ // Pagina folha + if (num == temp->chaves[i - 1]) + { + if (!(temp->filhos[i - 1])) + { // Pagina folha temp->n_chaves--; *valida = (temp->n_chaves < ordem); - for (j = i; j <= temp->n_chaves; j++){ - temp->chaves[j-1] = temp->chaves[j]; - temp->filhos[j] = temp->filhos[j+1]; + for (j = i; j <= temp->n_chaves; j++) + { + temp->chaves[j - 1] = temp->chaves[j]; + temp->filhos[j] = temp->filhos[j + 1]; } } - else{ + else + { /* Pagina nao e folha: trocar com antecessor */ - antecessor( *main, temp->filhos[i-1], valida, i, ordem ); + antecessor(*main, temp->filhos[i - 1], valida, i, ordem); if (*valida) - reconstitui( &(temp->filhos[i-1]), *main, valida, i - 1, ordem ); + reconstitui(&(temp->filhos[i - 1]), *main, valida, i - 1, ordem); } - } - else{ - if (num > temp->chaves[i-1]) + else + { + if (num > temp->chaves[i - 1]) i++; - efetuaRemocao( &(temp->filhos[i-1]), valida, num, ordem ); + efetuaRemocao(&(temp->filhos[i - 1]), valida, num, ordem); if (*valida) - reconstitui( &(temp->filhos[i-1]), *main, valida, i - 1, ordem ); + reconstitui(&(temp->filhos[i - 1]), *main, valida, i - 1, ordem); } } } -void remocao( TAB **main, int num, int ordem ){ - int* valida; - efetuaRemocao( (&(*main)), &valida, num, ordem); +void remocao(TAB **main, int num, int ordem) +{ + int *valida; + efetuaRemocao((&(*main)), &valida, num, ordem); - if (valida && (*main)->n_chaves == 0){ // Arvore diminui na altura + if (valida && (*main)->n_chaves == 0) + { // Arvore diminui na altura TAB *temp = *main; *main = temp->filhos[0]; free(temp); } } -TAB* busca( TAB* main, int num){ - if(!main) - return NULL; - else{ - int i = 1; - while(i < main->n_chaves && num > main->chaves[i-1]) - i++; - if ( num == main->chaves[i-1] ){ - return main; - } - else{ - if ( num < main->chaves[i-1]) - return busca( main->filhos[i-1], num ); - else - return busca( main->filhos[i], num); - } +TAB *busca(TAB *main, int num) +{ + if (!main) + return NULL; + else + { + int i = 1; + while (i < main->n_chaves && num > main->chaves[i - 1]) + i++; + if (num == main->chaves[i - 1]) + { + return main; + } + else + { + if (num < main->chaves[i - 1]) + return busca(main->filhos[i - 1], num); + else + return busca(main->filhos[i], num); } + } } -void imprimir( TAB* main, int altura ){ - if(main){ - int i, j; - for(i = 0; i <= main->n_chaves - 1; i++){ - imprimir(main->filhos[i], altura + 1); - for(j = 0; j <= altura; j++) - printf("\t"); - printf("%d\n", main->chaves[i]); - } - imprimir(main->filhos[i], altura + 1); +void imprimir(TAB *main, int altura) +{ + if (main) + { + int i, j; + for (i = 0; i <= main->n_chaves - 1; i++) + { + imprimir(main->filhos[i], altura + 1); + for (j = 0; j <= altura; j++) + printf("\t"); + printf("%d\n", main->chaves[i]); + } + imprimir(main->filhos[i], altura + 1); } } \ No newline at end of file