双向链表基本操作:
#include <iostream>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
typedef int ElemType;
typedef struct DuLNode
{
ElemType data;
struct DuLNode* prior;
struct DuLNode* next;
}DuLNode,*DuLinkList;
Status InitList(DuLinkList& L)//初始化双向链表
{
L = new DuLNode;
if (!L) exit(-1);
L->prior = L;
L->next = L;
return 0;
}
DuLinkList GetElem_DuL(DuLinkList L, int i)//按位置查找双向链表中的元素
{
if (i < 1) return ERROR;
DuLinkList p;
p = new DuLNode;
p = L->next;
for (int j = 1; j < i; j++)
{
p = p->next;
}
return p;
}
Status ListInsert_DuL(DuLinkList& L, int i, ElemType e)//第i个元素前插入
{
DuLinkList p;
if (!(p = GetElem_DuL(L, i)))
{
return ERROR;
}
DuLinkList s;
s = new DuLNode;
s->data = e;
s->prior = p->prior;
p->prior->next = s;
s->next = p;
p->prior = s;
return OK;
}
Status ListDelete_DuL(DuLinkList& L, int i)//删除第i个位置的元素
{
DuLinkList p;
if (!(p = GetElem_DuL(L, i)))
return ERROR;
p->prior->next = p->next;
p->next->prior = p->prior;
delete p;
return OK;
}
DuLinkList LocateElem_DuL(DuLinkList L, ElemType e)//按值查找,返回数据域为e的指针
{
DuLinkList p;
p = new DuLNode;
for (p = L->next; p!= L; p = p->next)
{
if (p->data == e)
{
return p;
break;
}
}
}
主函数测试:
#include <iostream>
#include "循环链表.hpp"
using namespace std;
void CreateList_R(DuLinkList& L, int n)//后插法创建双向链表
{
InitList(L);
DuLinkList r = L;
cout << "请输入链表元素" << endl;
for (int i = 0; i < n; ++i)
{
DuLinkList p = new DuLNode;
cin >> p->data;
p->next = L;
p->prior = r;
r->next = p;
L->prior = p;
r = p;
}
}
void Traverse_DuL(DuLinkList L)//遍历双向链表
{
DuLNode * p =L->next;
cout << "链表元素为:" << endl;
while(p!= L)
{
cout << p->data<<" ";
p = p->next;
}
}
int main()
{
DuLinkList L,p,q;
int n;
cout << "输入元素的个数:" << endl;
cin >> n;
CreateList_R( L, n);//num=5,元素为1 2 3 4 5
Traverse_DuL(L);
cout << endl;
int i,e;
cout << "输入一个位置:" << endl;
cin >> i;
q = GetElem_DuL(L, i);
cout << "该位置的元素为:" << endl;
cout << q->data << endl;
cout << "输入想查找元素的值:"<<endl;
cin >> e;
cout << "该元素的地址为:" << endl;
cout<<LocateElem_DuL(L, e)<<endl;
int j;
cout << "输入一个位置:"<<endl;
cin >> j;
cout << "输入一个值:" << endl;
cin >> e;
ListInsert_DuL(L, j, e);
Traverse_DuL(L);
cout << endl;
cout << "输入删除元素的位置:";
cin >> i;
ListDelete_DuL(L, i);
Traverse_DuL(L);
return 0;
}