peinado
(usa Ubuntu)
Enviado em 13/06/2010 - 18:36h
assim e tem a libTrie mas a Trie funciona.
###########################################
libtrie.h
###########################################
#ifndef _LIBTRIE_H_
#define _LIBTRIE_H_
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct no {
int chave, vetor[32];
struct no *esq;
struct no *dir;
} *no;
typedef struct trie {
struct no *raiz;
} *trie;
trie cria_arvore ();
int busca(no noaux, int auxvetor[32], int posicao, int dados);
int insere (no *noatual, int valor, int n[32], int posicao);
void ZeraVetor(int vetor[], int tamanho);
void LeVetor(int vetor[], int tamanho);
void LeVetorDetalhado(int vetor[], int tamanho);
int imprime (no arvore);
#endif
###############################
libTrie.c
###############################
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "libTrie.h"
trie cria_arvore() {//funcao que aloca nemoria
trie aux = (trie) malloc(sizeof(struct trie));
aux->raiz=NULL;
return aux;
}
void ZeraVetor(int vetor[], int tamanho)
{
int i;
for (i=0; i<tamanho;i++)
vetor[i] = 0;
}
void LeVetor(int vetor[], int tamanho)
{
int i;
for (i=tamanho-1; i>=0;i--)
printf("%d", vetor[i]);
}
void LeVetorDetalhado(int vetor[], int tamanho)
{
int i;
for (i=0; i<tamanho;i++)
{
printf("Vetor[%d]: ", i);
printf("%d\n", vetor[i]);
}
}
//possicao = vetor de bits[posicao]
//dados numero procurado
//vetor = vetor que esta sendo procurado
int busca(no noaux, int vetor[32], int posicao, int dados)
{
//LeVetor(vetor,31);
//printf("\nnoaux->chave: %d", noaux->chave);
//printf("vetor[%d]: ", posicao);
//printf("%d,", noaux->vetor[posicao]);
if (noaux == NULL)
{
printf("\n\nERRO: nao existe!\n");
return 0;
}
if (posicao > 0)
{
posicao = posicao-1;
LeVetor(vetor,posicao+1);
printf(",");
if (vetor[posicao] == 1)
busca(noaux->dir,vetor,posicao,dados);
else
busca(noaux->esq,vetor,posicao,dados);
}
if (posicao == 0)
printf("(%d)", noaux->chave);
}
int insere (no *noatual, int valor, int n[32], int posicao)
{
int i;
//printf("\nValor->%d\n", valor);
//print f("posicao->%d\n", posicao);
//LeVetorDetalhado(n,31);
if((valor == 2147483647) || (valor < 0))
{
printf("\nERRO: numero recusado\n");
return 0;
}
//printf("P:%d, ", posicao);
if (posicao > -1)
{
posicao = posicao -1;
if(n[posicao] == 0)//entao vai pra esquerda
{
// printf("<");
if ((*noatual) == NULL){
(*noatual) =(no) malloc(sizeof(struct no));
(*noatual)->vetor[posicao] = 0;
//(*noatual)->esq = NULL;
//(*noatual)->dir = NULL;
insere(&(*noatual)->esq, valor, n, posicao);
}
else
insere(&(*noatual)->esq, valor, n, posicao);
}
if(n[posicao] == 1)
{
if ((*noatual) == NULL){
//printf(">");
(*noatual) =(no) malloc(sizeof(struct no));
(*noatual)->vetor[posicao] = 1;
//(*noatual)->esq = NULL;
//(*noatual)->dir = NULL;
insere(&(*noatual)->dir, valor, n, posicao);
}
else
insere(&(*noatual)->dir, valor, n, posicao);
}
}
if((*noatual) == NULL)
{
//printf("\nachou null\n");
(*noatual) =(no) malloc(sizeof(struct no));
for (i=31; i<0;i--)
(*noatual)->vetor[i] = n[i];
(*noatual)->chave = valor;
(*noatual)->esq = NULL;
(*noatual)->dir = NULL;
LeVetor(n,31);
printf("\nInserido: %d com sucesso!\n", (*noatual)->chave);
return 1;
}
}
int imprime (no arvore)
{
int a=1,b=1;
if (arvore != NULL)
{
printf("(%d,", arvore->chave);
a = imprime(arvore->esq);
b = imprime(arvore->dir);
printf(")");
//if (b == 0)
/// printf("(),");
//if (a == 0)
// printf("(),");
}
else
printf("()");
return 0;
}