头文件
//
// clist.h
// cycle_list
//
// Created by bikang on 16/9/1.
// Copyright (c) 2016年 bikang. All rights reserved.
//
#ifndef __cycle_list__clist__
#define __cycle_list__clist__
//定义基础的结构
typedef struct CListElmt_{
void *data;
struct CListElmt_ *next;
}CListElmt;
//定义列表
typedef struct clist_{
int size;//大小
int (*match)(const void *key1,const void *key2);//比较,匹配
void (*destroy)(void *data);//内存释放函数
CListElmt *head;//头
}CList;
//初始化
void clist_init(CList *clist,void(*destroy)(void *data));
//在element元素后插入一个元素,如果element为空,则插入链表头部
int clist_ins_next(CList *clist, CListElmt *element,const void *data);
//删除element后面的那个元素,如果element为空,则删除链表头元素
int clist_rem_next(CList *clist,CListElmt *element,void **data);
//删除一个列表,删除列表里面存储的data
void clist_destroy(CList *clist);
//定义基础的宏
#define clist_size(clist) ((clist)->size)
#define clist_head(clist) ((clist)->head)
#define clist_is_head(clist,element) ((element) == (clist)->head?1:0)
#define clist_data(element)((element)->data)
#define clist_next(element)((element)->next)
#endif /* defined(__cycle_list__clist__) */
实现代码
//
// clist.c
// cycle_list
//
// Created by bikang on 16/9/1.
// Copyright (c) 2016年 bikang. All rights reserved.
//
#include "clist.h"
#include <stdlib.h>
#include <string.h>
//cinit
void clist_init(CList *clist,void(*destroy)(void *data)){
clist->size = 0;
clist->destroy = destroy;
clist->head = NULL;
return;
}
//在element元素后插入一个元素,
//如果element为空,则插入链表头部
//需要考虑链表为空的情况
int clist_ins_next(CList *clist, CListElmt *element,const void *data){
CListElmt* newElement;
newElement = malloc(sizeof(CListElmt));
if(newElement == NULL) return -1;
newElement->data = (void*)data;
newElement->next = NULL;
if(clist_size(clist) == 0){
newElement->next = newElement;
clist->head = newElement;
}else{
if(element == NULL){
element = clist->head;
}
newElement->next = element->next;
element->next = newElement;
}
clist->size++;
return 0;
}
//删除element后面的那个元素,如果element为空,则删除链表头元素
int clist_rem_next(CList *clist,CListElmt *element,void **data)
{
CListElmt *oldElement;
if(clist_size(clist) == 0)return -1;
if(element == NULL) element = clist->head;
if(element->next == element){
oldElement = element->next;
*data = oldElement->data;
clist->head = NULL;
}else{
oldElement = element->next;
*data = oldElement->data;
element->next = element->next->next;
if(oldElement == clist->head){
clist->head = oldElement->next;
}
}
free(oldElement);
clist->size--;
return 0;
}
void clist_destroy(CList *clist){
void *data;
while(clist_size(clist) > 0){
if(clist_rem_next(clist,NULL,(void**)&data) == 0 && clist->destroy != NULL ){
clist->destroy(data);
}
}
memset(clist,0,sizeof(CList));
return;
}
测试
/**
循环列表
**/
#include <stdio.h>
#include <stdlib.h>
#include "clist.h"
typedef struct Info_{
int id;
long phone;
}Info;
void print_list_info(CList *clist);
int main(int argc, const char * argv[]) {
printf("test clist\n");
CList *plist;
plist = (CList *)malloc(sizeof(CList));
clist_init(plist,free);
printf("plist->size:%d\n", plist->size );
Info *pi2 = (Info*)malloc(sizeof(Info));
pi2->id = 123131;
pi2->phone = 13012131231;
clist_ins_next(plist,NULL,(void*)pi2);
Info *pi3 = (Info*)malloc(sizeof(Info));
pi3->id = 5370569;
pi3->phone = 18611080217;
clist_ins_next(plist,NULL,(void*)pi3);
Info *pi4 = (Info*)malloc(sizeof(Info));
pi4->id = 2231313;
pi4->phone = 18643521217;
clist_ins_next(plist,NULL,(void*)pi4);
//print list
printf("plist->size:%d\n", plist->size);
print_list_info(plist);
void **ppi = (void**)malloc(sizeof(Info));
clist_rem_next(plist,NULL,ppi);
//print list
printf("plist->size:%d\n", plist->size );
print_list_info(plist);
clist_destroy(plist);
printf("plist->size:%d\n", plist->size );
return 0;
}
//打印一个列表
void print_list_info(CList *clist){
if(clist_size(clist) == 0){
printf("empty list\n");
return;
}
CListElmt *pl;
pl = clist_head(clist);
int i;
printf("#########start#############\n");
for(i=0;i<clist_size(clist);i++){
printf("id=%d,phone=%ld\n",((Info*)clist_data(pl))->id,((Info*)clist_data(pl))->phone);
pl = pl->next;
}
printf("#########end#############\n");
}