Ir ao conteúdo
  • Cadastre-se

Gabriel Barbosa Alcantara

Membro Júnior
  • Posts

    1
  • Cadastrado em

  • Última visita

Reputação

1
  1. Sou novo aqui mas gostaria de saber se alguem me ajuda a converter esse codigo pra c++, nao sei se tem algum programa para isso, se alguem souber agradeço #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX 1000 typedef struct freq { unsigned f; char c; struct freq *dir,*esq, *prox; }frequencia; typedef struct bt { char c; char b[MAX]; }bits; frequencia *busca_freq(char cod, frequencia *x) { if(x == NULL) return NULL; else if(cod == x->c) return x; else if(cod != x->c) return busca_freq(cod, x->prox); } void insere_freq(char i, frequencia **lst) { frequencia *aux, *p; aux = (frequencia*)malloc(sizeof(frequencia)); aux->c = i; aux->f = 1; aux->prox=aux->esq=aux->dir = NULL; if(*lst == NULL) *lst = aux; else { for(p = *lst; p->prox != NULL; p = p->prox); p->prox = aux; } } void desce(int n, frequencia **a, int i) { int maior, e, d; frequencia *aux; e=2*(i+1)-1; d=2*(i+1); if(e<n && a[e]->f > a[i]->f) maior=e; else maior=i; if(d<n && a[d]->f > a[maior]->f) maior=d; if(maior!=i) { aux=a[i]; a[i]=a[maior]; a[maior]=aux; desce(n, a, maior); } } void create_minheap(frequencia *lst, unsigned k, frequencia **v) { frequencia **q, *p; int i; for(q = v, p = lst; p != NULL; q++) { *q = p; p = (*q)->prox; } for(i=k/2-1;i>=0;i--) desce(k, v, i); for(i=k-1;i>0;i--) { p = v[i]; v[i] = v[0]; v[0] = p; k--; desce(k, v, 0); } } void imprime_arvore(frequencia *v, unsigned *i) { if(v!=NULL) { if(v->dir == NULL && v->esq == NULL) { printf("%c %u:%u\n", v->c, v->f, *i); (*i)++; } imprime_arvore(v->esq, i); imprime_arvore(v->dir, i); } } frequencia *create_huffman(frequencia **v, unsigned k) { frequencia *nova, *raiz, *aux; unsigned i = 1; nova = (frequencia*)malloc(sizeof(frequencia)); nova->f = v[0]->f; nova->c = v[0]->c; nova->dir = nova->esq = NULL; for(i = 1; i < k; i++) { raiz = (frequencia*)malloc(sizeof(frequencia)); aux = (frequencia*)malloc(sizeof(frequencia)); aux->f = v[i]->f; aux->c = v[i]->c; aux->dir = aux->esq = NULL; raiz->f = aux->f + nova->f; if(aux->f > nova->f) { raiz->dir = aux; raiz->esq = nova; } else { raiz->dir = nova; raiz->esq = aux; } nova = raiz; } free(v); return nova; } void desaloca_arvore(frequencia *j) { if(j != NULL) { desaloca_arvore(j->esq); desaloca_arvore(j->dir); free(j); } } void desaloca_lista(frequencia *lst) { frequencia *p; for(p = lst;lst != NULL;p=lst) { lst = p->prox; free(p); } } void inverte(char b[]) { int a=0, c=strlen(b)-1; char aux; while(a < c) { aux = b[a]; b[a++] = b[c]; b[c--] = aux; } } void escreve_letras_em_pre_ordem(frequencia *j, FILE *p, char b[], bits *mapa, unsigned k) { int i; char aux[MAX]; if(j->esq == NULL && j->dir == NULL) { fwrite(&(j->c), sizeof(unsigned char), sizeof(unsigned char), p); i = (int)j->c; while(mapa[i%k].c != '^') i++; mapa[i%k].c = j->c; strcpy(mapa[i%k].b, b); inverte(mapa[i%k].b); printf("%s\n", b); } strcpy(aux, b); if(j->esq != NULL) { i = strlen(aux); aux[i] = '1'; aux[i+1] = '\0'; escreve_letras_em_pre_ordem(j->esq, p, aux, mapa, k); } if(j->dir != NULL) { i = strlen(b); b[i] = '2'; b[i+1] = '\0'; escreve_letras_em_pre_ordem(j->dir, p, b, mapa, k); } } void escreve_pre_ordem(frequencia *j, unsigned char *cbits, unsigned *cont, FILE *p) { if((*cont) <= 7) { (*cont)++; *cbits *= 2; } else { fwrite(cbits, sizeof(unsigned char), sizeof(unsigned char), p); *cont = 1; *cbits *= 2; } if(j->esq == NULL && j->dir == NULL) *cbits |= 1; else { if(j->esq != NULL) escreve_pre_ordem(j->esq, cbits, cont, p); if(j->dir != NULL) escreve_pre_ordem(j->dir, cbits, cont, p); } } void escreve__pre_ordem_e_texto(frequencia *j, FILE *s, FILE *p, bits *mapa, unsigned k) { unsigned cont=0; char aux[MAX]; unsigned char cbits=0; int i, n; escreve_pre_ordem(j, &cbits, &cont, p); i = fgetc(s); while(i != EOF) { n = i; while(i != mapa[n%k].c) n++; strcpy(aux, mapa[n%k].b); do { if(cont <= 7) { cont++; cbits *= 2; } else { cont = 0; fwrite(&cbits, sizeof(unsigned char), sizeof(unsigned char), p); continue; } if(aux[strlen(aux)-1] == '2') cbits |= 1; aux[strlen(aux)-1] = '\0'; } while(aux[0] != '\0'); i = fgetc(s); } for(;8-cont > 0; cont++) cbits *= 2; fwrite(&cbits, sizeof(unsigned char), sizeof(unsigned char), p); } unsigned char inverte_byte(unsigned char x) { unsigned i = 0; unsigned char y = 0; do { y *= 2; y |= (x%2); x /= 2; i++; } while(i != 8); return y; } void monta_arvore(frequencia **j, unsigned *i, unsigned char *cbits, unsigned *cont, unsigned k, unsigned char *letras, FILE *p) { if(*i < k && *cont != 0) { if((*cbits)%2 == 0) { (*j)->dir = (frequencia*)malloc(sizeof(frequencia)); (*j)->esq = (frequencia*)malloc(sizeof(frequencia)); (*cont)--; *cbits /= 2; monta_arvore(&((*j)->esq), i, cbits, cont, k, letras, p); monta_arvore(&((*j)->dir), i, cbits, cont, k, letras, p); } else { (*j)->c = letras[(*i)++]; (*j)->esq = (*j)->dir = NULL; (*cont)--; *cbits /= 2; } } else if(*i < k) { fread(cbits, sizeof(unsigned char), sizeof(unsigned char), p); *cont = 8; *cbits = inverte_byte(*cbits); monta_arvore(j, i, cbits, cont, k, letras, p); } } char busca_letra(frequencia **x, unsigned *n, unsigned char *cbits, unsigned *cont, FILE *p) { if(*cont != 0) { if((*x)->esq == NULL && (*x)->dir == NULL) { (*n)++; return (*x)->c; } else if((*cbits)%2 == 0) { (*cbits) /= 2; (*cont)--; busca_letra(&((*x)->esq), n, cbits, cont, p); } else if((*cbits)%2 == 1) { (*cbits) /= 2; (*cont)--; busca_letra(&((*x)->dir), n, cbits, cont, p); } } else { fread(cbits, sizeof(unsigned char), sizeof(unsigned char), p); *cont = 8; *cbits = inverte_byte(*cbits); busca_letra(x, n, cbits, cont, p); } } void escreve_texto(FILE *s, frequencia *j, unsigned char cbits, unsigned cont, unsigned T, FILE *p) { char c; unsigned n = 0; frequencia *raiz; while(n < T) { raiz = j; c = busca_letra(&raiz, &n, &cbits, &cont, p); fputc(c, s); } } int main(int argc, char *argv[]) { frequencia *lst=NULL, *j, **v; int i = 0; bits *mapa; unsigned char k=0, cbits, *letras, b[MAX]; FILE *p, *s; unsigned cont=0; if(strcmp(argv[1], "c") == 0) { p = fopen(argv[2], "r"); i = fgetc(p); while(i != EOF) { j = busca_freq(i, lst); if(j != NULL) j->f++; else { insere_freq(i, &lst); k++; } i = fgetc(p); } fclose(p); // for(j = lst; j != NULL; j = j->prox) // printf("%d %c\n", j->f, j->c); // printf("-----------------------\n"); v = (frequencia**)malloc(k*sizeof(frequencia*)); create_minheap(lst, k, v); // for(i=0;i < k; ++i) // printf("%u %c\n", v[i]->f, v[i]->c); // printf("\n"); j = create_huffman(v, k); // i =0; // imprime_arvore(j, &i); // printf("\n"); p = fopen(argv[3], "wb"); fwrite(&k, sizeof(unsigned char), sizeof(unsigned char), p); fwrite(&(j->f), sizeof(unsigned char), 4*sizeof(unsigned char), p); mapa = (bits*)malloc(k*sizeof(bits)); for(i=0; i < k; i++) mapa[i].c = '^'; b[0] = '\0'; escreve_letras_em_pre_ordem(j, p, b, mapa, k); s = fopen(argv[2], "r"); escreve__pre_ordem_e_texto(j, s, p, mapa, k); free(mapa); fclose(s); fclose(p); desaloca_lista(lst); desaloca_arvore(j); } else if(strcmp(argv[1], "d") == 0) { p = fopen(argv[2], "rb"); fread(&k, sizeof(unsigned char), sizeof(unsigned char), p); j = (frequencia*)malloc(sizeof(frequencia)); j->esq = j->dir = NULL; fread(&(j->f), sizeof(unsigned char), 4*sizeof(unsigned char), p); letras = (unsigned char*)malloc(k*sizeof(unsigned char)); fread(letras, sizeof(unsigned char), k*sizeof(unsigned char), p); monta_arvore(&j, &i, &cbits, &cont, k, letras, p); free(letras); s = fopen(argv[3], "w"); escreve_texto(s, j, cbits, cont, j->f, p); fclose(s); fclose(p); desaloca_arvore(j); } return 0; }

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...