做一个豁达而努力的自己。
双向链表的定义:在单链表的每个节点中,再设置一个指向其前驱节点的指针域。
线性表的双向链表的存储结构:
typedef struct DulNode
{
ElemType data;
struct DulNode *prior;
struct DulNode *next;
}DulNode, *DulLinkList;
代码:
#include <iostream>
#include <cstdlib>
using namespace std;
//双向链表的存储结构
typedef struct DulNode
{
int data; //节点的数据域
DulNode *prior; //指向前继节点
DulNode *next; //指向后继节点
}DulNode, *DulLinkList;
//双向链表的初始化
bool InitList(DulLinkList &L)
{
L = new DulNode;
if(!L)
return false;
L->prior = NULL;
L->next = NULL;
return true;
}
//头插法创建双向链表
void CreateList_H(DulLinkList &L)
{
int n;
DulLinkList s;
cout << "输入创建的元素个数:";
cin >> n;
while(n--)
{
s = new DulNode;
cout << "输入数据:";
cin >> s->data;
if(L->next)
L->next->prior = s;
s->prior = L;
s->next = L->next;
L->next = s;
}
}
//双向链表的尾插法
void CreateList_T(DulLinkList &L)
{
int n;
DulLinkList s, r;
r = L;
cout << "输入创建元素的个数:";
cin >> n;
while(n--)
{
s = new DulNode;
cout << "输入数据:";
cin >> s->data;
s->next = NULL;
s->prior = r;
r->next = s;
r = s;
}
}
//双向链表的查找
bool GetList(DulLinkList L, int i, int &e)
{
DulLinkList p;
p = L->next;
int j = 1;
while(p && j < i)
{
p = p->next;
j++;
}
if(!p || j > i)
return false;
e = p->data;
return true;
}
//双向链表的插入
bool InsertList(DulLinkList &L, int i, int e)
{
DulLinkList p, s;
int j = 1;
p = L;
while(p && j < i)
{
p = p->next;
j++;
}
if(!p || j > i)
return false;
s = new DulNode;
s->data = e;
s->next = p->next;
s->prior = p;
p->next = s;
return true;
}
//双向链表的删除
bool DeleteList(DulLinkList &L, int i)
{
DulLinkList p, q;
int j = 1;
p = L;
while(p->next && j < i)
{
p = p->next;
j++;
}
if(!p->next || j > i)
return false;
if(p->next->next == NULL)
{
q = p->next;
p->next = NULL;
delete q;
}
else
{
q = p->next;
p->next = q->next;
q->next->prior = p;
delete q;
}
return true;
}
//双向链表的清除
void ClearList(DulLinkList &L)
{
DulLinkList p, q;
p = L->next;
while(p)
{
q = p;
p = p->next;
delete q;
}
L->next = NULL;
}
//双向链表的输出
void PutList(DulLinkList L)
{
DulLinkList p;
p = L->next;
while(p)
{
cout << p->data << endl;
p = p->next;
}
}
//菜单
void menu()
{
cout << "1.双向链表的初始化" << endl;
cout << "2.双向链表的头插发创建" << endl;
cout << "3.双向链表的尾插法创建" << endl;
cout << "4.双向链表的查找" << endl;
cout << "5.双向链表的插入" << endl;
cout << "6.双向链表的删除" << endl;
cout << "7.双向链表的清除" << endl;
cout << "8.双向链表的输出" << endl;
cout << "0.退出双向链表" << endl;
}
int main()
{
DulLinkList L;
int e, i;
bool n;
int num;
while(num != 0)
{
system("cls");
menu();
cout << "请选选项:";
cin >> num;
switch(num)
{
case 1: n = InitList(L);
if(n == 0)
cout << "初始化失败" << endl;
else
cout << "初始化成功" << endl;
break;
case 2: CreateList_H(L);
cout << "头插法创建成功" << endl;
break;
case 3: CreateList_T(L);
cout << "尾指针创建成功" << endl;
break;
case 4: cout << "请输入要查找的位置:";
cin >> i;
n = GetList(L, i, e);
if(n == 0)
cout << "查找失败" << endl;
else
{
cout << "查找结果:";
cout << e << endl;
}
break;
case 5: cout << "请输入要插入的位置:";
cin >> i;
cout << "请输入int型数据:";
cin >> e;
n = InsertList(L, i, e);
if(n == 0)
cout << "插入失败" << endl;
else
cout << "插入成功" << endl;
break;
case 6: cout << "请输入删除位置:";
cin >> i;
n = DeleteList(L, i);
if(n == 0)
cout << "删除失败" << endl;
else
cout << "删除成功" << endl;
break;
case 7: ClearList(L);
break;
case 8: PutList(L);
break;
case 0: break;
default : "没有输入选项";
}
system("pause");
}
return 0;
}