与单循环链表类似,但析构函数需要注意
- 析构函数:
因为while循环的条件是p->next!=front,所以不能直接delete front;
template<class T>
TWLinkList<T>::~TWLinkList()
{
Node<T>* p = front;
while (p->next!=front)
{
Node<T>* temp = p;
p = p->next;
delete temp;
}
delete p;
}
所以不能直接delete front,这样会使判断语句失效(front被释放)
template<class T>
TWLinkList<T>::~TWLinkList()
{
Node<T>* p = front;
while (p->next!=front)
{
front = p;
p = p->next;
delete front;
}
delete p;
}
TowWayLinkList.h
#ifndef TOWWAYLINKLIST_H_
#define TOWWAYLINKLIST_H_
#include<iostream>
template<class T>
struct Node
{
T data;
struct Node<T>* prior;
struct Node<T>* next;
};
template<class T>
class TWLinkList
{
private:
Node<T>* front;
public:
TWLinkList();
TWLinkList(T a[],int n);
~TWLinkList();
int GetLength()const;
void Print()const;
Node<T>* Get(int i);
int Location(T x)const;
void Insert(int i, T x);
void Delete(int i);
void Sort();
void Connect(TWLinkList<T>& b);
};
template<class T>
TWLinkList<T>::TWLinkList()
{
front = new Node<T>;
front->next = front;
front->prior = front;
}
template<class T>
TWLinkList<T>::TWLinkList(T a[], int n)
{
front = new Node<T>;
Node<T>* rear = front;
for (int i = 0; i < n; i++)
{
Node<T>* s = new Node<T>;
s->data = a[i];
rear->next = s;
s->prior = rear;
rear = s;
}
rear->next = front;
front->prior = rear;
}
template<class T>
TWLinkList<T>::~TWLinkList()
{
Node<T>* p = front;
while (p->next!=front)
{
Node<T>* temp = p;
p = p->next;
delete temp;
}
delete p;
}
template<class T>
int TWLinkList<T>::GetLength() const
{
int i = 0;
Node<T>* p = front;
while (p->next != front)
{
p = p->next;
i++;
}
return i;
}
template<class T>
void TWLinkList<T>::Print() const
{
int i = 0;
Node<T>* p = front->next;
while (p->next != front)
{
std::cout << p->data << " ";
if (i % 5 == 4)
std::cout << std::endl;
p = p->next;
i++;
}
std::cout << front->prior->data << std::endl;
}
template<class T>
Node<T>* TWLinkList<T>::Get(int i)
{
int j = 0;
Node<T>* p = front;
if (i == GetLength())return front->prior;
while (p->next != front&&j!=i)
{
p = p->next;
j++;
}
return p;
}
template<class T>
int TWLinkList<T>::Location(T x)const
{
int i = 0;
Node<T>* p = front;
if (x == front->prior->data) return GetLength();
while (p->next != front)
{
p = p->next;
i++;
if (p->data == x)
return i;
}
return -1;
}
template<class T>
void TWLinkList<T>::Insert(int i, T x)
{
Node<T>* p = front;
if (i != 1)
p = Get(i - 1);
Node<T>* s = new Node<T>;
s->data = x;
s->next = p->next;
p->next->prior = s;
p->next = s;
s->prior = p;
}
template<class T>
void TWLinkList<T>::Delete(int i)
{
Node<T>* p = front;
if (i != 1)
p = Get(i - 1);
Node<T>* q = p->next;
p->next->next->prior = p;
p->next = q->next;
delete q;
}
template<class T>
void TWLinkList<T>::Sort()
{
for (int i = 0; i < GetLength(); i++)
{
Node<T>* p = front->next;
while (p->next != front)
{
if (p->data > p->next->data)
{
T t;
t = p->next->data;
p->next->data = p->data;
p->data = t;
}
p = p->next;
}
}
}
template<class T>
void TWLinkList<T>::Connect(TWLinkList<T>& b)
{
Node<T>* p = b.front;
b.front->next->prior = front->prior;
front->prior->next = b.front->next;
b.front->prior->next = front;
front->prior = b.front->prior;
p->next = p;
p->prior = p;
}
#endif // !TOWWAYLINKLIST_H_
Use.cpp
#include<iostream>
#include"TowWayLinkList.h"
const int SIZE = 10;
int main()
{
using std::cout;
using std::endl;
int ss[SIZE] = { 9,3,4,1,5,0,8,6,2,7 };
int qq[5] = { 0,1,2,3,4 };
TWLinkList<int> Grade(ss, SIZE);
TWLinkList<int> B(qq, 5);
cout << "链表内容:" << endl;
Grade.Print();
cout << "长度为:" << endl;
cout << Grade.GetLength() << endl;
cout << "查找5的位置:" << endl;
cout << Grade.Location(5) << endl;
cout << "删除第10个位置后的内容:" << endl;
Grade.Delete(10);
Grade.Print();
cout << "此时长度为:" << endl;
cout << Grade.GetLength() << endl;
cout << "在第9个位置插入11的内容:" << endl;
Grade.Insert(9, 11);
Grade.Print();
cout << "排序后:" << endl;
Grade.Sort();
Grade.Print();
Grade.Connect(B);
cout << "连接后:" << endl;
Grade.Print();
return 0;
}