双向链表
双向链表
双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。下图为双向链表的结构图。
/* 单链表的结构 */
struct List{
int data; // 数据域
struct List *next; // 指针域
};
/* 双向链表的结构 */
typedef struct List{
int data; // 数据域
struct List *next; // 向后的指针
struct List *front; // 向前的指针
};
typedef struct List* pElem;
typedef struct List eElem;
注:1.在单链表中,由于每个结点只指向下一个节点,所以我们只能通过头结点遍历链表。但是双向链表的每个结点既有指向下一个结点的指针,也有指向上一个结点的指针,所以我们要遍历双向链表可以通过其头结点,也可以通过其尾结点。
2.当我们要找的结点靠近头结点的时候,我们可以从头结点开始遍历;当我们要找的结点靠近尾结点的时候,我们可以从尾结点开始遍历。从而提高执行效率。
- 双向链表的创建(创建单链表结点类似)
pElem CreatList(){
pElem head = (pElem)malloc( sizeof(eElem) );
assert( head != NULL ); // 包含于标准库<assert.h>
head->next = head->front = NULL; // 初始化链表,指针置空
return head;
}
-双向链表的插入
在单向链表的头插法中,最主要的语句自然就是tmp->next = head->next, 而在双向链表中,自然也是一样,只不过多了连接一个向前的指针而已。
void InsertElem( pElem head , int data )