Ir ao conteúdo
  • Cadastre-se

Gabriel Barbosa Alcantara

Membro Júnior
  • Posts

    1
  • Cadastrado em

  • Última visita

posts postados por Gabriel Barbosa Alcantara

  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;
    }

     

    • Curtir 1

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...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!