c链表模板

作者在 2010-10-17 01:23:34 发布以下内容
今天总算把所有的都测试完了,所以也将前一天的日志全改了,现在队列和链表的模板都已经写完了,希望有看到的大虾给点意见,批评的也行。这个最主要是用于嵌入式的,在PC编程就C语言还有一点价值,呵呵改天将堆操作管理和模拟栈的模板也发上来,但是不知道还要多久。
/*************************************************下面是配置文件*****************************************************************************************/
#ifndef __PL_C_DATA_STRUCT_CONFIG_H__
#define __PL_C_DATA_STRUCT_CONFIG_H__

/*
#define INT32U  unsigned int      
#define INT16U  unsigned short int
#define INT8U   unsigned char      
#define INT32S  int                
#define INT16S  short int          
#define INT8S   char              
#define BOOL    unsigned char      
#define TRUE    (INT8U)1
#define FALSE   (INT8U)0
*/
typedef unsigned int       INT32U;
typedef unsigned short int INT16U;
typedef unsigned char      INT8U;
typedef int                INT32S;
typedef short int          INT16S;
typedef char               INT8S;
typedef unsigned char      BOOL;
#define TRUE               (INT8U)1
#define FALSE              (INT8U)0

#define __INLINE_ENABLE     1//使能或失能内部部分函数的内联特性;
#ifndef __PL_inline_
#if (__INLINE_ENABLE==0)
#define __PL_inline_        //忽视内联修饰符;
#else
#define __PL_inline_  inline //定义内联修饰符;
#endif
#endif

#ifndef PL_NULL
#define PL_NULL (void*)0  //定义NULL宏
#endif

//------------------------------链表结构的基本宏设置---------------------------------//

#define _PL_CLIST_EN                  1//使能或失能链表;
#define _PL_CLIST_NODE_NUM_EN         1//使能或失能链表中节点序号功能;
#define _PL_CLIST_NODE_COUNT_EN       1//使能或失能链表中节点个数计算功能;
#define _PL_CLIST_MEMGET_EN           1//使能或失能链表中内存获取功能,此版本必须为>=1
#define _PL_CLIST_MEMFREE_EN          1//使能或失能链表中内存释放功能,此版本必须为>=1
#define _PL_CLIST_NAME_EN             1//使能或失能链表中名称的功能;

//-----------------------------------------------------------------------------------//

//------------------------------队列结构的基本宏设置---------------------------------//
#define _PL_CQUEUE_EN                  1//使能或失能队列
#define _PL_CQUEUE_NODE_COUNT_EN       1//使能或失能队列中计算节点个数功能
#define _PL_CQUEUE_MEMGET_EN           1//使能或失能队列中内存获取功能,此版本必须为>=1
#define _PL_CQUEUE_MEMFREE_EN          1//使能或失能队列中内存释放功能,此版本必须为>=1
#define _PL_CQUEUE_NAME_EN             1//使能或失能队列名称功能
//-----------------------------------------------------------------------------------//

#endif
/*********************************************************************************************************************************************************/








/*************************************************下面是链表头文件***************************************************************************************/
#ifndef ___PL__C__DATA__STRUCT__LIST__H__VERSION1_0__
#define ___PL__C__DATA__STRUCT__LIST__H__VERSION1_0__
#include"_PL_C_DATA_STRUCT_Config.h"
#if(_PL_CLIST_EN>=1)

#ifdef __cplusplus
extern "C" {       //确保编译器以C语言调用规则命名函数;
#endif


//---------------------------一下是函数名的宏定义,用户使用时直接用宏-----------------------------//
#define PLn_ListCreate      _PL_CList_Create
#define PLn_ListAddAt       _PL_CList_AddAt
#define PLn_ListAddTail     _PL_CList_AddTail
#define PLn_ListAddHead     _PL_CList_AddHead
#define PLn_ListRemoveAt    _PL_CList_RemoveAt
#define PLn_ListRemoveTail  _PL_CList_RemoveTail
#define PLn_ListRemoveHead  _PL_CList_RemoveHead
#define PLn_ListFind        _PL_CList_Find
#define PLn_ListGetAt       _PL_CList_GetAt
#define PLn_ListGetTail     _PL_CList_GetTail
#define PLn_ListGetHead     _PL_CList_GetHead
#define PLn_ListGetPre      _PL_CList_GetPre
#define PLn_ListGetNext     _PL_CList_GetNext
#define PLn_ListIsEmpty     _PL_CList_IsEmpty
#define PLn_ListGotoHead    _PL_CList_GotoHead
#define PLn_ListGotoTail    _PL_CList_GotoTail

#if((_PL_CLIST_EN>=1)&&(_PL_CLIST_NODE_NUM_EN>=1))
#define PLn_ListGetNodeNum  _PL_CList_GetNodeNum
#endif

#if ((_PL_CLIST_EN>=1)&&(_PL_CLIST_NODE_COUNT_EN>=1))
#define PLn_ListGetCount    _PL_CList_GetCount
#endif

#if((_PL_CLIST_EN>=1)&&(_PL_CLIST_NAME_EN>=1))
#define PLn_ListSetName   _PL_CList_SetName
#define PLn_ListGetName   _PL_CList_GetName
#endif
//------------------------------------------------------------------------------------------------//
typedef struct  PL_CList_Node{
    void *DataType; //链表所指向的数据类型
    struct PL_CList_Node*pre;  //指向前一个节点的指针;
    struct PL_CList_Node*next; //指向后一个节点的指针;
#if((_PL_CLIST_EN>=1)&&(_PL_CLIST_NODE_NUM_EN>=1))
    INT32U num;     //节点的序号;
#endif
}_PL_CList_Node;

typedef struct  {

_PL_CList_Node*_PL_CList_Node_Current;//指向当前工作节点的指针;

_PL_CList_Node*_PL_CList_Node_First;//指向头结点的指针;

_PL_CList_Node*_PL_CList_Node_Last;//指向尾结点的指针;

INT32U BytesofDataType;

#if ((_PL_CLIST_EN>=1)&&(_PL_CLIST_NODE_COUNT_EN>=1))
INT32U _PL_CList_Node_Count;//节点个数;
#endif

#if((_PL_CLIST_EN>=1)&&(_PL_CLIST_NAME_EN>=1))
char   _PL_CList_Name[20];  //链表名称;
#endif

//#if((_PL_CLIST_EN>=1)&&(_PL_CLIST_MEMGET_EN>=1))
void *(*_PL_CList_MemGet)(INT32U numofbytes); //堆内存的分配函数;
//#endif

#if((_PL_CLIST_EN>=1)&&(_PL_CLIST_MEMFREE_EN>=1))
void (*_PL_CList_MemFree)(void*ptr);//堆内存的释放函数;
#endif

}PL_CList;


BOOL _PL_CList_Create(PL_CList**plist,INT32U SizeofDataStruct,void *(*Malloc)(INT32U bytes),void (*Free)(void*ptr)); //创建链表

BOOL _PL_CList_AddAt(PL_CList*plist, void *UserDataType);//添加用户元素到列表当前位置;

BOOL _PL_CList_AddTail(PL_CList*plist,void*UserDataType);//添加元素到链表尾端;

BOOL _PL_CList_AddHead(PL_CList*plist,void*UserDataType);//添加元素到表头;

BOOL _PL_CList_RemoveAt(PL_CList*plist); //删除当前位置的元素

BOOL _PL_CList_RemoveTail(PL_CList*plist);//删除链表的尾端元素

BOOL _PL_CList_RemoveHead(PL_CList*plist);//删除链表头端的元素

void* _PL_CList_Find(PL_CList*plist,BOOL(*Compare)(void*pddata,const void*psdata),void*datatype);//查找具有某个属性的元素,不存在时返回NULL

void* _PL_CList_GetAt(PL_CList*plist);//这个函数失败时返回NULL

void* _PL_CList_GetNext(PL_CList*plist);//这个函数失败时返回NULL

void* _PL_CList_GetPre(PL_CList*plist);//这个函数失败时返回NULL

void* _PL_CList_GetHead(PL_CList*plist);//这个函数失败时返回NULL

void* _PL_CList_GetTail(PL_CList*plist);//这个函数失败时返回NULL

BOOL _PL_CList_IsEmpty(PL_CList*plist);//判断链表是否为空;

void* _PL_CList_GotoHead(PL_CList*plist);//将链表活动指针指向链表头。

void* _PL_CList_GotoTail(PL_CList*plist);//将链表活动指针指向链表尾。

#if((_PL_CLIST_EN>=1)&&(_PL_CLIST_NODE_NUM_EN>=1))
INT32U _PL_CList_GetNodeNum(PL_CList*plist);//获取当前节点的节点号,失败时返回0xff ff ff ff;
#endif

#if ((_PL_CLIST_EN>=1)&&(_PL_CLIST_NODE_COUNT_EN>=1))
INT32U _PL_CList_GetCount(PL_CList*plist);//获取链表元素个数;
#endif

#if((_PL_CLIST_EN>=1)&&(_PL_CLIST_NAME_EN>=1))
BOOL _PL_CList_SetName(PL_CList*plist,const char*pstr);
const char*_PL_CList_GetName(PL_CList*plist);
#endif

#ifdef __cplusplus
}
#endif

#endif
#endif
/*********************************************************************************************************************************************************/



/******************************************************下面是C文件*******************************************************************************************************/
/*******************************************文件说明******************************************************
*文件作者:彭亮
*作用:基于c语言的链表操作的模板
*版权声明: 常用数据结构C语言实现是由彭亮一个人完成,他具有对这些代码的最终解释权,
*任何个人和任何机构都可以自由地使用这些文档,但是不能以任何方式使得他人用这些文档
*时需要付费。同时你可以自由地修改和重新发布这些文件让他来满足你的实际需要,但是你
*不能以你的修改来阻止原来版本的发展。
*******************************************文件说明******************************************************/
#include"_P_NORMAL_List.h"
#include"_PL_C_DATA_STRUCT_Config.h"
/*********************************************************************************************************
BOOL _PL_CList_Create(PL_CList*plist,INT32U SizeofDataStruct,void *(*Malloc)(INT32U bytes),void (*Free)(void*ptr));
 //创建链表
BOOL _PL_CList_AddAt(PL_CList*plist, void *UserDataType);//添加用户元素到列表当前位置;
BOOL _PL_CList_AddTail(PL_CList*plist,void*UserDataType);//添加元素到链表尾端;
BOOL _PL_CList_AddHead(PL_CList*plist,void*UserDataType);//添加元素到表头;
BOOL _PL_CList_RemoveAt(PL_CList*plist); //删除当前位置的元素
BOOL _PL_CList_RemoveTail(PL_CList*plist);//删除链表的尾端元素
BOOL _PL_CList_RemoveHead(PL_CList*plist);//删除链表头端的元素
void * _PL_CList_Find(PL_CList*plist,BOOL(*Compare)(void*pddata,const void*psdata),void*datatype);
//查找具有某个属性的元素,不存在时返回NULL
void* _PL_CList_GetAt(PL_CList*plist);//这个函数失败时返回NULL
void* _PL_CList_GetNext(PL_CList*plist);//这个函数失败时返回NULL
void* _PL_CList_GetPre(PL_CList*plist);//这个函数失败时返回NULL
void* _PL_CList_GetHead(PL_CList*plist);//这个函数失败时返回NULL
void* _PL_CList_GetLast(PL_CList*plist);//这个函数失败时返回NULL
BOOL _PL_CList_IsEmpty(PL_CList*plist);//判断链表是否为空;
void* _PL_CList_GotoHead(PL_CList*plist);//将链表活动指针指向链表头。
void* _PL_CList_GotoTail(PL_CList*plist);//将链表活动指针指向链表尾。
INT32U _PL_CList_GetNodeNum(PL_CList*plist);//获取当前节点的节点号,失败时返回0xff ff ff ff;
#if ((_PL_CLIST_>=1)&&(_PL_CLIST_NODE_COUNT>=1))
INT32U _PL_CList_GetCount(PL_CList*plist);//获取链表元素个数;
#endif
********************************************************************************************************/
static void _PL_CList_CopyUserData(INT32U length,void*pdest,void*psrc);
/********************************************************************************************************
*作用:将用户的数据拷贝到堆里面去,交由链表程序管理;
*参数说明:
        plist
  指向一个你自己要用的链表基本信息的结构,它的定义可参见文件_PL_NORMAL_List.h
  调用前必须先声明一个(PL_CList*)类型指针,获取变量;
*       pdest
*       指向数据目的地址;
*       psrc
*       指向数据目的地址
********************************************************************************************************/
static void _PL_CList_CopyUserData(INT32U length,void*pdest,void*psrc)
{
 INT32U i;
 INT8U*pcdest=(INT8U*)pdest;
 INT8U*pcsrc=(INT8U*)psrc;
 for(i=0;i<length;i++)
 {
  *pcdest++=*pcsrc++;
 }
}
/********************************************************************************************************
作用:要使用C语言链表操作模板必须包含此函数用来初始化工作环境;
参数说明:
        plist
  指向一个你自己要用的链表基本信息的结构,它的定义可参见文件_PL_NORMAL_List.h
  调用前必须先声明一个(PL_CList*)类型指针,获取变量;
        SizeofDataStruct
  用户自定义的数据结构的大小;
        void *(*Malloc)(INT32U bytes)
  用户自定义的或者是系统的堆内存分配函数;
        void (*Free)(void*ptr)
  用户自定义的或者是系统的堆内存释放函数
********************************************************************************************************/
BOOL _PL_CList_Create(PL_CList**plist,INT32U SizeofDataStruct,void*(*Malloc)(INT32U bytes),void(*Free)(void*ptr))
{
 #if((_PL_CLIST_EN>=1)&&(_PL_CLIST_NAME_EN>=1))
    INT32U i;
    #endif
    (*plist)=(PL_CList*)Malloc(sizeof(PL_CList));
 if((*plist)==PL_NULL){return FALSE;}
    (*plist)->_PL_CList_Node_Current=PL_NULL;
 (*plist)->_PL_CList_Node_First  =PL_NULL;
 (*plist)->_PL_CList_Node_Last   =PL_NULL;
    (*plist)->BytesofDataType=SizeofDataStruct;
 #if ((_PL_CLIST_EN>=1)&&(_PL_CLIST_NODE_COUNT_EN>=1))
    (*plist)->_PL_CList_Node_Count=0;//节点个数;
    #endif
 #if((_PL_CLIST_EN>=1)&&(_PL_CLIST_NAME_EN>=1))
 for(i=0;i<20;i++)
    { (*plist)->_PL_CList_Name[i]=0;} //链表名称;
    #endif
 (*plist)->_PL_CList_MemGet=Malloc;
    (*plist)->_PL_CList_MemFree=Free;
   
 return TRUE;
}
/********************************************************************************************************
作用:要使用C语言链表操作模板必须包含此函数用来初始化工作环境;
参数说明:
        plist
  指向一个你自己要用的链表基本信息的结构,它的定义可参见文件_PL_NORMAL_List.h
  调用前必须先声明一个(PL_CList*)类型指针,获取变量;
********************************************************************************************************/
void _PL_CList_Destroy(PL_CList*plist)
{
 if(!_PL_CList_RemoveAll(plist)){return ;}
 plist->_PL_CList_MemFree(plist);
 return;
}

/********************************************************************************************************
*作用:将一个节点添加到链表指示指针的当前位置,当前位置及其后面的节点要在当前位置之后;
*参数说明:
*  plist
*  指向一个你自己要用的链表基本信息的结构,它的定义可参见文件_PL_NORMAL_List.h
*  调用前必须先声明一个(PL_CList*)类型指针,获取变量;
*       UserDataType
*       指向用户自己的数据结构的指针,用户必须自己为它分配内存。
********************************************************************************************************/
BOOL _PL_CList_AddAt(PL_CList*plist, void *UserDataType)
{
  _PL_CList_Node*plistnode;
    
  if(UserDataType==PL_NULL){return FALSE;}
     plistnode=(_PL_CList_Node*)(plist->_PL_CList_MemGet(sizeof(_PL_CList_Node)));
  if(plistnode==PL_NULL){return FALSE;}
    
  plistnode->DataType=plist->_PL_CList_MemGet(plist->BytesofDataType);
  if(plistnode->DataType==PL_NULL){plist->_PL_CList_MemFree(plistnode);return FALSE;}
     _PL_CList_CopyUserData(plist->BytesofDataType,plistnode->DataType,UserDataType);
 // plistnode->DataType=UserDataType;//将数据结构赋值;
  if(_PL_CList_IsEmpty(plist))//链表为空时,
  {
   plist->_PL_CList_Node_Current=plistnode;
   plist->_PL_CList_Node_First=plistnode;
   plist->_PL_CList_Node_Last=plistnode;
   plistnode->next=PL_NULL;
   plistnode->pre=PL_NULL;
#if((_PL_CLIST_EN>=1)&&(_PL_CLIST_NODE_NUM_EN_EN>=1))
   plistnode->num=0;//节点索引从零开始
#endif
#if ((_PL_CLIST_EN>=1)&&(_PL_CLIST_NODE_COUNT_EN>=1))
          plist->_PL_CList_Node_Count++;//节点个数加一;
#endif
   return TRUE;
  }
  else if(plist->_PL_CList_Node_Current==plist->_PL_CList_Node_First)//当当前节点是头节时;
  {
   plistnode->pre=PL_NULL;
   plistnode->next=plist->_PL_CList_Node_Current;
   plist->_PL_CList_Node_Current->pre=plistnode;
         plist->_PL_CList_Node_First=plistnode;//更改第一个节点;
   plist->_PL_CList_Node_Current=plistnode;//更改当前节点;
  }
     else
  {
     plist->_PL_CList_Node_Current->pre->next=plistnode;
     plistnode->pre=plist->_PL_CList_Node_Current->pre;
     plistnode->next=plist->_PL_CList_Node_Current;
     plist->_PL_CList_Node_Current->pre=plistnode;
     plist->_PL_CList_Node_Current=plistnode;
  }
#if((_PL_CLIST_>=1)&&(_PL_CLIST_NODE_NUM_EN>=1))
  plist->_PL_CList_Node_Current->num=plist->_PL_CList_Node_Current->next->num;
     plistnode=plist->_PL_CList_Node_Current->next;
  while(plistnode!=PL_NULL)
 {
  plistnode->num++;
  plistnode=plistnode->next;
 }
#endif
#if ((_PL_CLIST_EN>=1)&&(_PL_CLIST_NODE_COUNT_EN>=1))
    plist->_PL_CList_Node_Count++;//节点个数加一;
#endif
 return TRUE;
}

/********************************************************************************************************
*作用:将一个节点添加到链表末尾处;
*参数说明:
*  plist
*  指向一个你自己要用的链表基本信息的结构,它的定义可参见文件_PL_NORMAL_List.h
*  调用前必须先声明一个(PL_CList*)类型指针,获取变量;
*       UserDataType
*       指向用户自己的数据结构的指针,用户必须自己为它分配内存。
********************************************************************************************************/
BOOL _PL_CList_AddTail(PL_CList*plist,void*UserDataType)
{
     _PL_CList_Node*plistnode;
  if(plist==PL_NULL){return FALSE;}
  if(UserDataType==PL_NULL){return FALSE;}
     plistnode=(_PL_CList_Node*)(plist->_PL_CList_MemGet(sizeof(_PL_CList_Node)));
  if(plistnode==PL_NULL){return FALSE;}
  plistnode->DataType=plist->_PL_CList_MemGet(plist->BytesofDataType);
  if(plistnode->DataType==PL_NULL){plist->_PL_CList_MemFree(plistnode);return FALSE;}
     _PL_CList_CopyUserData(plist->BytesofDataType,plistnode->DataType,UserDataType);
  //plistnode->DataType=UserDataType;//将数据结构赋值;
  if(_PL_CList_IsEmpty(plist))//链表为空时
  {
   plist->_PL_CList_Node_Current=plistnode;
   plist->_PL_CList_Node_First=plistnode;
   plist->_PL_CList_Node_Last=plistnode;
   plistnode->next=PL_NULL;
   plistnode->pre=PL_NULL;
#if((_PL_CLIST_EN>=1)&&(_PL_CLIST_NODE_NUM_EN>=1))
   plistnode->num=0;//节点索引从零开始
#endif
   //return TRUE;
  }
  else
  {
         plist->_PL_CList_Node_Last->next=plistnode;
   plistnode->pre=plist->_PL_CList_Node_Last;
         plistnode->next=PL_NULL;
#if((_PL_CLIST_EN>=1)&&(_PL_CLIST_NODE_NUM_EN>=1))
   plistnode->num=plist->_PL_CList_Node_Last->num+1;//节点索引从零开始
#endif
   plist->_PL_CList_Node_Last=plistnode;
  }
#if ((_PL_CLIST_EN>=1)&&(_PL_CLIST_NODE_COUNT_EN>=1))
         plist->_PL_CList_Node_Count++;//节点个数加一;
#endif
  return TRUE;
}
/********************************************************************************************************
*作用:将一个节点添加到链表起始处;
*参数说明:
*  plist
*  指向一个你自己要用的链表基本信息的结构,它的定义可参见文件_PL_NORMAL_List.h
*  调用前必须先声明一个(PL_CList*)类型指针,获取变量;
*       UserDataType
*       指向用户自己的数据结构的指针,用户必须自己为它分配内存。
********************************************************************************************************/
BOOL _PL_CList_AddHead(PL_CList*plist,void*UserDataType)
{
     _PL_CList_Node*plistnode;
  if(plist==PL_NULL){return FALSE;}
  if(UserDataType==PL_NULL){return FALSE;}
     plistnode=(_PL_CList_Node*)(plist->_PL_CList_MemGet(sizeof(_PL_CList_Node)));
  if(plistnode==PL_NULL){return FALSE;}

  plistnode->DataType=plist->_PL_CList_MemGet(plist->BytesofDataType);
  if(plistnode->DataType==PL_NULL){plist->_PL_CList_MemFree(plistnode);return FALSE;}
     _PL_CList_CopyUserData(plist->BytesofDataType,plistnode->DataType,UserDataType);
  //plistnode->DataType=UserDataType;//将数据结构赋值;
  if(_PL_CList_IsEmpty(plist))//链表为空时
  {
   plist->_PL_CList_Node_Current=plistnode;
   plist->_PL_CList_Node_First=plistnode;
   plist->_PL_CList_Node_Last=plistnode;
   plistnode->next=PL_NULL;
   plistnode->pre=PL_NULL;
  }
  else
  {
         plistnode->pre=PL_NULL;
   plistnode->next=plist->_PL_CList_Node_First;
   plist->_PL_CList_Node_First->pre=plistnode;
   plist->_PL_CList_Node_First=plistnode;
  }
#if((_PL_CLIST_EN>=1)&&(_PL_CLIST_NODE_NUM_EN>=1))
  plistnode->num=0;//节点索引从零开始
  plistnode=plist->_PL_CList_Node_First->next;
  while(plistnode!=PL_NULL)
  {
   plistnode->num++;
   plistnode=plistnode->next;
  }
#endif
#if ((_PL_CLIST_EN>=1)&&(_PL_CLIST_NODE_COUNT_EN>=1))
          plist->_PL_CList_Node_Count++;//节点个数加一;
#endif
     return TRUE;
}

/********************************************************************************************************
*作用:将当前节点删除;
*参数说明:
*  plist
*  指向一个你自己要用的链表基本信息的结构,它的定义可参见文件_PL_NORMAL_List.h
*  调用前必须先声明一个(PL_CList*)类型指针,获取变量;
********************************************************************************************************/
BOOL _PL_CList_RemoveAt(PL_CList*plist)
{
 _PL_CList_Node*plistnode;
    plistnode=plist->_PL_CList_Node_Current;
 if(_PL_CList_IsEmpty(plist))//链表为空时
 {
  return FALSE;
 }
 else if(plist->_PL_CList_Node_First==plist->_PL_CList_Node_Last)//链表只有一个节点;
 {
  plist->_PL_CList_Node_Current=PL_NULL;
  plist->_PL_CList_Node_First=PL_NULL;
  plist->_PL_CList_Node_Last=PL_NULL; 
  #if ((_PL_CLIST_EN>=1)&&(_PL_CLIST_NODE_COUNT_EN>=1))
        plist->_PL_CList_Node_Count--;//节点个数减一;
        #endif
       
  plist->_PL_CList_MemFree(plistnode->DataType);
        plist->_PL_CList_MemFree(plistnode);
  return TRUE;
 }
 else if(plist->_PL_CList_Node_Current==plist->_PL_CList_Node_First)//当前是头结点;
 {
  plist->_PL_CList_Node_First=plist->_PL_CList_Node_Current->next;
  plist->_PL_CList_Node_First->pre=PL_NULL;
  plist->_PL_CList_Node_Current=plist->_PL_CList_Node_Current->next;
 }
 else if(plist->_PL_CList_Node_Current==plist->_PL_CList_Node_Last)//当前是末节点;
 {
  plist->_PL_CList_Node_Last=plist->_PL_CList_Node_Current->pre;
  plist->_PL_CList_Node_Last->next=PL_NULL;
  plist->_PL_CList_Node_Current=plist->_PL_CList_Node_Current->pre;
 }
 else
 {
  plist->_PL_CList_Node_Current->pre->next=plist->_PL_CList_Node_Current->next;
  plist->_PL_CList_Node_Current->next->pre=plist->_PL_CList_Node_Current->pre;
        plist->_PL_CList_Node_Current=plist->_PL_CList_Node_Current->next;
 }
  plist->_PL_CList_MemFree(plistnode->DataType);//先将用户内存释放;
  plist->_PL_CList_MemFree(plistnode);
#if((_PL_CLIST_EN>=1)&&(_PL_CLIST_NODE_NUM_EN>=1))
  plistnode=plist->_PL_CList_Node_Current;
  while(plistnode!=PL_NULL)
  {
   plistnode->num--;
   plistnode=plistnode->next;
  }
#endif
#if ((_PL_CLIST_EN>=1)&&(_PL_CLIST_NODE_COUNT_EN>=1))
     plist->_PL_CList_Node_Count--;//节点个数减一;
#endif
  return TRUE;
}
/********************************************************************************************************
*作用:将链表尾节点删除;
*参数说明:
*  plist
*  指向一个你自己要用的链表基本信息的结构,它的定义可参见文件_PL_NORMAL_List.h
*  调用前必须先声明一个(PL_CList*)类型指针,获取变量;
********************************************************************************************************/
BOOL _PL_CList_RemoveTail(PL_CList*plist)
{
    _PL_CList_Node*plistnode;
    plistnode=plist->_PL_CList_Node_Last;
 if(_PL_CList_IsEmpty(plist))//链表为空时
 {
  return FALSE;
 }
    else if(plist->_PL_CList_Node_First==plist->_PL_CList_Node_Last)
 {
  plist->_PL_CList_Node_Current=PL_NULL;
  plist->_PL_CList_Node_First=PL_NULL;
  plist->_PL_CList_Node_Last=PL_NULL; 
 }
 else
 {
  if(plist->_PL_CList_Node_Current==plist->_PL_CList_Node_Last)
  {
     plist->_PL_CList_Node_Current=plist->_PL_CList_Node_Last->pre;
  }
        plist->_PL_CList_Node_Last=plist->_PL_CList_Node_Last->pre;
  plist->_PL_CList_Node_Last->next=PL_NULL;
 }
#if ((_PL_CLIST_EN>=1)&&(_PL_CLIST_NODE_COUNT_EN>=1))
    plist->_PL_CList_Node_Count--;//节点个数减一;
#endif
    plist->_PL_CList_MemFree(plistnode->DataType);
    plist->_PL_CList_MemFree(plistnode);
    return TRUE;
}
/********************************************************************************************************
*作用:将链表头节点删除;
*参数说明:
*  plist
*  指向一个你自己要用的链表基本信息的结构,它的定义可参见文件_PL_NORMAL_List.h
*  调用前必须先声明一个(PL_CList*)类型指针,获取变量;
********************************************************************************************************/
BOOL _PL_CList_RemoveHead(PL_CList*plist)
{
 _PL_CList_Node*plistnode;
    plistnode=plist->_PL_CList_Node_First;
 if(_PL_CList_IsEmpty(plist))//链表为空时
 {
  return FALSE;
 }
    else if(plist->_PL_CList_Node_First==plist->_PL_CList_Node_Last)//链表只有一个节点时
 {
  plist->_PL_CList_Node_Current=PL_NULL;
  plist->_PL_CList_Node_First=PL_NULL;
  plist->_PL_CList_Node_Last=PL_NULL; 
 }
 else
 {
  if(plist->_PL_CList_Node_Current==plist->_PL_CList_Node_First)
  {
     plist->_PL_CList_Node_Current=plist->_PL_CList_Node_First->next;
  }
  plist->_PL_CList_Node_First=plist->_PL_CList_Node_First->next;
  plist->_PL_CList_Node_First->pre=PL_NULL;
 }
#if ((_PL_CLIST_EN>=1)&&(_PL_CLIST_NODE_COUNT_EN>=1))
    plist->_PL_CList_Node_Count--;//节点个数减一;
#endif
    plist->_PL_CList_MemFree(plistnode->DataType);
    plist->_PL_CList_MemFree(plistnode);
#if((_PL_CLIST_>=1)&&(_PL_CLIST_NODE_NUM_EN>=1))
  plistnode=plist->_PL_CList_Node_First;
  while(plistnode!=PL_NULL)
  {
   plistnode->num--;
   plistnode=plistnode->next;
  }
#endif
  return TRUE;
}
/********************************************************************************************************
*作用:将链表所有的元素删除,但是链表本身还在,只是变成了空链表;
*参数说明:
*  plist
*  指向一个你自己要用的链表基本信息的结构,它的定义可参见文件_PL_NORMAL_List.h
*  调用前必须先声明一个(PL_CList*)类型指针,获取变量;
********************************************************************************************************/
BOOL _PL_CList_RemoveAll(PL_CList*plist)
{
 if(plist==PL_NULL){return FALSE;}
    plist->_PL_CList_Node_Current=plist->_PL_CList_Node_First;
 while(plist->_PL_CList_Node_Current!=PL_NULL)
 {
  plist->_PL_CList_MemFree(plist->_PL_CList_Node_Current->DataType);
  plist->_PL_CList_Node_Current=plist->_PL_CList_Node_Current->next;
  plist->_PL_CList_MemFree(plist->_PL_CList_Node_Current->pre);
 }
 plist->_PL_CList_Node_Current=PL_NULL;
 plist->_PL_CList_Node_First=PL_NULL;
 plist->_PL_CList_Node_Last=PL_NULL;
 
#if ((_PL_CLIST_>=1)&&(_PL_CLIST_NODE_COUNT>=1))
 plist->_PL_CList_Node_Count=0;
#endif
 return TRUE;
}
/********************************************************************************************************
*作用:获取当前节点的指针;
*参数说明:
*  plist
*  指向一个你自己要用的链表基本信息的结构,它的定义可参见文件_PL_NORMAL_List.h
*  调用前必须先声明一个(PL_CList*)类型指针,获取变量;
*返回参数:
*       返回参数强制类型转换成(UserDataType*)时它指向一个用户自定义元素结构的指针;
*失败时:返回PL_NULL
********************************************************************************************************/
void* _PL_CList_GetAt(PL_CList*plist)
{
 if(!_PL_CList_IsEmpty(plist))
 {
    return plist->_PL_CList_Node_Current->DataType;
 }
 return PL_NULL;
}
/********************************************************************************************************
*作用:获取当前节点的下一个节点,并且将当前节点后移一个节点
*参数说明:
*  plist
*  指向一个你自己要用的链表基本信息的结构,它的定义可参见文件_PL_NORMAL_List.h
*  调用前必须先声明一个(PL_CList*)类型指针,获取变量;
*返回参数:
*       返回参数强制类型转换成(UserDataType*)时它指向一个用户自定义元素结构的指针;
*失败时:返回PL_NULL
********************************************************************************************************/
void* _PL_CList_GetNext(PL_CList*plist)
{
 if((plist->_PL_CList_Node_Current==PL_NULL)||(plist->_PL_CList_Node_Current->next==PL_NULL))
 {
  return PL_NULL;
 }
 else
 {
  plist->_PL_CList_Node_Current=plist->_PL_CList_Node_Current->next;
 }
 return plist->_PL_CList_Node_Current->DataType;
}
/********************************************************************************************************
*作用:获取当前节点的前一个节点,并且将当前节点前移一个节点
*参数说明:
*  plist
*  指向一个你自己要用的链表基本信息的结构,它的定义可参见文件_PL_NORMAL_List.h
*  调用前必须先声明一个(PL_CList*)类型指针,获取变量;
*返回参数:
*       返回参数强制类型转换成(UserDataType*)时它指向一个用户自定义元素结构的指针;
*失败时:返回PL_NULL
********************************************************************************************************/
void* _PL_CList_GetPre(PL_CList*plist)
{
 if((plist->_PL_CList_Node_Current==PL_NULL)||(plist->_PL_CList_Node_Current->pre==PL_NULL))
 {
  return PL_NULL;
 }
 else
 {
  plist->_PL_CList_Node_Current=plist->_PL_CList_Node_Current->pre;
 }
 return plist->_PL_CList_Node_Current->DataType;
}
/********************************************************************************************************
*作用:获取链表头节点指针;
*参数说明:
*  plist
*  指向一个你自己要用的链表基本信息的结构,它的定义可参见文件_PL_NORMAL_List.h
*  调用前必须先声明一个(PL_CList*)类型指针,获取变量;
*返回参数:
*       返回参数强制类型转换成(UserDataType*)时它指向一个用户自定义元素结构的指针;
*失败时:返回PL_NULL
********************************************************************************************************/
void* _PL_CList_GetHead(PL_CList*plist)
{
 if(!_PL_CList_IsEmpty(plist))
 {
     return plist->_PL_CList_Node_First->DataType;
 }
 return PL_NULL;
}
/********************************************************************************************************
*作用:获取链表尾节点指针;
*参数说明:
*  plist
*  指向一个你自己要用的链表基本信息的结构,它的定义可参见文件_PL_NORMAL_List.h
*  调用前必须先声明一个(PL_CList*)类型指针,获取变量;
*返回参数:
*       返回参数强制类型转换成(UserDataType*)时它指向一个用户自定义元素结构的指针;
*失败时:返回PL_NULL
********************************************************************************************************/
void* _PL_CList_GetTail(PL_CList*plist)
{
 if(!_PL_CList_IsEmpty(plist))
 {
     return plist->_PL_CList_Node_Last->DataType;
 }
 return PL_NULL;
}
/********************************************************************************************************
*作用:获取链表尾节点指针;
*参数说明:
*  plist
*  指向一个你自己要用的链表基本信息的结构,它的定义可参见文件_PL_NORMAL_List.h
*  调用前必须先声明一个(PL_CList*)类型指针,获取变量;
*返回参数:当链表为空时返回TRUE,非空时返回FALSE;
********************************************************************************************************/
BOOL _PL_CList_IsEmpty(PL_CList*plist)
{
 if((plist->_PL_CList_Node_First==PL_NULL)||(plist->_PL_CList_Node_Last==PL_NULL)\
  ||(plist->_PL_CList_Node_Current==PL_NULL))
 {
  return TRUE;
 }
 else
 {
     return FALSE;
 }
}
/********************************************************************************************************
*作用:取得当前节点的序号;
*参数说明:
*  plist
*  指向一个你自己要用的链表基本信息的结构,它的定义可参见文件_PL_NORMAL_List.h
*  调用前必须先声明一个(PL_CList*)类型指针,获取变量;
*返回参数:返回当前节点的节点号,失败时返回0xff ff ff ff;,索引号从零开始;
********************************************************************************************************/
#if((_PL_CLIST_EN>=1)&&(_PL_CLIST_NODE_NUM_EN>=1))
INT32U _PL_CList_GetNodeNum(PL_CList*plist)
{
 if(plist->_PL_CList_Node_Current==PL_NULL)
 {
  return 0xffffffffU;
 }
 else
 {
     return plist->_PL_CList_Node_Current->num;
 }
}
#endif
/********************************************************************************************************
*作用:取得链表节点的个数;
*参数说明:
*  plist
*  指向一个你自己要用的链表基本信息的结构,它的定义可参见文件_PL_NORMAL_List.h
*  调用前必须先声明一个(PL_CList*)类型指针,获取变量;
*返回参数:返回链表的节点数,0表示链表空
********************************************************************************************************/
#if ((_PL_CLIST_EN>=1)&&(_PL_CLIST_NODE_COUNT_EN>=1))
INT32U _PL_CList_GetCount(PL_CList*plist)
{
 return plist->_PL_CList_Node_Count;
}
#endif
#if((_PL_CLIST_EN>=1)&&(_PL_CLIST_NAME_EN>=1))
/********************************************************************************************************
*作用:设置链表的名称;
*参数说明:
*  plist
*  指向一个你自己要用的链表基本信息的结构,它的定义可参见文件_PL_NORMAL_List.h
*  调用前必须先声明一个(PL_CList*)类型指针,获取变量;
*返回参数:设置成功返回TRUE,否则返回FALSE;
********************************************************************************************************/
BOOL _PL_CList_SetName(PL_CList*plist,const char*pstr)
{
 INT8U i=0;
 char*pt;
 pt= plist->_PL_CList_Name;
 while(*pstr!=0)
 {
  if(++i>=18){return FALSE;}
  *pt++=*pstr++;
 
 }
 *pt=0;
 return TRUE;
}
/********************************************************************************************************
*作用:取得链表的名称;
*参数说明:
*  plist
*  指向一个你自己要用的链表基本信息的结构,它的定义可参见文件_PL_NORMAL_List.h
*  调用前必须先声明一个(PL_CList*)类型指针,获取变量;
*返回参数:返回指向链表名称的指针;
********************************************************************************************************/
const char*_PL_CList_GetName(PL_CList*plist)
{
 return plist->_PL_CList_Name;
}
#endif
/********************************************************************************************************
*作用:  将链表的活动指针指向链表头,并且返回首指针;
*参数说明:
*  plist
*  指向一个你自己要用的链表基本信息的结构,它的定义可参见文件_PL_NORMAL_List.h
*  调用前必须先声明一个(PL_CList*)类型指针,获取变量;
*返回参数:
*       返回参数强制类型转换成(UserDataType*)时它指向一个用户自定义元素结构的指针;
*失败时:返回PL_NULL
********************************************************************************************************/
void* _PL_CList_GotoHead(PL_CList*plist)
{
 if(_PL_CList_IsEmpty(plist)){ return PL_NULL;}
 plist->_PL_CList_Node_Current=plist->_PL_CList_Node_First;
 return plist->_PL_CList_Node_Current->DataType;
}
/********************************************************************************************************
*作用:  将链表的活动指针指向链表尾,并且返回尾指针;
*参数说明:
*  plist
*  指向一个你自己要用的链表基本信息的结构,它的定义可参见文件_PL_NORMAL_List.h
*  调用前必须先声明一个(PL_CList*)类型指针,获取变量;
*返回参数:
*       返回参数强制类型转换成(UserDataType*)时它指向一个用户自定义元素结构的指针;
*失败时:返回PL_NULL
********************************************************************************************************/
void* _PL_CList_GotoTail(PL_CList*plist)
{
 if(_PL_CList_IsEmpty(plist)){ return PL_NULL; }
 plist->_PL_CList_Node_Current=plist->_PL_CList_Node_Last;
 return plist->_PL_CList_Node_Current->DataType;
}
/********************************************************************************************************
*作用:查找具有某一个属性的节点,比较函数由用户决定。
*参数说明:
*          plist
*     指向一个你自己要用的链表基本信息的结构,它的定义可参见文件_PL_NORMAL_List.h
*        调用前必须先声明一个(PL_CList*)类型指针,获取变量;
*          BOOL(*Compare)(void*pddata,const void*psdata)
*          指向一个函数的指针,该函数具有两个参数void*pddata是指向链表中的节点中用户数据结构,void*pdata2
*          是指向用户自己确定的用户的数据。匹配成功时返回TRUE,否则返回FALSE;
*          void*datatype
*          指向用户自定义的比较函数的参数类型的参数的指针。
********************************************************************************************************/
void* _PL_CList_Find(PL_CList*plist,BOOL(*Compare)(void*pdata1,const void*pdata2),void*datatype)
{
    plist->_PL_CList_Node_Current=plist->_PL_CList_Node_First;
 while(plist->_PL_CList_Node_Current!=PL_NULL)
 {
  if(Compare(plist->_PL_CList_Node_Current->DataType,datatype)==TRUE)
  {
   return plist->_PL_CList_Node_Current->DataType;
  }
  plist->_PL_CList_Node_Current=plist->_PL_CList_Node_Current->next;
 }
 return PL_NULL; 
}
/************************************队列的头文件********************************************/
#ifndef ___PL__C__DATA__STRUCT__QUEUE__H__VERSION1_0__
#define ___PL__C__DATA__STRUCT__QUEUE__H__VERSION1_0__
#include"_PL_C_DATA_STRUCT_Config.h"
#if (_PL_CQUEUE_EN>=1)
#ifdef __cplusplus
extern "C" {       //确保编译器以C语言调用规则命名函数;
#endif
//------------------------下面是函数接口的宏定义--------------------------//
#define PLn_QueueCreate   _PL_CQueue_Create
#define PLn_QueueIn       _PL_CQueue_In
#define PLn_QueueOut      _PL_CQueue_Out
#define PLn_QueueClear    _PL_CQueue_Clear
#define PLn_QueueDestroy  _PL_CQueue_Destroy
#define PLn_QueueIsEmpty  _PL_CQueue_IsEmpty
#if((_PL_CQUEUE_EN>=1)&&(_PL_CQUEUE_NAME_EN>=1))
#define PLn_QueueGetName  _PL_CQueue_GetName
#define PLn_QueueSetName  _PL_CQueue_SetName
#endif
#if ((_PL_CQUEUE_EN>=1)&&(_PL_CQUEUE_NODE_COUNT_EN>=1))
#define PLn_QueueGetCount _PL_CQueue_GetCount
#endif
//------------------------------------------------------------------------//
typedef struct  PL_CQueue_Node{
 void *DataType; //链表所指向的数据类型
 // struct PL_CQueue_Node*pre;  //指向前一个节点的指针;
 struct PL_CQueue_Node*next; //指向后一个节点的指针;
}_PL_CQueue_Node;
typedef struct {
  _PL_CQueue_Node*_PL_CQueue_Head;//指向头结点的指针;
   _PL_CQueue_Node*_PL_CQueue_Tail;//指向尾结点的指针;
  INT32U BytesofDataType;
#if ((_PL_CQUEUE_EN>=1)&&(_PL_CQUEUE_NODE_COUNT_EN>=1))
  INT32U _PL_CQueue_Node_Count;//节点个数;
#endif
#if((_PL_CQUEUE_EN>=1)&&(_PL_CQUEUE_NAME_EN>=1))
  char   _PL_CQueue_Name[20];  //链表名称;
#endif
#if((_PL_CQUEUE_EN>=1)&&(_PL_CQUEUE_MEMGET_EN>=1))
  void *(*_PL_CQueue_MemGet)(INT32U numofbytes); //堆内存的分配函数;
#endif
#if((_PL_CQUEUE_EN>=1)&&(_PL_CQUEUE_MEMFREE_EN>=1))
  void (*_PL_CQueue_MemFree)(void*ptr);//堆内存的释放函数;
#endif
}PL_CQueue;
 

BOOL _PL_CQueue_Create(PL_CQueue**pqueue,INT32U SizeofDataStruct,void *(*Malloc)(INT32U bytes),void (*Free)(void*ptr)); //创建队列;
BOOL _PL_CQueue_In(PL_CQueue*pqueue,void*datatype);//进入队列;
BOOL _PL_CQueue_Out(PL_CQueue*pqueue,void*datatype);//离开队列;
BOOL _PL_CQueue_IsEmpty(P
默认分类 | 阅读 697 次
文章评论,共0条
游客请输入验证码