插入
结点后插
// 后插结点 p结点后插入s结点
bool InsertNextNode(DLNode *p, DLNode *s){
if(p->prior == NULL && s->data == NULL) // 非法传参
return false;
s->next = p->next; // s指向p的原后继结点
if(p->next != NULL){
// 判断p是否为最后一个结点
(p->next)->prior = s; // 令p的原后继结点的前继结点指向s
}
s->prior = p; // 令p成为s的前继结点
p->next = s; // 令p后继结点为s
return true;
}
图示:
按位插入
// 按位插入元素
bool ListInsert(DLinkList *L, int pos, ElemType e){
if(L == NULL || pos < 0) // 数据合法性判断
return false;
DLNode *p = *L; // p记录插入结点的前继结点位置
DLNode *s = (DLNode *)malloc(sizeof(DLNode)); // s为插入结点
int i = 0;
while(i < pos-1){
// 定位到插入位置结点
p = p->next;
i++;
}
s->data = e; // 数据暂存
if(InsertNextNode(p, s)){
// 结点后插
return true;
}else
return false;
}
尾插法
// 尾插法正序创建双链表
DLinkList List_TailInsert(DLinkList L){
DLNode *p = L;
ElemType e;
scanf("%d", &e);
while(e != 9999){
// 输入9999停止输入数据
while(p->next != NULL){
// 定位至表尾
p = p->next;
}
DLNode *s = (DLNode*)malloc(sizeof(DLNode));
s->data = e; // 创建个结点存入数据用于插入
s->next = NULL;
s->prior = NULL;
InsertNextNode(p, s); // 调用结点后插函数
scanf("%d", &e);
}
return L;
}
头插法
// 头插法逆序创建链表
DLinkList List_HeadInsert(DLinkList L){
ElemType e;
scanf("%d", &e);
while(e != 9999){
// 输入9999停止输入数据
DLNode *s = (DLNode*)malloc(sizeof(DLNode));
s->data = e;
if(L->next == NULL){
// 第一个结点要特殊处理
L->next = s;
s->prior = L;
s->next = NULL;
}else{
// 在头指针和第一个结点之间插入结点
L->next->prior = s; // 后继结点指向s
s->next = L->next; // s指向后继结点
L->next = s; // 前继结点指向s
s->prior = L; // s指向前继结点
}
scanf("%d", &e);
}
return L;
}
删除
结点后删
// 删除p结点的后继结点
bool DeleteNextNode(DLNode *p){
if(p == NULL)
return false;
DLNode *q = p->next; // 找到p的后继结点q
if(q == NULL)
return false; // p没有后继结点
p->next = q->next;
if(q->next != NULL) // q结点不是最后一个结点
q->next->prior = p;
free(q); // 释放结点空间
return true;
}
按位删除
//