1. 简介
之前讨论的单向链表中的结点只有一个指示之间后继的指针域,由此,从某个结点出发只能顺指针往后寻查其他结点。若要寻查结点的直接前驱,则需从表头指针出发。面对单向链表在这方面的不足,我们的解决方法很简单,只要在数据结构上附加一个域,使它包含指向前一个单元的指针即可。其开销是一个附加的链,它增加了空间的需求,同时也使得插入和删除的开销增加一倍,因为有更多的指针需要定位。另一方面,它简化了删除操作,因为你不再被迫使用一个指向前驱的指针来访问一个关键字。这就是我们要说的双向链表。
2. 链表的实现
/*********************************************************************************
*Copyright(C),Your Company
*FileName: List.h
*Author: Huangjh
*Version:
*Date: 2018-01-17
*Description: 双向链表(C语言)实现
*Others:
**********************************************************************************/
#ifndef _LIST_H
#define _LIST_H
typedef int ElementType;
typedef struct __Node_t
{
ElementType Element;
struct __Node_t *pPrior;
struct __Node_t *pNext;
}Node;
typedef int(*COMPARE)(ElementType, ElementType);
typedef void(*VISIT)(ElementType);
Node *CreateNode(ElementType element);
void DeleteNode(Node *pNode);
void InitList(Node *pHead);
int Empty(Node *pHead);
int ListLength(Node *pHead);
void ClearList(Node *pHead);
int InsFirst(Node *pHead, ElementType element);
int GetElem(Node *pHead, int iPos, ElementType *pElement);
int FindElem(Node *pHead, ElementType element, COMPARE compare);
Node *GetNodeInPosition(Node *pHead, int iPos);
int ListInsert(Node *pHe