📄 linkedlist.h
字号:
/////////////////////////////////////////////////////////////////////////////// Copyright (c) 2000-2003 Intel Corporation // All rights reserved. //// Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: //// * Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // * Neither name of Intel Corporation nor the names of its contributors // may be used to endorse or promote products derived from this software // without specific prior written permission.// // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY // OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE./////////////////////////////////////////////////////////////////////////////#ifndef LINKED_LIST_H#define LINKED_LIST_H#include "FreeList.h"#ifdef __cplusplusextern "C" {#endif#define EOUTOFMEM (-7 & 1<<29)#define FREELISTSIZE 100#define LIST_SUCCESS 1#define LIST_FAIL 0/**************************************************************************** * Name: free_routine * * Description: * Function for freeing list items *****************************************************************************/typedef void (*free_function)(void *arg);/**************************************************************************** * Name: cmp_routine * * Description: * Function for comparing list items * Returns 1 if itemA==itemB *****************************************************************************/typedef int (*cmp_routine)(void *itemA,void *itemB);/**************************************************************************** * Name: ListNode * * Description: * linked list node. stores generic item and pointers to next and prev. * Internal Use Only. *****************************************************************************/typedef struct LISTNODE{ struct LISTNODE *prev; //previous node struct LISTNODE *next; //next node void *item; //item} ListNode;/**************************************************************************** * Name: LinkedList * * Description: * linked list (no protection). Internal Use Only. * Because this is for internal use, parameters are NOT checked for * validity. * The first item of the list is stored at node: head->next * The last item of the list is stored at node: tail->prev * If head->next=tail, then list is empty. * To iterate through the list: * * LinkedList g; * ListNode *temp = NULL; * for (temp = ListHead(g);temp!=NULL;temp = ListNext(g,temp)) * { * } * *****************************************************************************/typedef struct LINKEDLIST{ ListNode head; //head, first item is stored at: head->next ListNode tail; //tail, last item is stored at: tail->prev long size; //size of list FreeList freeNodeList; //free list to use free_function free_func; //free function to use cmp_routine cmp_func; //compare function to use} LinkedList;/**************************************************************************** * Function: ListInit * * Description: * Initializes LinkedList. Must be called first. * And only once for List. * Parameters: * list - must be valid, non null, pointer to a linked list. * cmp_func - function used to compare items. (May be NULL) * free_func - function used to free items. (May be NULL) * Returns: * 0 on success, EOUTOFMEM on failure. *****************************************************************************/int ListInit(LinkedList *list,cmp_routine cmp_func, free_function free_func);/**************************************************************************** * Function: ListAddHead * * Description: * Adds a node to the head of the list. * Node gets immediately after list.head. * Parameters: * LinkedList *list - must be valid, non null, pointer to a linked list. * void * item - item to be added * Returns: * The pointer to the ListNode on success, NULL on failure. * Precondition: * The list has been initialized. *****************************************************************************/ListNode *ListAddHead(LinkedList *list, void *item);/**************************************************************************** * Function: ListAddTail * * Description: * Adds a node to the tail of the list. * Node gets added immediately before list.tail. * Parameters: * LinkedList *list - must be valid, non null, pointer to a linked list. * void * item - item to be added * Returns: * The pointer to the ListNode on success, NULL on failure. * Precondition: * The list has been initialized. *****************************************************************************/ListNode *ListAddTail(LinkedList *list, void *item);/**************************************************************************** * Function: ListAddAfter * * Description: * Adds a node after the specified node. * Node gets added immediately after bnode. * Parameters: * LinkedList *list - must be valid, non null, pointer to a linked list. * void * item - item to be added * ListNode * bnode - node to add after * Returns: * The pointer to the ListNode on success, NULL on failure. * Precondition: * The list has been initialized. *****************************************************************************/ListNode *ListAddAfter(LinkedList *list, void *item, ListNode *bnode);/**************************************************************************** * Function: ListAddBefore * * Description: * Adds a node before the specified node. * Node gets added immediately before anode. * Parameters: * LinkedList *list - must be valid, non null, pointer to a linked list. * ListNode * anode - node to add the in front of. * void * item - item to be added * Returns: * The pointer to the ListNode on success, NULL on failure. * Precondition: * The list has been initialized. *****************************************************************************/ListNode *ListAddBefore(LinkedList *list,void *item, ListNode *anode);/**************************************************************************** * Function: ListDelNode * * Description: * Removes a node from the list * The memory for the node is freed. * Parameters: * LinkedList *list - must be valid, non null, pointer to a linked list. * ListNode *dnode - done to delete. * freeItem - if !0 then item is freed using free function. * if 0 (or free function is NULL) then item is not freed * Returns: * The pointer to the item stored in the node or NULL if the item is freed. * Precondition: * The list has been initialized. *****************************************************************************/void *ListDelNode(LinkedList *list,ListNode *dnode, int freeItem);/**************************************************************************** * Function: ListDestroy * * Description: * Removes all memory associated with list nodes. * Does not free LinkedList *list. * * Parameters: * LinkedList *list - must be valid, non null, pointer to a linked list. * freeItem - if !0 then items are freed using the free_function. * if 0 (or free function is NULL) then items are not freed. * Returns: * 0 on success. Always returns 0. * Precondition: * The list has been initialized. *****************************************************************************/int ListDestroy(LinkedList *list, int freeItem);/**************************************************************************** * Function: ListHead * * Description: * Returns the head of the list. * * Parameters: * LinkedList *list - must be valid, non null, pointer to a linked list. * * Returns: * The head of the list. NULL if list is empty. * Precondition: * The list has been initialized. *****************************************************************************/ListNode* ListHead(LinkedList *list);/**************************************************************************** * Function: ListTail * * Description: * Returns the tail of the list. * * Parameters: * LinkedList *list - must be valid, non null, pointer to a linked list. * * Returns: * The tail of the list. NULL if list is empty. * Precondition: * The list has been initialized. *****************************************************************************/ListNode* ListTail(LinkedList *list);/**************************************************************************** * Function: ListNext * * Description: * Returns the next item in the list. * * Parameters: * LinkedList *list - must be valid, non null, pointer to a linked list. * * Returns: * The next item in the list. NULL if there are no more items in list. * Precondition: * The list has been initialized. *****************************************************************************/ListNode* ListNext(LinkedList *list, ListNode * node);/**************************************************************************** * Function: ListPrev * * Description: * Returns the previous item in the list. * * Parameters: * LinkedList *list - must be valid, non null, pointer to a linked list. * * Returns: * The previous item in the list. NULL if there are no more items in list. * Precondition: * The list has been initialized. *****************************************************************************/ListNode* ListPrev(LinkedList *list, ListNode * node);/**************************************************************************** * Function: ListFind * * Description: * Finds the specified item in the list. * Uses the compare function specified in ListInit. If compare function * is NULL then compares items as pointers. * Parameters: * LinkedList *list - must be valid, non null, pointer to a linked list. * ListNode *start - the node to start from, NULL if to start from * beginning. * void * item - the item to search for. * Returns: * The node containing the item. NULL if no node contains the item. * Precondition: * The list has been initialized. *****************************************************************************/ListNode* ListFind(LinkedList *list, ListNode *start, void * item);/**************************************************************************** * Function: ListSize * * Description: * Returns the size of the list. * Parameters: * LinkedList *list - must be valid, non null, pointer to a linked list. * Returns: * The number of items in the list. * Precondition: * The list has been initialized. *****************************************************************************/int ListSize(LinkedList* list);#ifdef __cplusplus}#endif#endif //LINKED_LIST_H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -