Baixe o app para aproveitar ainda mais
Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original
#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX 250 //verifica se a string possui todos os caracteres contidos na chave other int verificaContido(char palavra[], char chave[]){ int contido = 0; for(int i=0; i<strlen(palavra); i++){ for(int j=0; j<strlen(chave); j++){ if(palavra[i] == chave[j]){ contido++; break; } } } if(contido == strlen(palavra)) return 0; else return 1; } //retorna o valor do indice de uma letra int indexLetra(char letra, char chave[]){ int i=0; while(chave[i]){ if(letra == chave[i]) return i; i++; } return i; } //retorna a prioridade de cada string int prioridadePalavra(char palavra1[], char palavra2[], char chave[]){ int i=0, indicePalavra1, indicePalavra2; while(palavra1[i] && palavra2[i]){ if(palavra1[i] == palavra2[i]) i++; else{ indicePalavra1 = indexLetra(palavra1[i], chave); indicePalavra2 = indexLetra(palavra2[i], chave); if(indicePalavra1 < indicePalavra2) return 1; else return 0; } } if(strlen(palavra1) <= strlen(palavra2)) return 1; else return 0; } //troca duas strings de posição void troca(char **vetor, int a, int b){ char *temp = vetor[a]; vetor[a] = vetor[b]; vetor[b] = temp; } //função auxiliar da heapsort que ordena em uma arvore binaria as palavras void heapify(char **vetor, char *chave, int i, int n){ int esquerda = 2*i+1, direita = 2*i+2, maximo = i; if(esquerda<=n && prioridadePalavra(vetor[i], vetor[esquerda], chave)){ maximo =esquerda; } if(direita<=n && prioridadePalavra(vetor[maximo], vetor[direita], chave)){ maximo = direita; } if(maximo != i){ troca(vetor, maximo, i); heapify(vetor, chave, maximo, n); } } //funcao heapsort char **heapsort(char **vetor, char *chave, int n){ char **novoVetor = malloc(n*sizeof(char*)); for(int i=0; i<n; i++) novoVetor[i] = malloc(MAX*sizeof(char)); for(int i=n/2; i>=0; i--){ heapify(vetor, chave, i, n); } for(int i=n; i>-1; i--){ novoVetor[i] = vetor[0]; vetor[0] = vetor[i]; heapify(vetor, chave, 0, i); } return novoVetor; } int main(){ int n, s; char **vetorPalavras, *chave; scanf("%i", &n); scanf("%i", &s); chave = malloc(s*sizeof(char)); vetorPalavras = malloc(n*sizeof(char*)); for(int i=0; i<n; i++){ vetorPalavras[i] = malloc(MAX*sizeof(char)); } scanf("%s", chave); for(int i=0; i<n; i++){ scanf("%s", vetorPalavras[i]); if(verificaContido(vetorPalavras[i], chave)){ printf("A palavra %s eh invalida\n", vetorPalavras[i]); return 0; } } vetorPalavras = heapsort(vetorPalavras, chave, n-1); for(int i=0; i<n; i++){ if(i == n-1) printf("%s", vetorPalavras[i]); else printf("%s ", vetorPalavras[i]); } for(int i=0; i<n; i++){ free(vetorPalavras[i]); } free(vetorPalavras); free(chave); return 0; }
Compartilhar