c++实现双向循环链表
本双向循环链表实现了:
- 无参默认构造:通过尾插法添加结点;
- 有参默认构造:传入数组和数组长度;
- 删除操作;
- 按位查找操作;
- 按值查找操作;
- 链表长度内的插入操作;
- 尾插法;
- 输出链表;
#include <iostream>
using namespace std;
template<class T>
class Node
{
public:
T data;
Node<T>* prior;
Node<T>* next;
};
template<class T>
class DLinkList
{
private:
Node<T>* front;
int length;
public:
DLinkList();//默认构造函数
~DLinkList();
DLinkList(T a[], int length);
void printList();
Node<T>* getElem(int No);
void insert(int No, T data);
void Delete(int No);
int locateElem(T data);
void push_back(T data);
};
template <class T>
DLinkList<T>::DLinkList()
{
this->front = new Node<T>;
front->next = front;
front->prior = front;
this->length = 0;
};
template <class T>
DLinkList<T>::DLinkList(T a[], int length)
{
this->front = new Node<T>;
front->next = front;
front->prior = front;
this->length = 0;
Node<T>* p = front;//建立工作指针
for (int i = 0; i < length; i++)
{
Node<T>* temp = new Node<T>;
temp->data = a[i];
temp->prior = p;
temp->next = p->next;
p->next = temp;
p = temp;
this->length++;
}
};
template <class T>
DLinkList<T>::~DLinkList()
{
Node<T>* p = front;
for (int i = 0; i <= this->length; i++)
{
front = p;
p = p->next;
delete front;
}
};
template <class T>
void DLinkList<T>::printList()
{
Node<T>* p = front->next;
for (int i = 0; i < this->length; i++)
{
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
template <class T>
Node<T>* DLinkList<T>::getElem(int No)
{
if (No >= 0 && No <= this->length)
{
Node<T>* p = front;
int j = 0;
while (No != j)
{
p = p->next;
j++;
}
return p;
}
else
{
cout << "查找位置有误" << endl;
return NULL;
}
}
template <class T>
void DLinkList<T>::insert(int No, T data)
{
Node<T>* p = this->getElem(No);
if (p != NULL)
{
Node<T>* newNode = new Node<T>;
newNode->data = data;
newNode->next = p->prior->next;
newNode->prior = p->prior;
p->prior->next = newNode;
p->prior = newNode;
this->length++;
}
else
{
cout << "插入位置错误,超出插入范围" << endl;
}
}
template <class T>
void DLinkList<T>::Delete(int No)
{
Node<T>* p = this->getElem(No);
if (p != NULL)
{
p->prior->next = p->next;
p->next->prior = p->prior;
delete p;
this->length--;
cout << "删除成功" << endl;
}
else
{
cout << "删除失败" << endl;
}
}
template <class T>
int DLinkList<T>::locateElem(T data)
{
Node<T>* p = front->next;
int i = 1;
while (p != front)
{
if (p->data == data)
{
return i;
}
else
{
i++;
p = p->next;
}
}
return -1;
};
template <class T>
void DLinkList<T>::push_back(T data)
{
Node<T>* p = this->getElem(this->length);
Node<T>* newNode = new Node<T>;
newNode->data = data;
newNode->next = p->next;
newNode->prior = p;
p->next = newNode;
this->length++;
};
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9 };
int arrLength = sizeof(arr)/ sizeof(arr[0]);
DLinkList<int> DL1(arr,arrLength);
DL1.printList();
cout << "查找3号位置:"<<DL1.getElem(3)->data << endl;
cout << "在一号位置插入10" << endl;
DL1.insert(1, 10);
DL1.printList();
cout << "删除8号位置" << endl;
DL1.Delete(8);
DL1.printList();
cout << "查找值为7的链表位置" << DL1.locateElem(7) << endl;
DLinkList<char> DL2;
cout << "测试默认构造和尾插法" << endl;
DL2.push_back('B');
DL2.push_back('C');
DL2.printList();
system("pause");
return 0;
}
测试结果如下: