环境配置
codeblocks
windows10
项目结构
代码
DLinkListClass.cpp
#ifndef _DLINKLISTCLASS_H_
#define _DLINKLISTCLASS_H_
template <typename T>
class DLinkListNode
{
public:
T data;
DLinkListNode<T> *prior;
DLinkListNode<T> *next;
};
template <typename T>
class DLinkListClass
{
public:
DLinkListClass(void);
~DLinkListClass(void);
bool CreateListF(const T *a, int n) const;
bool CreateListR(const T *a, int n) const;
void Display(void) const;
int ListLength(void) const;
bool GetElem(int i, T &e) const;
bool LocateElem(const T &e, int &i) const;
bool ListInsert(int i, const T &e) const;
bool ListDelete(int i) const;
protected:
private:
DLinkListNode<T> *head;
};
template <typename T>
DLinkListClass<T>::DLinkListClass(void)
{
head = new DLinkListNode<T>;
head->next = nullptr;
head->prior = nullptr;
}
template <typename T>
DLinkListClass<T>::~DLinkListClass(void)
{
DLinkListNode<T> *p = head;
while (nullptr != p)
{
p = p->next;
delete head;
head = p;
}
}
template <typename T>
bool DLinkListClass<T>::CreateListF(const T *a, int n) const
{
if (n < 0)
{
return false;
}
DLinkListNode<T> *p;
for (int i = 0; i < n; ++i)
{
p = new DLinkListNode<T>;
p->data = a[i];
p->next = head->next;
if (nullptr != head->next)
{
head->next->prior = p;
}
head->next = p;
p->prior = head;
}
return true;
}
template <typename T>
bool DLinkListClass<T>::CreateListR(const T *a, int n) const
{
if (n < 0)
{
return false;
}
DLinkListNode<T> *p = head;
for (int i = 0; i < n; ++i)
{
p->next = new DLinkListNode<T>;
p->next->prior = p;
p = p->next;
p->data = a[i];
}
p->next = nullptr;
return true;
}
template <typename T>
void DLinkListClass<T>::Display(void) const
{
DLinkListNode<T> *p = head->next;
while (nullptr != p)
{
std::cout << p->data << " ";
p = p->next;
}
std::cout << std::endl;
}
template <typename T>
int DLinkListClass<T>::ListLength(void) const
{
DLinkListNode<T> *p = head->next;
int i = 0;
while (nullptr != p)
{
p = p->next;
++i;
}
return i;
}
template <typename T>
bool DLinkListClass<T>::GetElem(int i, T &e) const
{
if (i < 1)
{
return false;
}
DLinkListNode<T> *p = head->next;
int j = 1;
while (nullptr != p && i < j)
{
p = p->next;
++j;
}
if (nullptr == p)
{
return false;
}
else
{
e = p->data;
return true;
}
}
template <typename T>
bool DLinkListClass<T>::LocateElem(const T &e, int &i) const
{
DLinkListNode<T> *p = head->next;
int j = 1;
while (nullptr != p && e != p->data)
{
p = p->next;
++j;
}
if (nullptr == p)
{
return false;
}
else
{
i = j;
return true;
}
}
template <typename T>
bool DLinkListClass<T>::ListInsert(int i, const T &e) const
{
if (i < 1)
{
return false;
}
DLinkListNode<T> *p = head;
DLinkListNode<T> *q;
int j = 1;
while (nullptr != p && j < i)
{
p = p->next;
++j;
}
if (nullptr == p)
{
return false;
}
else
{
q = new DLinkListNode<T>;
q->data = e;
q->next = p->next;
if (nullptr != p->next)
{
q->next->prior = p;
}
p->next = q;
q->prior = p;
return true;
}
}
template <typename T>
bool DLinkListClass<T>::ListDelete(int i) const
{
if (i < 1)
{
return false;
}
DLinkListNode<T> *p = head;
DLinkListNode<T> *q;
int j = 1;
while (nullptr != p->next && j < i)
{
p = p->next;
++j;
}
if (nullptr == p->next)
{
return false;
}
else
{
q = p->next;
p->next = q->next;
if (nullptr != p->next)
{
q->next->prior = p;
}
delete q;
return true;
}
}
#endif // _DLINKLISTCLASS_H_
main.cpp
#include <iostream>
#include "DLinkListClass.h"
using namespace std;
int main(void)
{
DLinkListClass<int> L1;
DLinkListClass<int> L2;
const int n = 10;
int a[n] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
int i = 1;
int e;
L1.CreateListF(a, n);
L2.CreateListR(a, n);
cout << "L1: " << endl;
L1.Display();
cout << "L2: " << endl;
L2.Display();
L1.GetElem(i, e);
cout << "L1: i = 1, e = " << e << endl;
L2.LocateElem(e, i);
cout << "L2: e = " << e << ", i = " << i << endl;
L1.ListInsert(11, 0);
L1.ListDelete(1);
L2.ListInsert(1, 0);
L2.ListDelete(11);
cout << "L1: " << endl;
L1.Display();
cout << "L2: " << endl;
L2.Display();
cout << "L1.length = " << L1.ListLength() << endl;
system("PAUSE");
return 0;
}