main.c文件

#include "llist.h"

typedef struct Element
{
char name[32];
int age;
double score;
}ElementType;

void print(const void *data)
{
const struct Element *e = (struct Element *)data;
printf("data >> [name: %s, age: %d, score: %lf].\n", e->name, e->age, e->score);
return;
}

int cmpe(const void *e1, const void *e2)
{
const int *ae1 = (int *)e1;
ElementType *n = (ElementType *)e2;
return (*ae1 - (n->age));
}

int cmpe_name(const void *e1, const void *e2)
{
const char *key = (char *)e1;
ElementType *n = (ElementType *)e2;
return strcmp(key, n->name);
}

int main()
{

int data_size = sizeof(ElementType);
LList *pList = creat(data_size);
if(pList == NULL)
{
printf("crete failed.\n");
}
else
{
printf("create success addr is [%p].\n", pList);
}

struct Element arr[] = {{"one", 1, 11.1}, {"two", 2, 12.2}, {"three", 3, 13.3}, {"four", 4, 14.4}, {"five", 5, 15.5}, {"six", 6, 16.6}, {"seven", 7, 17.7}};
for(int i = 0; i < sizeof(arr)/sizeof(ElementType); i++)
{
LList *result = insert(1, &arr[i], pList);
if(result == NULL)
{
printf("[%d] insert failed.\n", i);
}
else
{
printf("[%d] insert success.\n", i);
}
}

travel(pList, print);

/**
int age = 4;
struct Element *ret = (struct Element *)find_list(pList, &age, cmpe);
if(ret == NULL)
{
printf("find failed.\n");
}
else
{
printf("find success >>[name: %s, age: %d, score: %lf].\n", ret->name, ret->age, ret->score);
}


char *xm = "six";
// struct Element *ret = (struct Element *)find_list(pList, xm, cmpe_name);
struct Element *ret = (struct Element *)overrride_find_list(pList, xm, cmpe_name);
if(ret == NULL)
{
printf("find failed.\n");
}
else
{
printf("find success >>[name: %s, age: %d, score: %lf].\n", ret->name, ret->age, ret->score);
}
*/

printf("--------------------------------------- delete --------------------------------------------\n");
char *xm = "six";
int ret = dele(pList, xm, cmpe_name);
if(ret != 0)
{
printf("delete failed.\n");
}
else
{
printf("delete success.\n");
}

travel(pList, print);

printf("--------------------------------------- fetch --------------------------------------------\n");
int age = 4;
// void *d = NULL;
struct Element aaaa = {"zero", 0, 0.0};
void *d = &aaaa;
int rret = fetch(pList, &age, cmpe, d);
if(rret != 0)
{
printf("fetch delete failed.\n");
}
else
{
ElementType *e = (ElementType *)d;
printf("fetch delete success:return data >>[name: %s, age: %d, score: %lf].\n", e->name, e->age, e->score);
}

travel(pList, print);

printf("double link list destory status [%d].\n", destory(pList));

return 0;
}

llist.h文件

#ifndef LLIST_H__
#define LLIST_H__
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MODE_HEAD 0
#define MODE_TAIL 1

typedef int compare(const void *e1, const void *e2);

struct node
{
void *data;
struct node *prev;
struct node *next;
};

typedef struct head
{
int size;
struct node ele;
}LList;

LList *creat(int initszie);

LList *insert(int mode, const void *data, LList *pList);

void *find_list(LList *pList, const void *key, compare *cmp);

void *overrride_find_list(LList *pList, const void *key, int (*comp)(const void *e1, const void *e2));

int dele(LList *pList, const void *key, int (*comp)(const void *e1, const void *e2));

int fetch(LList *pList, const void *key, compare *cmp, void *data);

void travel(LList *pList, void (*print)(const void *data));

int destory(LList *pList);

#endif

llist.c文件

#include "llist.h"

static void *find(LList *pList, const void *key, compare *cmp)
{
for(struct node *cur = pList->ele.next; cur != &pList->ele; cur = cur->next)
{
if(cmp(key, cur->data) == 0)
{
return cur;
}
}
return NULL;
}

static void *overrride_find(LList *pList, const void *key, int (*comp)(const void *e1, const void *e2))
{
for(struct node *cur = pList->ele.next; cur != &pList->ele; cur = cur->next)
{
if(comp(key, cur->data) == 0)
{
return cur;
}
}
return NULL;
}

LList *creat(int initszie)
{
LList *pList = (LList *)malloc(sizeof(struct head));
if(pList == NULL)
{
return NULL;
}
pList->size = initszie;
pList->ele.data = NULL;
pList->ele.prev = &pList->ele;
pList->ele.next = &pList->ele;
return pList;
}

LList *insert(int mode, const void *data, LList *pList)
{
struct node *newnode = (struct node *)malloc(sizeof(struct node *));
if(newnode == NULL)
{
return NULL;
}
newnode->data = malloc(pList->size);
if(newnode->data == NULL)
{
return NULL;
}
memcpy(newnode->data, data, pList->size);
if(mode == MODE_HEAD)
{
newnode->prev = &pList->ele;
newnode->next = pList->ele.next;
}
else if(mode == MODE_TAIL)
{
newnode->prev = pList->ele.prev;
newnode->next = &pList->ele;
}
else
{
return NULL;
}
newnode->prev->next = newnode;
newnode->next->prev = newnode;
return pList;
}

void *find_list(LList *pList, const void *key, compare *cmp)
{
struct node *n = (struct node *)find(pList, key, cmp);
if(n == NULL)
{
return NULL;
}
return n->data;
}

void *overrride_find_list(LList *pList, const void *key, int (*comp)(const void *e1, const void *e2))
{
struct node *n = (struct node *)overrride_find(pList, key, comp);
if(n == NULL)
{
return NULL;
}
return n->data;
}

int dele(LList *pList, const void *key, int (*comp)(const void *e1, const void *e2))
{
struct node *retnode = overrride_find(pList, key, comp);
if(retnode == NULL)
{
return -1;
}
retnode->prev->next = retnode->next;
retnode->next->prev = retnode->prev;
free(retnode->data);
free(retnode);
retnode->data = NULL;
retnode = NULL;
return 0;
}

int fetch(LList *pList, const void *key, compare *cmp, void *data)
{
struct node *retnode = (struct node *)find(pList, key, cmp);
if(retnode == NULL)
{
return -1;
}
retnode->prev->next = retnode->next;
retnode->next->prev = retnode->prev;
if(data != NULL)
{
memcpy(data, retnode->data, pList->size);
}
free(retnode->data);
free(retnode);
retnode->data = NULL;
retnode = NULL;
return 0;
}

void travel(LList *pList, void (*print)(const void *data))
{
for(struct node *cur = pList->ele.next; cur != &pList->ele; cur = cur->next)
{
print(cur->data);
}
return;
}

int destory(LList *pList)
{
struct node *cur, *node = NULL;
for(cur = pList->ele.next; cur != &pList->ele; cur = node)
{
node = cur->next;
free(cur->data);
free(cur);
//先free,先置为空
cur->data = NULL;
cur = NULL;
}
free(pList);
pList = NULL;
return 0;
}

这段代码在Linux系统上使用gcc 4.8版本编译运行没问题,在Mac系统上使用gcc运行报错。