-2

我有具有列表结构的代码和实现它的代码。

结构,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

2 回答 2

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最后一个节点的指针分配给新节点,因此它将丢失。

于 2013-07-15T14:10:56.120 回答
1

几个问题:

  • 您正在销毁列表,通过list_destroy它可以调用entry_destroy添加到列表中的条目,然后调用list_get它返回指向(而不是副本)条目的指针。
  • list_add您调用malloc为新节点分配空间时,您没有将其next元素设置为NULL. 由于malloc不保证分配的内存被擦除,因此列表可能永远不会以将其next元素设置为的节点结束,NULL从而导致虚假结果。
  • 您的保证else分支将是(或者由于早期的问题,程序将因段错误而崩溃)您可能希望终止 when is而不是 when is 。此外,此分支需要显式分配元素。list_addnoNULLno->nextNULLnoNULLnextNULL
于 2013-07-15T14:12:51.177 回答