一个双向链表的实例,把数据封装在结构中的data指针中,是的链表和数据各自独立。
.h file
#ifndef ListOper_H
#define ListOper_H
#include<malloc.h>
#include<stdlib.h>
//--------------data结构体-------------------------
typedef struct struct_data {
int id;
char name[20];
char src[80];
char dst[80];
}S_XXX;
//--------------data结构体-------------------------
/*数据置零*/
void ZeroXXX(S_XXX *pData);
/*数据拷贝,每次使用前调用ZeroCDR函数,确保字符串以nul结束*/
void CopyXXX(S_XXX *pData, S_XXX *pSrc);
/*构造cdr数据:pData为NULL时,各成员初始化为空;非NULL时,拷贝pData。*/
S_XXX * MakeXXX(S_XXX *pData);
//--------------List结构体-------------------------
typedef void * Item;
typedef struct Node * PNode;
/*定义节点类型*/
struct Node
{
Item data; //data; /*数据域*/
PNode previous; /*指向前驱*/
PNode next; /*指向后继*/
};
/*定义链表类型*/
typedef struct
{
PNode head; /*指向头节点*/
PNode tail; /*指向尾节点*/
int size; /*指向链表节点个数,不包含head节点*/
}DList;
//--------------List结构体-------------------------
/******************************Oper Start*****************************/
/*分配值为i的节点,并返回节点地址*/
PNode MakeNode(Item data, int flag);
/*释放p所指的节点*/
void FreeNode(PNode p);
/*构造一个空的list双向链表*/
DList* InitList(int flag);
/*摧毁一个双向链表*/
void DestroyList(DList *plist);
/*将一个链表置为空表,释放原链表节点空间*/
void ClearList(DList *plist);
/*返回头节点地址*/
PNode GetHead(DList *plist);
/*返回尾节点地址*/
PNode GetTail(DList *plist);
/*返回链表大小*/
int GetSize(DList *plist);
/*返回p的直接后继位置*/
PNode GetNext(DList *plist, PNode p);
/*返回p的直接前驱位置,前驱为head则指向tail*/
PNode GetPrevious(DList *plist, PNode p);
/*返回p的直接前驱位置*/
PNode GetPrevious2(DList *plist, PNode p);
/*将pnode所指节点插入第一个节点之前*/
PNode InsFirst(DList *plist,PNode pnode);
/*将链表第一个节点删除并返回其地址*/
PNode DelFirst(DList *plist);