2013-07-15 84 views
-2

我有一個列表結構的代碼和實現它的代碼。實現一個列表C

結構,entry_t是名單上的數據的類型:

#ifndef _list_private_h 
    #define _list_private_h 

    typedef struct list_t{ 
     struct node_t *head; 
     int size; 
    }; 

    typedef struct node_t{ 
     struct entry_t *element; 
     struct node_t *next; 
    }node_t; 

    #endif 

代碼:

struct list_t *list_create(){ 
     struct list_t *list = (struct list_t*) malloc(sizeof(struct list_t)); 
     list->head=NULL; 
     list->size=0; 
     return list; 
} 

int list_destroy(struct list_t *list){ 
     node_t *no = list->head; 
     while(no!=NULL){ 
       node_t *aux=no; 
       entry_destroy(no->element); 
       no=no->next;    
       free(aux);   
       list->size=(list->size)-1;     
     } 
     free(list); 
     return 0; 
} 

int list_add(struct list_t *list, struct entry_t *entry){ 
     node_t *no = list->head; 
     if(no==NULL){ 
      list->head=(node_t*) malloc(sizeof(node_t)); 
      list->head->element=entry_dup(entry); 
      list->size=list->size+1; 
      return 0; 
     } 
     else{ 
      while(no!=NULL){ 
        no=no->next; 
      } 
      no=(node_t*) malloc(sizeof(node_t)); 
      no->element=entry_dup(entry); 
      list->size=list->size+1; 
      return 0; 
     } 
     return -1; 
    }   


struct entry_t *list_get(struct list_t *list, char *key){ 
     node_t *no = list->head; 
     while(no!=NULL){    
       if(strcmp(no->element->key,key)==0){ 
        return no->element;    
       } 
       no=no->next; 
     } 
     return NULL; 
    } 

當我運行這些測試並不元素添加到列表中:

int testEmptyList() { 
     struct list_t *list = list_create(); 
     int result = list != NULL && list_size(list) == 0; 
     list_destroy(list); 
     printf("Test empty list: %s\n",result?"pass":"not pass"); 
     return result; 
} 

int testAddHead() { 
     int result; 
     struct list_t *list = list_create(); 
     struct entry_t *entry = entry_create(strdup("abc"),data_create(5)); 
     memcpy(entry->value->data,"abc1",5); 
     list_add(list,entry); 
     result = list_get(list,"abc") == entry && 
     list_size(list) == 1; 
     list_destroy(list); 
     printf("Module list -> test add first: %s\n",result?"pass":"not pass"); 
     return result; 
} 

所以,我想要的是把這個代碼添加到列表中的元素。謝謝。

+4

不投下malloc的退貨 – Alexis

+1

「list_add」的代碼在哪裏? – Joni

+2

我不介意人們是否想投票,但除非他們被告知爲什麼他們被拒絕投票,否則沒有人從投票中學到東西。 – Kaganar

回答

1

試試這個:

int list_add(struct list_t *list, struct entry_t *entry){ 
     node_t *no = list->head; 
     if(no==NULL){ 
      list->head=(node_t*) malloc(sizeof(node_t)); 
      list->head->element=entry_dup(entry); 
      list->size=list->size+1; 
      return 0; 
     } 
     else{ 
      while(no->next!=NULL){ 
      no=no->next; 
      } 
     no->next=(node_t*) malloc(sizeof(node_t)); 
     no->next->element=entry_dup(entry); 
     no->next->next = NULL; 
     list->size=list->size+1; 
     return 0; 
     } 
    return -1; 
    } 

的問題是,前一個節點需要知道下一個的地址,通過指針next。在你的情況下,no->next將等於NULL(在循環之後),所以它是最後一個節點。您從不將最後一個節點的next指針指定給新節點,因此它將丟失。

1

幾個問題:

  • 您通過list_destroy破壞列表,它可以在進入呼叫entry_destroy添加到列表中調用list_get返回一個指針(不是副本)的條目之前。
  • list_add您可以撥打malloc爲新節點分配空間,但是您不要將其元素設置爲NULL。由於malloc不保證已分配的內存已被擦除,因此該列表永遠不會以其next元素設置爲NULL的節點導致虛假結果。
  • else分公司list_add保證noNULL(或程序會從一個segfault前面給出的問題墜毀。)你可能想終止時no->nextNULL,而不是當noNULL。此外,該分支需要明確指定next元素爲NULL