//头文件
#pragma once
#include<iostream>
#include<string>
using namespace std;
//双链表结点结构定义
template<class T>
struct DbNode
{
T data;//数据域
DbNode<T>* prior, * next;//前驱指针,后继指针
};
//双链表
template<class T>
class DbLinkList
{
private:
DbNode<T>* head;
DbNode<T>* getPtr(int i);
public:
DbLinkList();
DbLinkList(T a[], int n);
DbLinkList(const DbLinkList& a);
~DbLinkList();
DbNode<T>* getElem(T e, int i);
bool insert(T e, int i);
bool Delete(T e, int i);
};
以上是头文件
下面是cpp文件
template<class T>
DbNode<T>* DbLinkList<T>::getPtr(int i)
{
if (i == 0)
{
return this->head;
}
DbNode<T>* p = this->head;
int t = 0;
while (i != t)
{
p = p->next;
t++;
}
return p;
}
//默认无参构造
template<class T>
DbLinkList<T>::DbLinkList()
{
head = new DbNode<T>;
head->next = NULL;//指向开始节点
head->prior = NULL;
}
//有参构造
template<class T>
DbLinkList<T>::DbLinkList(T a[],int n)
{
head = new DbNode<T>;
head->next = NULL;
DbNode<T>* pre = head,*p=NULL;
for (size_t i = 0; i < n; i++)
{
p = new DbNode<T>;
p = pre->next;
p->prior = pre;
p->data = a[i];
pre = p;
delete p;
}
}
//拷贝构造函数
template<class T>
DbLinkList<T>::DbLinkList(const DbLinkList& a)
{
DbNode<T>* p,*q,*pre;
head = new DbNode<T>;
pre = head;
q = a.head;
int count = 0;
T e;
while (q->next != NULL)
{
q = q->next;
count++;
}
for (size_t i = 0; i < count; i++)
{
getElem(e, i);
p = new DbNode<T>;
p->data = e;
p->next = NULL;
pre->next = p;
p->prior = pre;
pre = p;
delete p;
}
}
//获得元素
template<class T>
DbNode<T>* DbLinkList<T>::getElem(T e, int i)
{
int count = 0;
DbNode<T>* p;
p = this->head;
while (count != i)
{
p = p->next;
}
e = p->data;
return p;
}
//插入元素
template<class T>
bool DbLinkList<T>::insert(T e, int i)
{
DbNode<T>* p,*q;
T v;
p = this->getElem(v, i);
q = new DbNode<T>;
p->prior->next = q;
q->next = p;
q->prior = p->prior;
p->prior = q;
q->data = v;
return true;
}
//删除元素
template<class T>
bool DbLinkList<T>::Delete(T e, int i)
{
DbNode<T>* p;
p = this->getElem(T v, i);
p->next->prior = p->prior;
p->prior->next = p->next;
delete p;
return true;
}