LuisV Posted March 14, 2012 at 03:52 PM Report #443937 Posted March 14, 2012 at 03:52 PM Boas, será possivel enviar para uma funcao generica de pesquisa em listas ligadas, um identificador para escolher o campo a filtrar? a lista ligada será algo do genero typedef struct LL{ void *data; struct LL *next; } ll; o campo data pode ser de diferentes tipos. Obrigado
KTachyon Posted March 14, 2012 at 04:26 PM Report #443943 Posted March 14, 2012 at 04:26 PM Se não tens nenhuma forma de saber que tipo de dados lá tens tens um problema. Imagina que é um ponteiro para um espaço onde colocaste 4 chars. Isso pode ser perfeitamente lido como um int (32-bit, que ocupam o espaço de 4 chars). A solução é encapsulares os dados que colocas na lista de uma forma que torne possível a distinção do tipo. “There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.” -- Tony Hoare
Flinger Posted March 14, 2012 at 05:49 PM Report #443957 Posted March 14, 2012 at 05:49 PM É possível (aqui há uns anos eu fiz isso), mas dá uma trabalheira doida. De experiência te digo que dificilmente compensa, e mais vale implementar cada caso. podes fazer uma função de pesquisa com uma assinatura tipo: void *pesquisa(ll * node,int (*func)(data *, void *)); Ou seja, a tua função pesquisa recebe o apontador para a lista, e um apontador para uma função de filtro. Vai percorrer a lista e aplicar a função de filtro a todos os nodos até encontrar o que queres. Esta função de filtro recebe o apontador para a estrutura dos dados e um valor para a comparação e retorna (p. exemplo) um inteiro (1 se esse fôr o nodo que querias encontrar, 0 senão). Desta forma tens de fazer uma função de filtro por cada condição que queres testar desde que todas obedeçam à mesma assinatura (podes ter mais parâmetros, têm é que ser iguais para todas as funções de filtro), e chamar a pesquisa com a função que queres aplicada. *NOTA: Como disse o KTachyon tens de ter muito cuidado com os parâmetros que passas às funções, já que têm de ser genéricos, logo o compilador não te avisa se estiveres a passar parâmetros errados.
LuisV Posted March 14, 2012 at 06:01 PM Author Report #443961 Posted March 14, 2012 at 06:01 PM Obrigado pela ajuda.. Vou optar por enviar por parâmetro a funcão de comparação para o tipo de dados, criando diferentes funcoes de comparação!
Flinger Posted March 14, 2012 at 06:05 PM Report #443964 Posted March 14, 2012 at 06:05 PM Força, mas por tua conta e risco 😄 Agora que olho para trás, para os tempos de Universidade, fazia cada coisa mais parva... Mania de fazer algoritmos genéricos que depois nunca reaproveitava... Pior que este só mesmo quando resolvi fazer o mesmo para grafos :bye2:
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now