1.前言
这篇文章主要介绍双向链表的表示和实现。
2.双向链表
单链表中只有一个指示直接后继的指针域,由此,从某个结点出发只能顺指针向后寻查其他结点。若要寻查结点的直接前驱,则必须从表头指针出发。换句话说,在单链表中,查找直接后继结点的执行时间为 0(1),而查找直接前驱的执行时间为 0(n)。为克服单链表这种单向性的缺点,可利用双向链表(Double Linked List )。
双向链表是一种链表数据结构,每个节点都有两个指针,一个指向前一个节点,一个指向后一个节点。
1.定义
// 定义
typedef struct DNode {
int data;
struct DNode *prev; //前驱节点
struct DNode *next; //后继节点
} DNode, *DoubleLinkList;
2.初始化
// 初始化
void initDoubleLinkList(DoubleLinkList *list) {
*list = NULL;
}
3.插入
// 插入
void insertAtEnd(DoubleLinkList *list, int data) {
DNode *newNode = (DNode *)malloc(sizeof(DNode));
newNode->data = data;
newNode->next = NULL;
if (*list == NULL) {
newNode->prev = NULL;
*list = newNode;
} else {
DNode *current = *list;
while (current->next != NULL) {
current = current->next;
}
current->next = newNode;
newNode->prev = current;
}
}
4.清空
void clearDoubleLinkList(DoubleLinkList & doubleLinkList){
DoubleLinkList p = doubleLinkList;
p->next = nullptr;
p->prior = nullptr;
}
5.返回链表中第一个与element相同的数据元素的下标
释放链表指针,调用free函数。
int locationDoubleLinkListElement(DoubleLinkList doubleLink,int element,int * position){
DoubleLinkList p = doubleLink;
int j = 1;
while (p != NULL) {
if (p->data == element) {
* position = j;
return 1;
}
p = p->next;
j++;
}
return 0;
}
6.表长
int doubleLinkListLength(DoubleLinkList doubleLinkList){
DNode * p = doubleLinkList->next;
int length = 1;
while (p != NULL) {
p = p->next;
length ++;
}
return length;
}
7.前驱节点
int priorDoubleElement(DoubleLinkList doubleLi