就链表有多种
单链表、双链表、双向循环链表、带头结点的单链表、带头结点的双向链表、带头结点的双向循环链表
本次我运用带头结点的双向循环链表
同时运用模板实现
代码如下:
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;
}
这篇博客主要介绍了如何设计并使用模板实现带头结点的双向循环链表,包括链表的插入和删除操作。讨论了不同类型的链表,如单链表、双链表等,但重点在于双向循环链表的应用。
1933

被折叠的 条评论
为什么被折叠?



