详细说明:https://blog.youkuaiyun.com/qq_43643944/article/details/114790387
具体代码
#include<iostream>
using namespace std;
typedef struct DNode {
int data;
struct DNode *prior, *next;
} *DLinkList;
void InitDLinkList(DLinkList &L) {//初始化双链表
L = (DNode *) malloc(sizeof(DNode));
if (L == NULL) {
cout << "内存分配失败!" << endl;
return;
}
L->prior = NULL;
L->next = NULL;
}
void createDLinkList(DLinkList &L) {//尾插法建立一个长度为10的双链表
DNode *r = L;//指向最后一个一个节点
for (int i = 0; i < 10; i++) {
DNode *p = (DNode *) malloc(sizeof(DNode));
p->data = i + 1;
p->next = r->next;
p->prior = r;
r->next = p;
r = p;
}
}
DNode *getElem(DLinkList L, int i) {//按序号查找
DNode *p = L;
int j = 0;
if (i < 0)
return NULL;
while (p != NULL && j < i) {
p = p->next;
j++;
}
return p;
}
void inDLinkList(DLinkList &L, int i, int val) {//插入结点
DNode *p = getElem(L, i);
if (p == NULL) {
cout << "插入失败,请检查编号是否有误!" << endl;
return;
}
DNode *q = (DNode *) malloc(sizeof(DNode));
q->data = val;
if (p->next == NULL) {//最后一个节点
q->next = p->next;
q->prior = p;
p->next = q;
} else {
q->next = p->next;
q->prior = p;
p->next->prior = q;
p->next = q;
}
}
void deDLinkList(DLinkList &L, int i) {//删除结点
DNode *p = getElem(L, i);//找到第i个结点
if (p == NULL || i == 0) {
cout << "删除失败,请检查编号!" << endl;
return;
} else if (p->next == NULL) {//最后一个结点
p->prior->next = NULL;
free(p);
} else {
p->prior->next = p->next;
p->next->prior = p->prior;
free(p);
}
}
int main() {
DLinkList L;
InitDLinkList(L);
createDLinkList(L);
cout << "遍历链表:";
DNode *p = L->next;
while (p) {
cout << p->data << " ";
p = p->next;
}
cout << endl;
cout << "插入元素11:";
inDLinkList(L, 10, 11);
DNode *p1 = L->next;
while (p1) {
cout << p1->data << " ";
p1 = p1->next;
}
cout << endl;
cout << "删除2:";
deDLinkList(L, 2);
DNode *p2 = L->next;
while (p2) {
cout << p2->data << " ";
p2 = p2->next;
}
return 0;
}