Dúvida de C (Criação de nova tabela de dispersão aberta - duvida - ponteiros)

S|N

Power Member
Olá pessoal. A dúvida é a seguinte:

Tenho a minha tabela definida com a seguinte estrutura:

typedef struct
{
TSingleList **tabela;
int dim;
int max_elems;
int num_elems;
}THashtable;


Ao criar tenho:

.....
newHash-> tabela = (TSingleList *)malloc(sizeof(*dim_tabela))
---> ERRO
....

Alguem me ajuda???? E por favor expliquem porquê (sei que falhei nos ponteiros)

PS: O resto da tabela não dá problemas nenhuns

Obrigado
 
Última edição:
Qual é exactamente o erro que dá? Esse dim_tabela, onde está definido?

Normalmente construo hashtables em C de maneira diferente, em relação à tua construção não sei se te posso ajudar muito.
 
onde esta definido "*dim_tabela"?

axo k o problema esta nesse malloc e especialmente dentro do sizeof(). experimenta tirar o * (tb depende do codigo k estas a correr).

[[]]
 
Pois tinha outro erro (lapso)

Aqui é o que realmente faz sentido ter...

typedef struct
{
TSingleList **tabela; /* same as supostamente *tabela[]*/
int dim;
int max_elems;
int num_elems;
}THashtable;


Ao criar tenho:

.....
newHash-> *tabela = (TSingleList *)malloc(sizeof(TSingleList)); --> ERRO: tabdispersao.c:23: error: parse error before '*' token
....
 
Última edição:
S|N disse:
newHash-> *tabela = (TSingleList *)malloc(sizeof(TSingleList));

aki estas a criar o vector ou o vector de vectores? se estas a crirar o vector de vectores faz:

Código:
newHash->tabela = (TSingleList **)calloc(TAMANHO_DO_VECTOR, sizeof(TSingleList*));

caso contrario:
Código:
newHash->*tabela = (TSingleList *)calloc(TAMANHO_DO_VECTOR, sizeof(TSingleList));

[[]]

ps: deixem de usar o malloc... :rolleyes:
 
Última edição:
Obrigado pela tua ajuda! O que quero fazer é criar uma tabela que a cada posição corresponda um apontador para lista... Podes explicar-me melhor a tua solução? E se não for muito trabalho podes tentar (se possível claro) fazer com malloc? A data de entrega do trabalho já passou e entreguei uma versão que não funciona a 100%, mas já que tive tanto trabalho a por isto (quase) de pé, queria vê-lo a funcionar...

A tabela está definida na estrutura como **tabela por causa da operação de remoção. Para não ter residuos sabes....
 
redalert disse:
aki estas a criar o vector ou o vector de vectores? se estas a crirar o vector de vectores faz:

Código:
newHash->tabela = (TSingleList **)calloc(TAMANHO_DO_VECTOR, sizeof([COLOR=Red]TSingleList*[/COLOR]));

Não percebo A ultima parte (a vermelho). Estive a ver a sintax do malloc e calloc e não falam nisso... Podes explicar? Obrigado!
 
Já pus a funcionar essa parte. Ajudem-me agora com isto por favor


makeEmptyList ( phashtable-> *tabela ); ---> ERRO: tabdispersao.c:48: error: parse error before '*' token

Obrigado
 
S|N disse:
Já pus a funcionar essa parte. Ajudem-me agora com isto por favor


makeEmptyList ( phashtable-> *tabela ); ---> ERRO: tabdispersao.c:48: error: parse error before '*' token

Obrigado

keres apagar a lista k esta numa posicao do vector?

se sim:

Código:
#ifndef NULL
#define NULL '\0'

/* funcao para apagar a lista na posicao POSICAO_NO_VECTOR. apaga a partir do inicio da lista. */

void makeEmptyList (TIPO_DA_LISTA_HASH *pointer_elemento){

       TIPO_DA_LISTA_HASH aux1 = NULL;

       while(pointer_elemento->next != NULL){
             aux1 = pointer_elemento->next;
             pointer_elemento->next = pointer_elemento->next->next;
             free(aux1);
        }

       return;
}

penso k esta funcao esteja correcta a nivel de sintaxe. :) fiz assim de cabeça. :D

axo k as tuas estruturas de dados nao te estao a facilitar o trabalho. :( penso k ha maneiras mais simples e eficientes de tratar os teus dados com o mesmo tipo de estruturas. ;)

edit: funcao para lista simplesmente ligada. com lista duplamente ligada funciona mas é mais simples ligar os pointers para o anterior. :)
nao eskecer de fazer free() a vectores ou "strings" k estejam dentro da estrutura da lista!


---------
Código:
newHash->tabela = (TSingleList **)calloc(TAMANHO_DO_VECTOR, sizeof([COLOR=Red]TSingleList*[/COLOR]));

S|N disse:
Não percebo A ultima parte (a vermelho). Estive a ver a sintax do malloc e calloc e não falam nisso... Podes explicar? Obrigado!

soz... malloc nao presta pk nao inicializa a memoria alocada a NULL. o calloc faz isso automaticamente diminuindo COLOSALMENTE a complexidade de inicializacao de estruturas de dados. :)

a parte a vermelho servia para o caso de estares a fazer um vectores de vectores. como estas a fazer um vector de listas bastava colocar o sizeof(APONTADOR_PARA_LISTA_DA_HASH*). :)


[[]]
 
Última edição:
Redalert, muito obrigado pela ajuda que deste, aprendi mais alguma coisa sobre ponteiros mas a minha dúvida principal não é na função makeEmptyList, esta está noutro módulo e a funcionar... O problema é que recebe:

void makeEmptyList(TSingleList *plist);

,sendo o tipo TSingleList definido assim:

typedef struct
{
TSingleListNode *head;
TSingleListNode *tail;
int num_elements;
}TSingleList;


mas como o que tenho à entrada da Função mãe é:

void destroyHashtable(THashtable **phashtable);

,sendo o tipo THashtable definido assim:

typedef struct
{
TSingleList **tabela;
int dim;
int max_elems;
int num_elems;
}THashtable;

Logo pareceu-me lógico fazer assim para aceder à lista:

makeEmptyList(phashtable->*tabela); pois como vês tabela é do tipo TSingleList.

Mas isto dá erro de sintax... Ajuda-me please...
 
S|N disse:
typedef struct
{
TSingleListNode *head;
TSingleListNode *tail;
int num_elements;
}TSingleList;
ha aki algo k me esta a passar ao lado... :$ lista simplesmente ligada com 2 pointers? :confused:




Código:
typedef struct
{
	TSingleList *tabela;
	int dim;
	int max_elems;
	int num_elems;
}THashtable;


makeEmptyList(phashtable->tabela);


testa assim
 
Os dois ponteiros servem para facilitar a remoção.... a remoção é feita da direita para a esquerda e assim precisamos de dois ponteiros para irem andando pelos nodes da lista (para nao perdermos a ligação no caso de uma remoção no meio)... Por ser mais prático (uma vez que de outra forma teriamos 2 ponteiros para a lista (o normal e o auxiliar), criamos um ponteiro que aponta para o ponteiro de aponta para a lista.... Sei que poderia ser feito de outra forma mas os profs n querem que mexamos nos .h do trabalho :S Beats me....
 
O problema é que tabela não é do tipo TSingleList.... É sim um apontador para apontador de TSingleList. Neste caso não sei como especificar... phashtable->tabela tb n resultou :( o gcc diz que aquela estrutura n existe.... phashtable->*tabela é erro de sintaxe.... :(
 
Ora bem, deixa ver se percebi tudo como deve ser. Conceptualmente aquilo que tens é um vector de listas, ou seja, um vector em que cada posicao tem um ponteiro de uma lista e a tua funcao makeEmptyList serve para destruir cada uma das listas. Se for isto entao parece-me que tens dois problemas no teu argumento e nao um.

1 prob) o ponteiro para a lista que queres destruir está em cada posicao do vector, ou seja, tabela em que i é o indice da lista a destruir, se queres destruir tudo fazes um for ou assim

2 prob) a funcao

void makeEmptyList(TSingleList *plist)

é chamada dentro de

void destroyHashtable(THashtable **phashtable);

ora bem se fizeres simplesmente phashtable->tabela duvido que funcione pois phashtable nao é um ponteiro para a hashtable (THashtable*) mas sim (THashtable**). Pergunta: Usas mais que uma hashtable no teu programa? Tens um vector de hashtables é? Caso tenhas apenas uma podes mudar a tua funcao destroy para receber THashtable* caso tenhas mesmo que manter o argumento com esse tipo entao indexas phashtable da mesma maneira que indexas a tabela para obteres a posicao que queres.

Boa sorte nisso
 
Back
Topo