#ifndef DLIST_H_INCLUDED
#define DLIST_H_INCLUDED
#include<iostream>
using namespace std;
template <class T>
struct dListNode
{
T data;
dListNode<T> *prior;
dListNode<T> *next;
};
template <class T>
class dLinkList
{
private:
dListNode<T> *dhead;
public:
friend struct dListNode<T>;
dLinkList();
~dLinkList();
void CreatdListF(T a[],int n);
void CreatdListR(T a[],int n);
int ListLength();
bool GetElem(int i,T &e);
int LocateElem(T e);
bool ListInsert(int i,T e);
bool ListDelete(int i);
void DispList();
};
template <class T>
dLinkList<T>::dLinkList()
{
dhead = new dListNode<T>();
dhead->prior = dhead->next = dhead;
}
template <class T>
dLinkList<T>::~dLinkList()
{
dListNode<T> *pre,*p;
pre = dhead;
p = pre->next;
while(p!=NULL)
{
delete p;
pre=p;
p=p->next;
}
delete pre;
}
template <class T>
void dLinkList<T>::CreatdListR(T a[],int n)
{
dListNode<T> *s,*r;
r = dhead;
int i;
for(i = 0;i< n;i++)
{
s = new dListNode<T>();
s->data = a[i];
r->next = s;
s->prior = r;
r = s;
}
r->next = NULL;
}
template<class T>
void dLinkList<T>::DispList()
{
dListNode<T> *p;
p = dhead->next;
while(p!=NULL)
{
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
template <class T>
int dLinkList<T>::ListLength()
{
int i;
dListNode<T> *p;
p = dhead->next;
while(p!=NULL)
{
i++;
p = p->next;
}
cout << "链表长度:"<<i<<endl;
return i;
}
template <class T>
bool dLinkList<T>::GetElem(int i,T &e)
{
int j = 1;
dListNode<T> *p;
p = dhead->next;
while(p!=NULL&&j<i)
{
j++;
p = p->next;
}
if(p == NULL)
return false;
else
{
e = p->data;
cout << "第"<<i<<"个节点的数据元素值为:"<<e<<endl;
return e;
}
}
template<class T>
int dLinkList<T>::LocateElem(T e)
{
int i=1;
dListNode<T> *p;
p = dhead->next;
while(p!=NULL&&p->data!=e)
{
i++;
p = p->next;
}
if(p == NULL)
return false;
else
{
cout << "元素值"<<e<<"的逻辑序号为:"<<i<<endl;
return i;
}
}
template<class T>
bool dLinkList<T>::ListInsert(int i,T e)
{
int j = 0;
dListNode<T> *s,*p;
p = dhead;
while(p!=NULL&&j<i-1)
{
j++;
p = p->next;
}
if(p == NULL)
return false;
else
{
s = new dListNode<T>();
s->data = e;
s->next = p->next;
s->prior = p;
p->next->prior = s;
p->next = s;
return true;
}
}
template <class T>
bool dLinkList<T>::ListDelete(int i)
{
dListNode<T> *p,*q;
p = dhead;
int j = 0;
while(p!=NULL&&j<i-1)
{
j++;
p = p->next;
}
if(p == NULL)
return false;
else
{
q = p->next;
if(q == NULL)
return false;
else
p->next = q->next;
if(q->next!=NULL)
q->next->prior = p;
delete q;
return true;
}
}
#endif
#include <iostream>
#include"dlist.h"
using namespace std;
int main()
{
int e;
dLinkList<int> L;
int a[5] = {1,2,3,4,5};
L.CreatdListR(a,5);
L.DispList();
L.ListLength();
L.GetElem(1,e);
L.LocateElem(1);
L.ListInsert(1,8);
L.DispList();
L.ListDelete(2);
L.DispList();
return 0;
}