双向循环链表的基本操作
来源:互联网 发布:js中给class移除样式 编辑:程序博客网 时间:2024/04/27 23:27
头文件:DuLinkList.h
using namespace std;
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
typedef int ElemType;
typedef int Status;
{
ElemType data;
struct DuLNode* prior;
struct DuLNode* next;
}DuLNode,*DuLinkList;
Status InitList_DuL(DuLinkList& L)
{
L = (DuLinkList)malloc(sizeof(DuLNode));
if (!L)
exit(OVERFLOW);
L->prior = L;
L->next = L;
return OK;
}
Status DestroyList_DuL(DuLinkList& L)
{
DuLinkList p = L->next;
while (L!=p)
{
DuLinkList q = p->next;
free(p);
p = q;
}
free(L);
L->next = NULL;
L->prior = NULL;
return OK;
}
Status ClearList_DuL(DuLinkList& L)
{
DuLinkList p = L->next;
while (L != p)
{
DuLinkList q = p->next;
free(p);
p = q;
}
L->next = L;
L->prior = L;
return OK;
}
Status ListEmpty_DuL(DuLinkList L)
{
if (L->next == L || L->prior == L)
return TRUE;
else
return FALSE;
}
int ListLength_DuL(DuLinkList L)
{
DuLinkList p = L->next;
int length = 0;
while (L != p)
{
++length;
p = p->next;
}
return length;
}
Status GetDuLNode_DuL(DuLinkList L, int i, DuLinkList& p)
{
if (i<1 || i>ListLength_DuL(L))
return ERROR;
p = L->next;
int count = 0;
while (p != L)
{
++count;
if (count == i)
return OK;
p = p->next;
}
return ERROR;
}
Status GetElem_DuL(DuLinkList L, int i, ElemType& e)
{
if (i<1 || i>ListLength_DuL(L))
return ERROR;
DuLinkList p = L->next;
int num = 0;
while (L!=p && num<i)
{
++num;
if (num == i)
{
e = p->data;
return OK;
}
p = p->next;
}
return ERROR;
}
Status compare(ElemType a, ElemType b)
{
if (a == b)
return TRUE;
else
return FALSE;
}
int LocateElem_DuL(DuLinkList L, ElemType e, Status(*compare)(ElemType, ElemType))
{
int pos=0;
DuLinkList p = L->next;
while (L != p)
{
++pos;
if (compare(e, p->data))
return pos;
p = p->next;
}
return 0;
}
Status PriorElem_DuL(DuLinkList L, ElemType cur_e, ElemType& pre_e)
{
DuLinkList p = L->next;
while (L != p)
{
if (p->data == cur_e && L->next!=p)
{
pre_e = p->prior->data;
return OK;
}
p = p->next;
}
return INFEASIBLE;
}
Status NextElem_DuL(DuLinkList L, ElemType cur_e, ElemType& next_e)
{
DuLinkList p = L->next;
while (L != p)
{
if (p->data == cur_e && p->next!=L)
{
next_e = p->next->data;
return OK;
}
p = p->next;
}
return INFEASIBLE;
}
Status ListInsert_DuL(DuLinkList& L, int i, ElemType e)
{
if (i<1 || i>ListLength_DuL(L) + 1)
return ERROR;
DuLinkList s = (DuLinkList)malloc(sizeof(DuLNode));
if (!s)
exit(OVERFLOW);
s->data = e;
if (i == ListLength_DuL(L) + 1)
{
L->prior->next = s;
s->prior = L->prior;
L->prior = s;
s->next = L;
else
{
DuLinkList p;
GetDuLNode_DuL(L, i, p);
p->prior->next = s;
s->prior = p->prior;
p->prior = s;
s->next = p;
}
return OK;
}
Status ListDelete_DuL(DuLinkList& L, int i, ElemType& e)
{
DuLinkList p;
if (! GetDuLNode_DuL(L, i, p))
return ERROR;
e = p->data;
p->prior->next = p->next;
p->next->prior = p->prior;
free(p);
return OK;
}
Status visit(ElemType e)
{
if (cout << e << " ")
return OK;
else
return ERROR;
}
Status ListTraverse_DuL(DuLinkList L, Status(*visit)(ElemType))
{
DuLinkList p;
for (int i = 1; i <= ListLength_DuL(L); ++i)
{
GetDuLNode_DuL(L, i, p);
if (!(*visit)(p->data))
return ERROR;
}
return OK;
}
主函数:
#include"DuLinkList.h"
void main(void)
{
DuLinkList L;
InitList_DuL(L);
for (int i = 1, j = 1; i < 20; ++j, i += 2)
ListInsert_DuL(L, j, i);
cout << "双向循环链表L的信息为:" << endl;
cout << "*******************************************" << endl;
cout << "长度为:" << ListLength_DuL(L) << endl;
cout << "数据元素分别为:";
ListTraverse_DuL(L, visit);
cout << endl;
cout << "*******************************************" << endl;
ElemType e;
GetElem_DuL(L, 6, e);
cout << "第6个数据是:" << e << endl;
ElemType pre;
if (PriorElem_DuL(L, e, pre) != INFEASIBLE)
cout << e << "前面的数据是:" << pre << endl;
else
cout << "数据元素" << e << "没有前驱!" << endl;
ElemType next;
if (NextElem_DuL(L, e, next) != INFEASIBLE)
cout << e << "后面的数据是:" << next << endl;
else
cout << "数据元素" << e << "没有后继!" << endl;
cout << "删除数据" << e << endl;
if (ListDelete_DuL(L, 6, e))
{
cout << "删除数据成功!" << endl;
cout << "更新后的数据是:" << endl;
cout << "*******************************************" << endl;
cout << "长度为:" << ListLength_DuL(L) << endl;
cout << "数据元素分别为:";
ListTraverse_DuL(L, visit);
cout << endl;
cout << "*******************************************" << endl;
}
else
cout << "删除失败!" << endl;
cout << "值为7的数据元素的位置在:";
cout << "第" << LocateElem_DuL(L, 7, compare) << endl;
cout << "线性表L是否为空表:";
if (ListEmpty_DuL(L))
cout << "是" << endl;
else
cout << "否" << endl;
cout << "现将线性表L置为空表:" << endl;
ClearList_DuL(L);
cout << "线性表L是否为空表:";
if (ListEmpty_DuL(L))
cout << "是" << endl;
else
cout << "否" << endl;
cout << "将线性表L销毁!" << endl;
DestroyList_DuL(L);
}
- 双向循环链表的基本操作
- 双向循环链表的基本操作
- 双向循环链表的基本操作
- 双向循环链表的基本操作
- 双向循环链表的基本操作
- 循环双向链表的基本操作
- 不带头节点的双向循环链表基本操作
- 双向循环链表的头插尾插中间插基本操作
- 双向循环链表基本操作
- 双向循环链表基本操作
- 双向循环链表基本操作
- C语言单链表,双向链表,循环单链表,循环双链表的基本操作
- 双向循环链表基本操作(C语言)
- 双向循环链表的操作源码
- 双向循环链表操作的实现
- 双向循环链表操作的实现
- 双向循环链表的操作
- 不带头节点的双向循环链表的基本操作
- Android 生成含签名文件的apk安装包的两种方式
- 全面解析回溯法:算法框架与问题求解
- hdoj1085Holding Bin-Laden Captive!【母函数】
- JavaWeb应用中的身份验证(声明式)——基于表单的身份认证
- C#中数组[],ArrayList,List<T>泛型的区别
- 双向循环链表的基本操作
- 数反转
- next()和hasNext()
- iOS如何判断设备中是否安装了某款应用
- 对象析构与线程安全
- LeetCode 95:Unique Binary Search Trees II
- 安卓视频播放器的实现(基于vitamio)
- 观察者模式
- Serializable与Parcelable的使用方法及区别