Jump to content

enviar por parametro campo da estrutura a pesquisar


LuisV
 Share

Recommended Posts

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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:

Link to comment
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.