/************************************************************************ * * Copyright (C) 2003-2004 * Shenzhen SCADA Control Technology Co., Ltd. * All rights reserved. * * 双链表 * * 创建日期: 2004/01/10 * * 摘自Windoes $(DDKPATH)/inc/ntdef.h和$(DDKPATH)/inc/ddk/ntddk.h * * $Id: list_entry.h,v 1.1.1.1 2006/07/05 07:31:43 jehu Exp $ * ***********************************************************************/ #ifndef __LIST_ENTRY_H__SKLJFALKJZLJVADFHOPSHVPZIOXJHCVOIPADFDFNXVCQWEDAH #define __LIST_ENTRY_H__SKLJFALKJZLJVADFHOPSHVPZIOXJHCVOIPADFDFNXVCQWEDAH /*! * 双向链表结构定义, 可以用链表的头或者链表成员. */ typedef struct tag_list_entry_t { struct tag_list_entry_t * flink; /*!< 指向链表元素的前驱元素 */ struct tag_list_entry_t * blink; /*!< 指向链表元素的后继元素 */ } list_entry_t; typedef list_entry_t * plist_entry_t; typedef list_entry_t ** pplist_entry_t; /* * 下面是双向链表的操纵例程函数 * * +---------------------------+-----------------------------------------------------+ * | Initialize_list_head | 初始化链表头中的list_entry_t结构 | * +---------------------------+-----------------------------------------------------+ * | is_list_empty | 判断链表是否为空 | * +---------------------------+-----------------------------------------------------+ * | remove_head_list | 从双向链表的头部移取一个链表元素--与链表脱离链接关系| * +---------------------------+-----------------------------------------------------+ * | remove_tail_list | 从双向链表的尾部移取一个链表元素--与链表脱离链接关系| * +---------------------------+-----------------------------------------------------+ * | remove_entry_list | 从双向链表中移取指定的链表元素--与链表脱离链接关系 | * +---------------------------+-----------------------------------------------------+ * | insert_tail_list | 在起始处插入一个元素 | * +---------------------------+-----------------------------------------------------+ * | insert_head_list | 在结尾处插入一个元素 | * +---------------------------+-----------------------------------------------------+ * | CONTAINING_RECORD | 由链表元素指针反演出链表元素所包含的元素指针 | * +---------------------------+-----------------------------------------------------+ * */ /* * 由链表元素指针反演出链表元素所包含的元素指针 */ #ifdef CONTAINING_RECORD #undef CONTAINING_RECORD #endif #define CONTAINING_RECORD(_addr, _type, _field) ((_type *)((char *)(_addr) - (char *)(&((_type *)0)->_field))) /* * 初始化双向链表 * * \param plist_head 指向链表的头 */ void Initialize_list_head ( list_entry_t * plist_head ); /* * 判断双向链表是否为空 * * \retval 0 空链表 * \retval 非0 空链表 */ int is_list_empty ( list_entry_t * plist_head ); /* * 从双向链表的头部移取一个链表元素--与链表脱离链接关系 */ list_entry_t * remove_head_list ( list_entry_t * plist_head ); /* * 从双向链表的尾部移取一个链表元素--与链表脱离链接关系 */ list_entry_t * remove_tail_list ( list_entry_t * plist_head ); /* * 从双向链表中移取制定的链表元素--与链表脱离链接关系 */ void remove_entry_list ( list_entry_t * pEntry); /* * 将一个链表元素从尾部插入到双向链表中 */ void insert_tail_list ( list_entry_t * plist_head, list_entry_t * pEntry ); /* * 将一个链表元素从头部插入到双向链表中 */ void insert_head_list ( list_entry_t * plist_head, list_entry_t * pEntry); #endif /* __LIST_ENTRY_H__SKLJFALKJZLJVADFHOPSHVPZIOXJHCVOIPADFDFNXVCQWEDAH */