数据结构 双向链表
2018-03-20 15:54
267 查看
做一个豁达而努力的自己。
双向链表的定义:在单链表的每个节点中,再设置一个指向其前驱节点的指针域。
线性表的双向链表的存储结构:
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;
4000
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;
}
双向链表的定义:在单链表的每个节点中,再设置一个指向其前驱节点的指针域。
线性表的双向链表的存储结构:
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;
4000
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;
}
相关文章推荐
- 数据结构之循环双向链表java实现
- 【C++/数据结构】双向链表的基本操作
- 【C++数据结构学习笔记---线性表】带头结点的双向循环链表
- 数据结构(C#)--双向链表
- 《Delphi 算法与数据结构》学习与感悟[10]: 双向链表
- RTOS双向链表数据结构
- 数据结构 第4-2讲 双向链表
- 简单数据结构之双向链表(C++实现)
- 一步一步学数据结构之1--1(双向链表)
- 数据结构:XOR链表--- 一个空间高效的双向链表
- 数据结构4.进一步封装的双向链表
- C语言学习历程(十六)数据结构-单双向链表
- 【数据结构】双向链表表示和实现
- [java数据结构]--java双向链表LinkedList的简单实现
- C实现通用数据结构--双向链表
- 数据结构 No.5 双向链表
- 数据结构-双向链表
- Nginx高级数据结构总结之 ngx_queue_t 双向链表
- 数据结构----线性表----双向链表