就链表有多种
单链表、双链表、双向循环链表、带头结点的单链表、带头结点的双向链表、带头结点的双向循环链表
本次我运用带头结点的双向循环链表
同时运用模板实现
代码如下:
List.h
#pragma once
#include <iostream>
#include <assert.h>
using namespace std;
template <class T>
struct ListNode
{
T _data;//数据
ListNode<T>* _next;//指向下一结点
ListNode<T>* _prev;//指向上一结点
ListNode(const T& x = T())
:_data(x)
, _next(NULL)
, _prev(NULL)
{}
};
template <class T>
class List
{
typedef ListNode<T> Node;
public:
List()//构造函数
{
_head = new Node;
_head->_next = _head;
_head->_prev = _head;
}
void PushBack(const T& x)//尾插
{
Insert(_head->_prev, x);
}
void PopBack()//尾删
{
Earse(_head->_prev);
}
void PushFornt(const T& x)//头插
{
Insert(_head->_next, x);
}
void PopFront()//头删
{
Earse(_head->_next);
}
Node* Find(const T& x)//查找
{
Node* cur = _head->_next;
while (cur != _head)
{
if (cur->_data == x)
{
return cur;
}
cur = cur->_next;
}
return NULL;
}
void Insert(Node* pos, const T& x)//pos前插入x
{
Node* tmp = new Node(x);
Node* prev = pos->_prev;
Node* cur = pos;
prev->_next = tmp;
tmp->_prev = prev;
tmp->_next = cur;
cur->_prev = tmp;
}
void Earse(Node* pos)//删除pos位置的数据
{
assert(pos && pos != _head);
Node* prev = pos->_prev;
Node* next = pos->_next;
prev->_next = next;
next->_prev = prev;
pos = NULL;
}
void Print()//打印
{
Node* cur = _head->_next;
while (cur != _head)
{
cout << cur->_data << " ";
cur = cur->_next;
}
cout << endl;
}
protected:
Node* _head;//头结点
};
void TestList()
{
List<int> l;
l.PushBack(1);//头插测试
l.PushBack(2);
l.PushBack(3);
l.PushBack(4);
l.Print();
l.PopBack();//头删测试
l.PopBack();
l.PopBack();
l.Print();
l.PushFornt(1);//尾插测试
l.PushFornt(2);
l.PushFornt(3);
l.Print();
l.PopFront();//尾删测试
l.PopFront();
l.PopFront();
l.Print();
}
List.cpp
#include "List.h"
int main()
{
TestList();//测试
return 0;
}