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

listas duplamente ligadas em C

Discussão em 'Programação' iniciada por FrOidE, 2 de Abril de 2004. (Respostas: 12; Visualizações: 2685)

  1. FrOidE

    FrOidE Power Member

    Olá pessoal, tou com ums problema a tentar implementar ums lista duplamente ligada em C, quando corro a função AddMenuItem dá problemas de enderaçamento de memória, por debug desconfio que o problema seja do while, ou da atribuição do valor de head ao pointer, mas não consigo descobrir o q se passa.


    typedef struct MENUITEM
    {
    char text[40];
    struct MENUITEM * next;
    struct MENUITEM * prev;
    }MenuItem;

    typedef struct MENU
    {
    struct MENUITEM * head;
    int items;
    }Menu;


    Menu BuildMenu(void)
    {
    Menu tmp;

    tmp.head = NULL;
    tmp.items = 0;

    return tmp;
    }


    void MenuAddItem(Menu * pmenu,char * text)
    {
    MenuItem * temp = pmenu->head;

    while (!(temp->next==NULL)) temp=temp->next;

    temp->next=(CreateMenuItem(text));
    (temp->next)->prev=temp;

    pmenu->items++;
    }


    MenuItem * CreateMenuItem(char * text)
    {
    MenuItem * newitem = (MenuItem *) malloc( sizeof(MenuItem) );

    strcpy(newitem->text,text);
    newitem->next=NULL;
    newitem->prev=NULL;

    return newitem;
    }
     
  2. Chuls

    Chuls Power Member

    Pois é programar estrutura de dados em c é um pincel né. Visto que ele não está feito para trabalhar com objectos, vamos lá ver parece-me que tens um problema logo na primeira célula da lista axo eu “ñ tenho dados suf.”. Tens de verificar se a primeira célula não NULL caso isso inseres à cabeça, só depois é que fases o whille.

    Nota usa uma tail no teu menu. Torna mais eficaz a inserção visto que a tua lista só faz inserções à cauda, e assim deixas de usar o ciclo whille. Já agora com está o teu Inglês
    Podias consultar um livro muito bom “Data Structures and Algorithm Analysis in C “,
    No malloc soma-lhe mais um valor
    exe. MenuItem * newitem = (MenuItem *) malloc( sizeof(MenuItem) + 1 );

    por causa da terminação do texto mais tarde podia dar erro de memoria.
     
  3. Tafinho

    Tafinho Power Member

    E já agora, tenta usar o GDB, costuma achar os problemas em C e C++ bastante rapidamente.

    Ler listas bi linkadas em C a esta hora da manha é complicado, mas não é impossível e é bem melhor que construí-las em C++...
     
  4. FrOidE

    FrOidE Power Member

    Chuls danka, ja meti um apontador para a cauda e agr ja funka bem, e dado q fiz uma função propria para a cauda evito muitos prob assim escuso de estar a reservar espaço a mais (malloc + 1).

    Tafinho, fazer isto em c++ é bem mais simples imo.
     
  5. Tafinho

    Tafinho Power Member

    Isso porque já tens as templates feitas.

    Experimenta fazer a tua própria template de listas bi-linkadas em c++ a ver como é bom...
     
  6. SoundSurfer

    SoundSurfer Power Member

    O GDB é nosso amigo :)
     
  7. FrOidE

    FrOidE Power Member

    GDB quem é o bicho???
     
  8. fap

    fap Power Member

    Gnu debugger
     
  9. Akira

    Akira Power Member

    tb podes optar pelo DDD que é na mesma o GDB só que com um frontend grafico mais amigavel... mas é na mesma powered by GDB :D ... talvez seja mais facil no inicio mas vais acabar por ir ter ao GDB
     
  10. FrOidE

    FrOidE Power Member

    já agora neste mm problema para apagar todos os nos da lista e libertaar memoria, tou a usar um for, e a fazer um free em cada iteração, mas n ta a funcionar, dá erro de endereçamento de memória.

    ideias??
     
  11. noup

    noup Power Member

    posta aí o código.
    acho que o teu problema está em acederes ao "next" depois de apagares o elemento. tens que guardar uma referencia para o proximo elemento antes de o apagares.
     
  12. FrOidE

    FrOidE Power Member

    Código:
    void EraseMenu(Menu * menu)
    {
    	MenuItem * p=menu->head;
    	int i=0;
    
    	for (i=0; i<menu->items;i++,p=p->next)
    	{
    		free(p);
    	}
    
    }
     
    Última edição: 14 de Abril de 2004
  13. noup

    noup Power Member

    tal como eu disse, estás a fazer p->next a um p que já foi apagado. o que tu queres é algo do género:

    Código:
    void EraseMenu(Menu * menu){
    	MenuItem* item = menu->head;
    	MenuItem* actual;
    	int numItems = menu->items;
    	int cont=0;
    
    	for (cont=0; cont < numItems ; cont++){
    		actual = item;
    		item = item->next;
    		free(actual);
    	}
    
    }
    
    btw, n testei.
     

Partilhar esta Página