Estrutura de dados - cadeia
Publicado por Perfil removido 11/01/2005
[ Hits: 6.567 ]
Permite algumas flexibilidades no trabalho de strings, mas está aí mais como um exmplo de estrutura de dados do que qualquer outra coisa...
É uma estrutura simples, tem um ponteiro pro conteúdo e um inteiro com o tamanho...
Criei para exemplificar a criação de abstrações.
Como nao eh possivel fazer upload de mais de um arquivo, colocquei
os arquivos cadeia.c e cadeia.h num arquivo cadeias.c.
Nao esqueçam de colocar os conteúdos nos lugares certos...
//Aqui comeca o arquivo cadeia.h #include <stdlib.h> #include <stdio.h> #include <string.h> #ifndef _CADEIA_ #define _CADEIA_ typedef struct { char *conteudo; int tamanho; int capacidade; } cadeia_t; /* inicializa a cadeia apontada por cad com o valor da string C s. cad é considerada não inicializada na entrada da função. Se s não for NULL e apontar para uma string com tamanho maior que 0, deve ser alocada memória para conteudo e o valor apontado por s deve ser copiado para essa região. */ void cad_inicializa(cadeia_t * cad, char *s); /* substitui o conteúdo da cadeia cad pelo conteúdo do arquivo de nome 'nome'. Imprime erro e aborta se o arquivo não puder ser lido. */ void cad_le_arquivo(cadeia_t * cad, char *nome); /* escreve a cadeia cad no arquivo de nome 'nome' */ void cad_escreve_arquivo(cadeia_t * cad, char *nome); /* Libera a memória ocupada pela cadeia cad. Após a execução da função, cad deve conter tamanho 0 e conteúdo igual a NULL. */ void cad_destroi(cadeia_t * cad); /* copia a cadeia cad para a região apontada por s. Complementar por um caractere '{FONTE}'. É responsabilidade de quem chama garantir que s aponta para uma regiao suficientemente grande. */ void cad_string(cadeia_t * cad, char *s); /* retorna o número de caracteres na cadeia cad. */ int cad_tamanho(cadeia_t * cad); /* sub passa a ter "t" caracteres de cad, a partir do caractere no índice "p" (o primeiro de uma cadeia está no índice 0). Se p e t não representarem uma subcadeia válida de cad, a função deve imprimir uma mensagem dizendo isso e abortar a execução do programa. Se necessário, o conteúdo de sub deve ser realocado. */ void cad_subcadeia(cadeia_t * sub, cadeia_t * cad, int p, int t); /* Substituir, em cad, a subcadeia delimitada por p e t (considerados como na função cad_subcadeia) pela cadeia sub. Se necessário, o conteúdo de cad deve ser realocado. */ void cad_substitui(cadeia_t * cad, int p, int t, cadeia_t * sub); /* Imprime a string com uma quebra de linha no final */ void cad_imprime(cadeia_t * cad); /* Compara duas cadeias e retorna menor que, igual a, ou maior que zero,se cad1 eh, respectivamente, menor que, igual ou maior que cad2. */ int cad_compara(cadeia_t * cad1, cadeia_t * cad2); #endif // Aqui termina o arquivo cadeia.h //Aqui comeca o arquivo cadeia.c #ifndef DEBUG #include "cadeia.h" #endif /* */ void cad_inicializa(cadeia_t * cad, char *s) { int i; if (s == NULL) { cad->tamanho = cad->capacidade = 0; cad->conteudo = NULL; return; } cad->capacidade = cad->tamanho = strlen(s); if (cad->capacidade == 0) { cad->conteudo = NULL; return; } cad->conteudo = (char *) calloc(cad->capacidade, sizeof(char)); for (i = 0; i < cad->tamanho; i++) { cad->conteudo[i] = s[i]; } } void cad_destroi(cadeia_t * cad) { free(cad->conteudo); cad->conteudo = NULL; cad->capacidade = cad->tamanho = 0; } void cad_le_arquivo(cadeia_t * cad, char *nome) { FILE * arq; int i; if (nome == NULL) { fprintf(stderr, "Erro! Nome de arquivo invalido\n"); abort(); } if ((arq = fopen(nome, "r")) == (FILE *) NULL) { fprintf(stderr, "Erro ao abrir arquivo %s\n", nome); abort(); } fseek(arq, 0, SEEK_END); cad->capacidade = ftell(arq); //Variavel capacidade obtem tam do arquivo rewind(arq); if (cad->conteudo != NULL) { cad->conteudo = (char *) realloc(cad->conteudo, cad->capacidade); } else { cad->conteudo = (char *) malloc(cad->capacidade); } cad->tamanho = cad->capacidade; i = 0; while (i < cad->tamanho) { cad->conteudo[i] = fgetc(arq); i++; } fclose(arq); } int cad_tamanho(cadeia_t * cad) { return cad->tamanho; } void cad_escreve_arquivo(cadeia_t * cad, char *nome) { FILE * arq; if ((arq = fopen(nome, "w")) == (FILE *) NULL) { fprintf(stderr, "Erro ao criar arquivo %s\n", nome); abort(); } int i = 0; while (i < cad->tamanho) { putc(cad->conteudo[i], arq); i++; } fclose(arq); } void cad_imprime(cadeia_t * cad) { int i; printf("[ "); for (i = 0; i < cad->tamanho; i++) putchar(cad->conteudo[i]); printf(" ]\n"); } void cad_string(cadeia_t * cad, char *s) { int i = 0; while (i < cad->tamanho) { s[i] = cad->conteudo[i]; i++; } s[i] = '{FONTE}'; } void cad_subcadeia(cadeia_t * sub, cadeia_t * cad, int p, int t) { int i = 0; if (p < 0 || t < 0) { fprintf(stderr, "Erro! Uso de indices invalidos\n"); abort(); } if (p + t > cad->tamanho || cad->conteudo == NULL) { fprintf(stderr, "Erro! Uso de subcadeia invalida!\n"); abort(); } if (p + t > sub->capacidade && sub->conteudo != NULL) { sub->conteudo = (char *) realloc(sub->conteudo, (sub->capacidade + t)); sub->capacidade += t; } if (sub->conteudo == NULL) { sub->conteudo = (char *) malloc(t * sizeof(char)); sub->capacidade = t; } while (i <= t) { sub->conteudo[i] = cad->conteudo[p]; i++; p++; } sub->tamanho = t; } void cad_substitui(cadeia_t * cad, int p, int t, cadeia_t * sub) { if (sub->conteudo == NULL) { fprintf(stderr, "Erro! Uso de cadeia vazia!\n"); abort(); } // void *memmove(void *dest, const void *src, size_t n); if (p < 0 || t < 0 || p + t > cad->tamanho) { fprintf(stderr, "Erro! Uso de indices invalidos!\n"); abort(); } if (cad->conteudo == NULL) { cad_inicializa(cad, " "); printf("%d", cad->tamanho); } if (sub->tamanho == t) { memmove(&cad->conteudo[p], sub->conteudo, t); } else { int i, j, k; i = p + sub->tamanho; j = p + t; k = cad->tamanho - p - t; if (sub->tamanho < t) { memmove(&cad->conteudo[p], sub->conteudo, t); memmove(&cad->conteudo[i], &cad->conteudo[j], k); cad->tamanho = cad->tamanho + sub->tamanho - t; } else { int tam = cad->tamanho + sub->tamanho - t; if (tam > sub->capacidade) { cad->conteudo = realloc(cad->conteudo, tam); cad->capacidade = tam; } cad->tamanho = tam; memmove(&cad->conteudo[i], &cad->conteudo[j], k); memmove(&cad->conteudo[p], sub->conteudo, sub->tamanho); } } } int cad_compara(cadeia_t * cad1, cadeia_t * cad2) { if (cad1 == NULL || cad2 == NULL) { fprintf(stderr, "Cadeia nula!"); abort(); } char str_aux1[cad1->tamanho + 1], str_aux2[cad2->tamanho + 1]; cad_string(cad1, str_aux1); cad_string(cad2, str_aux2); return strcmp(str_aux1, str_aux2); } // Fim do arquivo cadeia.c
Classe para manipulação de números complexos
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Visualizar a árvore de arquivos no terminal
Como renomear arquivos de letras maiúsculas para minúsculas
Imprimindo no formato livreto no Linux
Melhorando a precisão de valores flutuantes em python[AJUDA] (11)
GLPI - Configuração de destinatário com conta Microsoft Exchange (0)
Vou voltar moderar conteúdos de Dicas e Artigos (3)
OpenVPN no MACBOOK conecta mas não pinga pastas de rede compartilhada ... (1)
[Python] Automação de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas às imagens de uma pasta