1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

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

Discussão em 'Programação' iniciada por S|N, 10 de Junho de 2005. (Respostas: 14; Visualizações: 2721)

  1. S|N

    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: 10 de Junho de 2005
  2. PrOdG

    PrOdG Power Member

    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.
     
  3. redalert

    redalert Folding Member

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

    [[]]
     
  4. S|N

    S|N Power Member

    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: 10 de Junho de 2005
  5. redalert

    redalert Folding Member

    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: 10 de Junho de 2005
  6. S|N

    S|N Power Member

    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....
     
  7. S|N

    S|N Power Member

    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!
     
  8. S|N

    S|N Power Member

    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
     
  9. redalert

    redalert Folding Member

    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]));
    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: 11 de Junho de 2005
  10. S|N

    S|N Power Member

    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...
     
  11. redalert

    redalert Folding Member

    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
     
  12. S|N

    S|N Power Member

    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....
     
  13. S|N

    S|N Power Member

    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.... :(
     
  14. itsy

    itsy Power Member

    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
     
  15. S|N

    S|N Power Member

Partilhar esta Página