实施清单C.

时间:2013-07-15 13:55:15

标签: 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;
 }

所以,我想要的是将此代码添加到列表中。感谢。

2 个答案:

答案 0 :(得分: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 :(得分:1)

几个问题:

  • 您正在通过list_destroy销毁列表,该列表可以在调用entry_destroy之前调用list_get添加到列表中的条目,该list_add返回指向(不是副本)条目的指针。
  • malloc中,您致电next为新节点分配空间,但不要将其NULL元素设置为malloc。由于next不保证已擦除分配的内存,因此列表可能永远不会以其NULL元素设置为else的节点结束,从而导致虚假结果。
  • list_add中的no分支NULLno->next NULL(或者程序将因segfault早期问题而崩溃。)您可能想要在noNULL而非nextNULL时终止。此外,此分支需要明确地将{{1}}元素分配给{{1}}。