我的代码包含列表结构和实现它的代码。
结构,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;
}
所以,我想要的是将此代码添加到列表中。感谢。
答案 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
分支NULL
将no->next
NULL
(或者程序将因segfault早期问题而崩溃。)您可能想要在no
为NULL
而非next
为NULL
时终止。此外,此分支需要明确地将{{1}}元素分配给{{1}}。