双向链表实现了既能向前操作,又能向后操作,每个元素有两个指针域,一个存储前一个元素的地址,一个存储后一个元素的地址,双向链表的很多操作也和单链表很相似。
双向链表的基本操作
#include<iostream>
#define ElemType int
typedef struct DuLnode {
ElemType data;
struct DuLnode* prior, * next;
}DuLNode,*DuLinkList;
//初始化
bool InitList_L(DuLinkList& L) {
L = new DuLNode;
if (!L)
return false;
L->prior = NULL;
L->next = NULL;
return true;
}
//创建
//头插法
void CreateDuList_H(DuLinkList& L) {
int n;
DuLinkList s;
L = new DuLNode;
L->next = L->prior = NULL;
std::cout << "请输入元素个数" << std::endl;
std::cin >> n;
std::cout << "请依次输入n个元素" << std::endl;
std::cout << "头插法创建双向链表" << std::endl;
while (n--) {
s = new DuLNode;
std::cin >> s->data;
if (L->next)//如果L后面有节点,则将后面的节点的prior修改
L->next->prior = s;
s->next = L->next;
s->prior = L;
L->next = s;
}
}
//尾插法
//和单链表的尾插法类似
//取值和查找都和单链表的类似
//插入
bool ListInsert_L(DuLinkList& L,int i,int e) {
int j;
DuLinkList p, s;
p = L;
j = 0;
while (p && j < i) {//p指向第i个节点
p = p->next;
j++;
}
if (!p || j > i)
return false;
s = new DuLNode;
s->data = e;
p->prior->next = s;
s->prior = p->prior;
s->next = p;
p->prior = s;
return true;
}
//删除
bool LisiDelete_L(DuLinkList& L, int i) {
DuLinkList p;
int j = 0;
p = L;
while (p && j < i) {//p指向第i个节点
p = p->next;
j++;
}
if (!p || j > i)
return false;
if (p->next)
p->next->prior = p->prior;
p->prior->next = p->next;
delete p;
return true;
}
int main() {
}