目录
一、双链表定义
双链表的定义和单链表一样,只是在其基础上添加了一个指向前驱节点的指针,对比单链表,可以正向检索,又可以逆向检索,存储密度更低,较之单链表更为高级。
二、双链表的操作
双链表的操作和单链表的操作基本无异,只是在原有基础上要多考虑一条指向前驱节点的指针的指向,这里最好最好自己多多画图理解,我们不再啰嗦直接上代码。
2.1、双链表的初始化操作
typedef struct DNode
{
int data;
struct DNode* prior, * next;
}DNode,*DLinklist;
//初始化双链表
bool InitDLinkList(DLinklist& L)
{
L = new DNode;
if (L == NULL)
{
return false;
}
L->prior = NULL;
L->next = NULL;
cout << "双链表初始化完成" << endl;
return true;
}
int main()
{
DLinklist L;
//初始化
InitDLinkList(L);
}
2.2、传值操作
DLinklist Chuan(DLinklist& L)
{
int x;
L = new DNode;
DNode* s, * r = L;
cout << "请传值,输入999退出输值" << endl;
cin >> x;
while (x != 999)
{
DNode* s = new DNode;
s->data = x;
r->next = s;
s->prior = r;
r = s;
cin >> x;
}
r->next = NULL;
return L;
}
2.3、插入操作
bool InserNextDNode(DLinklist& L)
{
int i, e;
cout << "请输入要插入的位序及数据" << endl;
cin >> i >> e;
if (i < 1)
return false;
DNode* p;
int j = 0;
p = L;
while (p != NULL && j < i - 1)
{
p = p->next;
j++;
}
if (p == NULL)
{
return false;
}
DNode* s = new DNode;
if (p == NULL || s == NULL)
{
return false;
}
s->data = e;
s->next = p->next;
if (p->next != NULL)
{
p->next->prior = s;
}
s->prior = p;
p->next = s;
cout << "插入完成" << endl;
return true;
}
2.4、删除操作
bool Shan(DLinklist& L)
{
int i;
cout << "请输入要删除的位序" << endl;
cin >> i;
if (i < 1)
{
return false;
}
DNode* p; //指针p指向当前扫描到的节点
int j = 0; //当前p指向的是第几个节点
p = L; //L指向头节点,头结点是第0个节点
while (p != NULL && j < i - 1)
{
p = p->next;
j++;
}
if (p == NULL)
{
return false;
}
DNode* q = p->next;
if (q == NULL)
{
return false;
}
p->next = q->next;
if (q->next != NULL)
{
q->next->prior = p;
}
delete q;
cout << "数据删除完成" << endl;
return true;
}
2.5查找操作
DNode* GetElem(DLinklist L)
{
int i;
cout << "请输入要查找数据的位序";
cin >> i;
if (i < 0)
{
return NULL;
}
DNode* p;
int j = 0;
p = L;
while (p != NULL && j < i)
{
p = p->next;
j++;
}
cout << "您查找的数据为" << p->data << endl;
return p;
}
三、完整代码
#include<iostream>
using namespace std;
typedef struct DNode
{
int data;
struct DNode* prior, * next;
}DNode,*DLinklist;
//初始化双链表
bool InitDLinkList(DLinklist& L)
{
L = new DNode;
if (L == NULL)
{
return false;
}
L->prior = NULL;
L->next = NULL;
cout << "双链表初始化完成" << endl;
return true;
}
//传值
DLinklist Chuan(DLinklist& L)
{
int x;
L = new DNode;
DNode* s, * r = L;
cout << "请传值,输入999退出输值" << endl;
cin >> x;
while (x != 999)
{
DNode* s = new DNode;
s->data = x;
r->next = s;
s->prior = r;
r = s;
cin >> x;
}
r->next = NULL;
return L;
}
//打印
void Printt(DLinklist L)
{
cout << "当前双链表为" << endl;
DNode* p;
p = L;
L = NULL;
while (p != NULL)
{
cout << p->data << "< == >";
p = p->next;
}
cout << "NULL" << endl;
}
//双链表的查找
DNode* GetElem(DLinklist L)
{
int i;
cout << "请输入要查找数据的位序";
cin >> i;
if (i < 0)
{
return NULL;
}
DNode* p;
int j = 0;
p = L;
while (p != NULL && j < i)
{
p = p->next;
j++;
}
cout << "您查找的数据为" << p->data << endl;
return p;
}
//双链表的插入操作
bool InserNextDNode(DLinklist& L)
{
int i, e;
cout << "请输入要插入的位序及数据" << endl;
cin >> i >> e;
if (i < 1)
return false;
DNode* p;
int j = 0;
p = L;
while (p != NULL && j < i - 1)
{
p = p->next;
j++;
}
if (p == NULL)
{
return false;
}
DNode* s = new DNode;
if (p == NULL || s == NULL)
{
return false;
}
s->data = e;
s->next = p->next;
if (p->next != NULL)
{
p->next->prior = s;
}
s->prior = p;
p->next = s;
cout << "插入完成" << endl;
return true;
}
//双链表的删除
bool Shan(DLinklist& L)
{
int i;
cout << "请输入要删除的位序" << endl;
cin >> i;
if (i < 1)
{
return false;
}
DNode* p; //指针p指向当前扫描到的节点
int j = 0; //当前p指向的是第几个节点
p = L; //L指向头节点,头结点是第0个节点
while (p != NULL && j < i - 1)
{
p = p->next;
j++;
}
if (p == NULL)
{
return false;
}
DNode* q = p->next;
if (q == NULL)
{
return false;
}
p->next = q->next;
if (q->next != NULL)
{
q->next->prior = p;
}
delete q;
cout << "数据删除完成" << endl;
return true;
}
int main()
{
DLinklist L;
//初始化
InitDLinkList(L);
//传值
Chuan(L);
Printt(L);
//插入
InserNextDNode(L);
Printt(L);
//删除
Shan(L);
Printt(L);
//查找
GetElem(L);
system("pause");
return 0;
}