1.初始设置定义
typedef int ElemType; // ElemType代表元素数据类型,可自定义类型
2.双向链表结点设置定义
typedef struct DuLNode{ // 双向链表的结点定义
ElemType data;
struct DuLNode *prior, *next; // prior指向前驱结点,next指向后继结点
}DuLNode, *DuLinkList;
3.初始化创建带头结点的双向链表
bool InitList_L(DuLinkList &L){ // 构造一个空的双向链表L
L = new DuLNode; // 生成新结点作为头结点,以头指针L指向头结点
if(!L)return false; // 生成结点失败
L->prior = L->next = NULL; // 头结点的两个指针域置空
return true;
}
4.利用头插法创建双向链表
void CreatDuList_H(DuLinkList &L){ // 利用头插法创建双向链表
int n;
DuLinkList s;
L = new DuLNode; // 生成新结点作为头结点,以头指针L指向头结点
L->prior = L->next = NULL; // 头结点的两个指针域置空
printf("请输入元素个数n:");
scanf("%d",&n);
printf("请依次输入n个元素:\n");
while(n--){
s = new DuLNode; // 生成新结点s
scanf("%d",&s->data);
if(L->next) // 若L后有结点,则修改其后面结点的前驱指针
L->next->prior = s;
s->next = L->next;
s->prior = L;
L->next = s; // 将新结点插入头结点后
}
}
5.在双向链表的第i个位置插入元素e
bool ListInsert_L(DuLinkList &L, int i, int &e){ // 在带头结点的的双向链表L中第i个位置插入e
int j = 0;
DuLinkList p,s;
p = L;
while(p && j<i){ // 查找第i个结点,令p指向该结点
p = p->next;
j++;
}
if(!p || j>i)return false; // 当第i位为空或不存在则插入失败
s = new DuLNode; // 生成新结点s
s->data = e; // 令新结点s数据域为e
p->prior->next = s;
s->prior = p->prior;
s->next = p;
p->prior = s;
return true;
}
6.在双向链表中删除第i个结点
bool ListDelete_L(DuLinkList &L, int i){ // 在带头结点的双向链表中删除第i个结点
DuLinkList p;
int j = 0;
p = L;
while(p && j<i){ // 查找第i个结点,令p指向该结点
p = p->next;
j++;
}
if(!p || j>i) return false; // 若第i位为空或不存在则删除失败
if(p->next) p->next->prior = p->prior; // 若第i位存在后继结点
p->prior->next = p->next;
delete p; // 释放被删除结点
return true;
}