双链表,链表的进阶版,基本的数据结构
与单链表不同的是,它的每个结点有两个指针,一个指向下一个结点,一个指向上一个结点
双链表的结点的数据结构
template <typename T>
struct Node
{
T data; //结点存储的数据
Node *next; //指向下一个结点的指针
Node *prev; //指向上一个结点的指针
Node(T x) //双链表的结点的构造函数
{
data = x;
next = NULL;
prev = NULL;
}
};
双链表的数据结构
template <typename T>
class DoublyLinkedList
{
Node<T> *head; //头结点
Node<T> *tail; //尾结点
int size; //元素的个数
};
DoublyLinkedList(); //无参构造函数
DoublyLinkedList(T x); //含参构造函数
DoublyLinkedList(vector<T> arr); //含参构造函数
~DoublyLinkedList(); //析构函数
void creatList(); //按流程创建一个链表
int getSize(); //获取链表的元素个数
bool isEmpty(); //判断链表是否为空
void clear(); //清空链表
void addAtHead(T _cur); //添加元素到第一个元素前
void addAtTail(T _cur); //添加元素到最后一个元素后
void addAtIndex(int index, T _cur); //添加元素到指定位置
T getHead(); //获取第一个元素
T getTail(); //获取最后一个元素
T get(int index); //获取指定元素
T removeHead(); //删除第一个元素
T removeTail(); //删除最后一个元素
T remove(int index); //删除指定元素
T setHead(T _cur); //修改第一个元素
T setTail(T _cur); //修改最后一个元素
T set(int index, T _cur); //修改指定元素
vector<T> list2Vector(); //链表转vector型数组
T* list2Array(); //链表转普通数组
void show(); //输出链表
T operator[] (int r); //重载[]运算符
把src/DoublyLinkedList.cpp添加到你的源文件中
以下为示例代码
#include"DoublyLinkedList.cpp"
int main()
{
DoublyLinkedList<int> l1;
l1.addAtHead(1);
l1.addAtHead(2);
l1.addAtHead(3);
l1.addAtHead(4);
l1.addAtTail(5);
l1.show();
cout << l1.getSize() << endl;
l1.addAtIndex(3, 998);
l1.show();
cout << l1.getSize() << endl;
cout << l1.getHead() << endl;
cout << l1.getTail() << endl;
cout << l1.get(4) << endl;
l1.show();
cout << l1.getSize() << endl;
cout << l1.remove(0) << endl;
l1.show();
cout << l1.getSize() << endl;
l1.show();
cout << l1.set(3, 342) << endl;
l1.show();
DoublyLinkedList<double> l2;
l2.creatList();
cout << l2 << endl;
cout << l2.getSize() << endl;
return 0;
}