我的ADT dlist有一个函数可以将一些数据插入到dlist中,并带有三个参数:dlist,数据以及之后插入数据的dlist元素。然而dlist参数在这种情况下是多余的,但我必须说它让我更清楚,因为我看到我插入了哪个dlist。尽管是多余的,保留它是否有意义?
typedef struct dlist_element{
void* p_data;
struct dlist_element* p_next;
}dlist_element;
typedef struct dlist{
struct dlist_element* p_head;
freeFunction p_freeDataFunction;
}dlist;
完整.c源文件
dlist* dlist_create(void){
dlist* p_dlist = calloc(1, sizeof(dlist));
p_dlist->p_head = calloc(1, sizeof(dlist_element));
p_dlist->p_freeDataFunction = NULL;
return p_dlist;
}
void dlist_setDataFreeFunction(dlist* p_dlist, freeFunction p_freeDataFunction){
p_dlist->p_freeDataFunction = p_freeDataFunction;
}
void dlist_insert(dlist* p_dlist, void* p_data, dlist_element* p_preceding){
dlist_element* p_new = malloc(sizeof(dlist_element));
p_new->p_data = p_data;
p_new->p_next = p_preceding->p_next;
p_preceding->p_next = p_new;
}
void* dlist_inspect(dlist_element* p_element){
return p_element->p_next->p_data;
}
void* dlist_remove(dlist_element* p_element){
void* p_data = p_element->p_next->p_data;
dlist_element* p_remove = p_element->p_next;
p_element->p_next = p_remove->p_next;
free(p_remove);
return p_data;
}
bool dlist_isEmpty(dlist* p_dlist){
return p_dlist->p_head->p_next == NULL;
}
dlist_element* dlist_first(dlist* p_dlist){
return p_dlist->p_head;
}
dlist_element* dlist_next(dlist_element* p_element){
return p_element->p_next;
}
bool dlist_isEnd(dlist_element* p_element){
return p_element->p_next == NULL;
}
void dlist_free(dlist* p_dlist){
dlist_element* p_remove = p_dlist->p_head->p_next;
dlist_element* p_removeNext = NULL;
while (p_remove != NULL){
p_removeNext = p_remove->p_next;
if (p_dlist->p_freeDataFunction != NULL){
p_dlist->p_freeDataFunction(p_remove->p_data);
}
free(p_remove);
p_remove = p_removeNext;
}
free(p_dlist->p_head);
free(p_dlist);
}