头文件:include/queueLib.h
#ifndef __QUEUELIB__
#define __QUEUELIB__
#ifdef __cpluscplus
extern "C"
{
#endif
typedef unsigned long queue_t;
typedef int BOOL;
#define TRUE 1
#define FALSE 0
typedef struct queueItem{
struct queueItem *next;
struct queueItem *prev;
}queueItem;
#define getEntry(ptr,type,member) ((type*)((char*)ptr - (size_t)&(((type*)0)->member)))
#define iterateEntryOfQueue(usrptr,queueId,type,member) \
for(usrptr = getEntry(((queueItem*)queueId)->next,type,member); \
&(usrptr->member) != ((queueItem*)queueId); \
usrptr = getEntry(usrptr->member.next,type,member))
extern queue_t queue_create();
extern BOOL qItemEmpty(queueItem *qptr);
extern BOOL addItemToQueue(queue_t que,queueItem *item);
extern BOOL delItemOfQueue(queue_t que,queueItem *item);
extern BOOL itemIsExit(queue_t que,queueItem *item);
extern void queue_destroy(queue_t que);
#ifdef __cpluscplus
}
#endif
#endif // __QUEUELIB__
库C文件:src/queueLib/queueLib.c
#include "../../include/queueLib.h"
#include <stdlib.h>
#define INIT_ITEM(ptr) { \
(ptr)->next = ptr; \
(ptr)->prev = ptr; \
}
#define EMPTY_ITEM(ptr){ \
(ptr)->next = 0; \
(ptr)->prev = 0; \
}
BOOL itemIsExit(queue_t que,queueItem *item)
{
queueItem *pmd = ((queueItem *)que)->next;
while(pmd != ((queueItem *)que)){
if(item == pmd){
return TRUE;
}
pmd = pmd->next;
}
return FALSE;
}
queue_t queue_create()
{
queueItem *qptr = (queueItem*)malloc(sizeof(queueItem));
if(NULL == qptr){
return 0;
}
INIT_ITEM(qptr);
return (queue_t)qptr;
}
BOOL qItemEmpty(queueItem* qptr)
{
if(NULL == qptr){
return FALSE;
}
EMPTY_ITEM(qptr);
return TRUE;
}
BOOL addItemToQueue(queue_t que,queueItem *item)
{
queueItem *ptr = (queueItem *)que;
if(NULL == ptr){
return FALSE;
}
if( TRUE == itemIsExit(que,item)){
return FALSE;
}
ptr = ptr->prev;
item->next = (queueItem *)que;
item->prev = ptr;
ptr->next = item;
((queueItem *)que)->prev = item;
return TRUE;
}
BOOL delItemOfQueue(queue_t que,queueItem *item)
{
queueItem *pmd = NULL,*prev = NULL,*next = NULL;
if(item == NULL){
return FALSE;
}
pmd = ((queueItem*)que)->next;
if(pmd == NULL){
return FALSE;
}
if( FALSE == itemIsExit(que,item)){
return FALSE;
}
while(pmd != (queueItem*)que)
{
if(pmd == item){
prev = item->prev;
next = item->next;
prev->next = next;
next->prev = prev;
pmd = prev;
break;
}
pmd = pmd->next;
}
EMPTY_ITEM(item);
return TRUE;
}
void queue_destroy(queue_t que)
{
queueItem *item = (queueItem *)que;
if(item == NULL){
return;
}
free(item);
que = 0;
}
测试C文件:src/testqueueLib/main.c
#include <stdio.h>
#include <stdlib.h>
#include "../../include/queueLib.h"
typedef struct mydata{
int a;
queueItem item;
}mydata,*lpmydata;
int main()
{
mydata md,md2,md3,md4,*pmd;
md.a = 100;
md2.a = 200;
md3.a = 300;
md4.a = 400;
queue_t myq = queue_create();
queue_t myq2 = queue_create();
qItemEmpty(&(md.item));
qItemEmpty(&(md2.item));
qItemEmpty(&(md3.item));
qItemEmpty(&(md4.item));
addItemToQueue(myq,&(md.item));
addItemToQueue(myq,&(md.item));
addItemToQueue(myq,&(md2.item));
addItemToQueue(myq,&(md2.item));
addItemToQueue(myq2,&(md4.item));
addItemToQueue(myq2,&(md3.item));
iterateEntryOfQueue(pmd,myq,mydata,item)
{
printf("%d\n",pmd->a);
}
printf("Hello world!\n");
delItemOfQueue(myq,&(md.item));
iterateEntryOfQueue(pmd,myq,mydata,item)
{
printf("%d\n",pmd->a);
}
queue_destroy(myq);
printf("Hello world!\n");
iterateEntryOfQueue(pmd,myq2,mydata,item)
{
printf("%d\n",pmd->a);
}
return 0;
}
还需创建 lib目录 Debug目录
Makefile文件
LOCALPATH=$(shell pwd)
LIBPATH=$(LOCALPATH)/lib
SRCPATH=$(LOCALPATH)/src
DEBUGPATH=$(LOCALPATH)/Debug
INCLUDEPATH=$(LOCALPATH)/include
run:doShareLib
gcc $(SRCPATH)/testqueueLib/main.c -o $(DEBUGPATH)/run -L$(LIBPATH) -lqueueLib
doShareLib:$(SRCPATH)/queueLib/queueLib.c
gcc -fPIC -shared $(SRCPATH)/queueLib/queueLib.c -o $(LIBPATH)/libqueueLib.so
cleanDebug:
rm $(DEBUGPATH)/*
cleanLib:
rm $(LIBPATH)/*
.PHONY clean:cleanDebug cleanLib
shell执行文件 run.sh
export LD_LIBRARY_PATH="./lib"
./Debug/run
目录结构