双向循环链表和单向循环链表类似,比单向循环链表多了一个前节点的引用
头文件:
#ifndef double_cycle_link_list_h
#define double_cycle_link_list_h
#include <stdio.h>
#define dcList_size(list) ((list)->size)
#define dclist_head(list) ((list)->head)
#define dclist_tail(list) ((list)->tail)
#define dclist_is_head(list,element) ((list->head)==(element)?1:0)
#define dclist_is_tail(list,element) ((list->tail)==(element)?1:0)
#define dclist_data(element) ((element)->data)
typedef struct DoubleCycleLinkEle_{
void * data;
struct DoubleCycleLinkEle_* pre;
struct DoubleCycleLinkEle_*next;
} DoubleCycleLinkEle,*DoubleCycleLinkEleP;
typedef struct DoubleCycleLinkList_{
int size;
void (*destroy)(void *data);
DoubleCycleLinkEleP head;
}DoubleCycleLinkList,*DoubleCycleLinkListP;
void dclist_init(DoubleCycleLinkListP list,void (*destroy) (void *data));
int dclist_ins_pre(DoubleCycleLinkListP list,DoubleCycleLinkEleP element,void *data);
int dclist_ins_next(DoubleCycleLinkListP list,DoubleCycleLinkEleP element,void *data);
int dclist_rm_pre(DoubleCycleLinkListP list,DoubleCycleLinkEleP element,void ** data);
int dclist_rm_next(DoubleCycleLinkListP list,DoubleCycleLinkEleP element,void **data);
void dclist_destroy(DoubleCycleLinkListP list);
#endif /* double_cycle_link_list_h */
源文件:
#include "double_cycle_link_list.h"
#include <stdlib.h>
#include <string.h>
void dclist_init(DoubleCycleLinkListP list,void (*destroy) (void *data)){
list->destroy=destroy;
list->head=NULL;
list->size=0;
}
int dclist_ins_pre(DoubleCycleLinkListP list,DoubleCycleLinkEleP element,void *data){
DoubleCycleLinkEleP ele=malloc(sizeof(DoubleCycleLinkEle));
if(!ele)
return 0;
ele->data=data;
int size=dcList_size(list);
if(element!=NULL){
list->size++;
ele->pre=element->pre;
element->pre->next=ele;
ele->next=element;
element->pre=ele;
if(dclist_is_head(list, element))
list->head=ele;
return 1;
}
if(size==0){
list->size++;
list->head=ele;
ele->next=ele;
ele->pre=ele;
return 1;
}
return dclist_ins_pre(list,list->head,data);
}
int dclist_ins_next(DoubleCycleLinkListP list,DoubleCycleLinkEleP element,void *data){
DoubleCycleLinkEleP ele=malloc(sizeof(DoubleCycleLinkEle));
if(!ele)
return 0;
ele->data=data;
int size=dcList_size(list);
if(element!=NULL){
list->size++;
ele->next=element->next;
element->next->pre=ele;
element->next=ele;
ele->pre=element;
return 1;
}
if(size==0){
list->size++;
list->head=ele;
ele->next=ele;
ele->pre=ele;
return 1;
}
return dclist_ins_next(list, list->head, data);
}
int dclist_rm_pre(DoubleCycleLinkListP list,DoubleCycleLinkEleP element,void ** data){
if(element!=NULL){
list->size--;
DoubleCycleLinkEleP rm=element->pre;
*data=rm->data;
if(rm==element){
list->head=NULL;
}else{
element->pre=rm->pre;
rm->pre->next=element;
}
free(rm);
return 1;
}
int size=dcList_size(list);
if(size==0)
return 0;
return dclist_rm_pre(list, list->head, data);
}
int dclist_rm_next(DoubleCycleLinkListP list,DoubleCycleLinkEleP element,void **data){
if(element!=NULL){
list->size--;
DoubleCycleLinkEleP rm=element->next;
*data=rm->data;
if(rm==element){
list->head=NULL;
}else{
element->next=rm->next;
rm->next->pre=element;
}
free(rm);
return 1;
}
int size=dcList_size(list);
if(size==0)
return 0;
return dclist_rm_next(list, list->head, data);
}
void dclist_destroy(DoubleCycleLinkListP list){
void *data;
while (dcList_size(list)>0) {
if(dclist_rm_next(list,list->head,&data)&&list->destroy!=NULL){
list->destroy(data);
}
}
memset(list, 0, sizeof(DoubleCycleLinkList));
}