You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
108 lines
3.9 KiB
C
108 lines
3.9 KiB
C
/************************************************************************
|
|
*
|
|
* 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 */
|