miguel747

Projeto3ED (proposta)

Oct 23rd, 2011
221
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.07 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define max 100
  5.  
  6. //Estrutura para armazenar o alfabeto para algoritmo e montar a arvore binaria
  7. typedef struct arv{
  8.     char c;
  9.     int freq;
  10.     int isleft;
  11.     int codigo[10];
  12.     struct arv *prox;
  13.     struct arv *esq;
  14.     struct arv *dir;
  15. }Arv;
  16. //Estrutura da tabela contendo as inforacoes dos cohdigos
  17. typedef struct tabela{
  18.     int codigo[20];
  19.     char a;
  20. }Tabela;
  21. //cria uma lista de arvores com cabeça
  22. Arv* cria_lst(){
  23.     Arv* q = (Arv*)malloc(sizeof(Arv));
  24.     q->c='\n';
  25.     q->freq=max+1;
  26.     q->esq = q->dir = NULL;
  27.     q->prox = NULL;
  28.     return q;
  29. }
  30. //insere as folhas na lista
  31. Arv* lst_insereF(char a, int f, Arv* lis){
  32.     Arv* t = (Arv*)malloc(sizeof(Arv));
  33.     t->c = a;
  34.     t->freq = f;
  35.     t->prox = lis->prox;
  36.     lis->prox = t;
  37.     t->esq = t->dir = NULL;
  38.     return lis;
  39. }
  40. //insere subarvores na lista
  41. Arv* lst_insereA(Arv* a, Arv* lis){
  42.     a->prox = lis->prox;
  43.     lis->prox = a;
  44.     return lis;
  45. }
  46. //imprime a arvore
  47. void arv_imprime(Arv* a){
  48.     if(!arv_vazia(a)){
  49.         printf("(");
  50.         printf("%c(%d)", a->c, a->isleft);
  51.        
  52.         if(a->esq==NULL)
  53.             printf("()");
  54.         if(a->dir==NULL)
  55.             printf("()");
  56.         arv_imprime(a->esq);
  57.        
  58.        
  59.         arv_imprime(a->dir);
  60.         printf(")");
  61.     }
  62. }
  63. //cria uma subarvore correpondente a 'nao-folha'
  64. Arv* cria_arv(Arv *sae,Arv *sad){
  65.     Arv* q = (Arv*)malloc(sizeof(Arv));
  66.     q->c = '*';
  67.     q->freq = sae->freq + sad->freq;
  68.    
  69.     q->esq = sae;
  70.     q->dir = sad;
  71.    
  72.     return q;
  73. }
  74. //verifica se a lista com cabeca esta vazia
  75. int vazia(Arv *lis){
  76.     return (lis->prox==NULL);
  77. }
  78. //retira o menor elemento da lista criada com cada celula sendo uma arvore
  79. Arv* retira_menor(Arv* lis){
  80.     Arv *q=lis->prox, *menor = lis->prox, *ant=NULL;
  81.    
  82.     while(q->prox!=NULL){//ponteiro 'menor' pecorre a lista das arvores primarias
  83.         if(menor->freq>q->prox->freq){
  84.             menor = q->prox;
  85.             ant = q;
  86.         }
  87.         q=q->prox;
  88.     }
  89.    
  90.     if(menor==lis->prox){
  91.        
  92.         lis->prox=lis->prox->prox;
  93.        
  94.         return menor;
  95.        
  96.     }
  97.    
  98.     ant->prox = menor->prox;
  99.     menor->prox=NULL;
  100.     return menor;
  101.    
  102. }
  103. //conta a frequencia do caracter digitado pelo usuario
  104. Arv* contafreq(char *m,char a,Arv *lis){
  105.     int i, freq=0;          
  106.     if(a=='\n')
  107.         return lis;
  108.     for(i=0;i<=strlen(m);i++){
  109.         if(m[i]==a){
  110.             freq++;
  111.             m[i]='\n';
  112.         }
  113.     }
  114.     lis = lst_insereF(a,freq,lis);
  115.     return lis;
  116. }
  117. //imprime a lista dos caracteres e suas respecitivas frequencias
  118. void lst_imprime(Arv* lis){
  119.     Arv *p;
  120.     for(p = lis;p!=NULL; p=p->prox)
  121.         printf("info = %c(%d)\n", p->c,p->freq) ;
  122. }
  123. //quantidade de sub arvores na lista de sub arvores
  124. int Nos(Arv* lis){
  125.     int i=0;
  126.     while(lis!=NULL){
  127.         i++;
  128.         lis=lis->prox;
  129.     }
  130.     return i;
  131. }
  132. //insere no campo isleft caso a arvore sej colocada a direita ou a esqueda da subfolha
  133. void Arv_left(Arv* A,Arv* sae, Arv *sad){
  134.     if(A!=NULL&&A->esq!=NULL&&A->dir!=NULL){
  135.         sae->isleft = 1;
  136.         sad->isleft = 0;
  137.         Arv_left(sae,sae->esq,sae->dir);
  138.         Arv_left(sad,sad->esq,sad->dir);
  139.     }
  140. }
  141. //estrutursa de uma lista
  142. typedef struct lista{
  143.     int cd;
  144.     char a;
  145.     struct lista *prox;
  146. }Lista;
  147.  
  148. //imprime lista
  149. void imprime(Lista* lis){
  150.     while(lis!=NULL){
  151.         printf("%c(%d) ", lis->a, lis->cd);
  152.         lis = lis->prox;
  153.     }
  154. }
  155. //herda o codigo da subarvore 'pai' para a subarvore 'filha'
  156. void guardacodigo(Arv* v,Arv* sa,int n){
  157.     int i;
  158.     if(sa!=NULL){
  159.         for(i=0;i<n;i++)
  160.             sa->codigo[i] = v->codigo[i];
  161.         sa->codigo[n] = sa->isleft;
  162.         guardacodigo(sa,sa->esq,n+1);
  163.         guardacodigo(sa,sa->dir,n+1);
  164.     }
  165. }
  166.  
  167. void criatabd(Tabela *tabd, Arv *v, int n){
  168.     int i=0;
  169.     if(v!=NULL){
  170.         if(v->esq==NULL){
  171.             while(v->codigo[i]==0||v->codigo[i]==1){
  172.                 tabd[n].codigo[i]=v->codigo[i];
  173.                 i++;
  174.             }
  175.             tabd[n].a = v->c;
  176.             n++;
  177.            
  178.         }
  179.         criatabd(tabd,v->dir,n);
  180.     }
  181. }
  182.  
  183. void criatabe(Tabela *tabe, Arv *v, int n){
  184.     int i=0;
  185.     if(v!=NULL){
  186.         if(v->esq==NULL){
  187.             while(v->codigo[i]==0||v->codigo[i]==1){
  188.                 tabe[n].codigo[i]=v->codigo[i];
  189.                 i++;
  190.             }
  191.             tabe[n].a = v->c;
  192.             n++;
  193.            
  194.         }
  195.         //system("pause");
  196.         criatabe(tabe,v->esq,n);
  197.     }    
  198. }
  199. int main(){
  200.     char mensagem[50];
  201.     int i;
  202.     Arv *lis =cria_lst(), *a;
  203.     Tabela tabd[50], tabe[50];
  204.     printf("Digite a mensagem: ");
  205.     gets(mensagem);
  206.     //conta a qte de caracter e usa a funcao para contar a frequencia dos caracteres
  207.     for(i=0;i<strlen(mensagem);i++)
  208.         lis = contafreq(mensagem,mensagem[i],lis);
  209.     lst_imprime(lis);
  210.    
  211.     int j;
  212.     for(i=0;i<50;i++){
  213.         for(j=0;j<10;j++){
  214.             tabe[i].codigo[j] = -5;
  215.             tabd[i].codigo[j] = -5;
  216.         }
  217.     }
  218.     while(Nos(lis->prox)>1){
  219.        
  220.         a = cria_arv(retira_menor(lis),retira_menor(lis));
  221.         lis = lst_insereA(a,lis);
  222.     }
  223.    
  224.     a = lis->prox;
  225.    
  226.     printf("\n\n\n");
  227.     Arv_left(a,a->esq,a->dir);
  228.     arv_imprime(a);
  229.     guardacodigo(a->esq,a->esq,0);
  230.     guardacodigo(a->esq,a->dir,0);
  231.     criatabe(tabe,a->esq,0);
  232.     criatabe(tabd,a->dir,0);
  233.     i=0;
  234.    
  235.     while(tabd[0].codigo[i]==0||tabd[0].codigo[i]==1){
  236.         printf("%d",tabd[0].codigo[i]);
  237.         i++;
  238.     }
  239.     printf("\nCaracter: %c", tabd[0].a);
  240.    
  241.     //system("pause");
  242.     return 0;
  243. }
Advertisement
Add Comment
Please, Sign In to add comment