wordpress下载网站模板,企业网络设计方案预算,网站空间怎么进,快速网站seo效果手写一个简单版本的list
设计一个名为 List 的 List 类#xff0c;该类具有以下功能和特性#xff1a;
1、基础成员函数
构造函数#xff1a;初始化 List 实例析构函数#xff1a;清理资源#xff0c;确保无内存泄露
2、核心功能
在 List 末尾添加元素在 List 开头添…手写一个简单版本的list
设计一个名为 List 的 List 类该类具有以下功能和特性
1、基础成员函数
构造函数初始化 List 实例析构函数清理资源确保无内存泄露
2、核心功能
在 List 末尾添加元素在 List 开头添加元素获取 List 中节点的数量删除 List 末尾的元素删除 List 开头的元素删除 List 中指定值的节点
3、迭代与遍历
打印链表中的元素
4、辅助功能
重载[]运算符以对链表进行索引访问重载运算符以打印链表
输入描述
题目的包含多行输入第一行为正整数 N, 代表后续有 N 行命令序列。
接下来 N 行每行包含一个命令命令格式为 [operation] [parameters] 具体命令如下
push_back 命令
格式push_back [value]功能在链表末尾添加值为 value 的元素
push_front 命令
格式push_front [value]功能在链表开头添加值为 value 的元素
pop_back 命令
格式pop_back功能删除链表末尾的元素
pop_front 命令
格式pop_front功能删除链表开头的元素
remove 命令
格式remove [value]功能删除链表中值为 value 的元素
clear 命令
格式clear功能清空链表
size 命令
格式size功能获取链表中节点的数量
get 命令
格式get [index]功能获取链表中索引为 index 的节点的值
print 命令
格式print功能打印链表中的元素
输出描述
输出为每行命令执行后的结果具体输出格式如下
**push_back 命令**无输出
**push_front 命令**无输出
**pop_back 命令**无输出
**pop_front 命令**无输出
**remove 命令**无输出
**clear 命令**无输出
**size 命令**输出一个整数独占一行代表当前 List 中元素的数量
**get 命令**输出一个整数独占一行代表 List 中索引为 index 的元素如果索引无效则输出 -1
**print 命令**按照顺序打印当前 List 包含的所有元素每个元素后都跟一个空格打印结果独占一行如果当前的 vector 为空则打印 empty #include iostream
#include stdexcept
#include iostream
#include algorithm
#include sstream
#include string
using namespace std;
template typename T
class List
{
public:templatetypename Lfriend ostream operator(ostream os, const ListL pt);
private://定义链表结点struct Node{T data;Node* next;Node* prev;//含参的默认构造函数Node(const Tvalue, Node* nextNode nullptr,Node* prevNode nullptr){data value;next nextNode;prev prevNode;}};//头尾结点指针Node* head;Node* tail;//结点数量size_t size;public:List(){head NULL;tail NULL;size 0;}~List(){clear();//把链表空间释放}//前插void push_front(const T value){//创造新节点next指向的是headNode* newNode new Node(value, head, NULL);if (head ! NULL)//如果链表非空{head-prev newNode;}else{//如果链表是空的则首尾都要指向这个独苗tail newNode;}head newNode;//头结点前移size;}//尾插void push_back(const T value){Node* newNode new Node(value, NULL, tail);if (tail ! NULL)tail-next newNode;elsehead newNode;tail newNode;//尾结点后移size;//链表长度加1}size_t getSize() const{return size;}//访问:循环index次然后返回当前结点的值即可T operator[](size_t index){Node* cur head;//head相当于是下标为0的元素while (index--){if (cur NULL)throw out_of_range(index out of range);cur cur-next;}return cur-data;}const T operator[](size_t index) const{Node* cur head;//head相当于是下标为0的元素while (index--){if (cur NULL)throw out_of_range(index out of range);cur cur-next;}return cur-data;}//删除链表末尾元素// 首先直接获取尾结点的前一个结点// 然后尾结点prev指向null,然后尾结点前移// 最后将新尾结点的next指向nullsize--//void pop_back()//{// if (tail NULL)// cout empty endl;// else// {// Node* tailPre tail-prev;//tailPre可能为空// tail-prev NULL;// tail tailPre;// if (tail)// tail-next NULL;// else// head NULL;// size--;// } //}//标准(此方法更好释放了tail的内存没有造成内存遗失)void pop_back(){if (size 0){Node* newTail tail-prev;//直接把尾结点删了简单粗暴。//结点delete之后它的prev和next指针都自动消失了delete tail;//虽然空间没了但是Node*tail这个指针本身还在健在的tailnewTail;if (tail)tail-next NULL;elsehead NULL;size--;}}void pop_front(){if (size 0){Node* newHead head-next;delete head;head newHead;if (head)head-prev NULL;elsetail NULL;size--;}}Node* getNode(const T val){//遍历,用whileNode* node head;while (node!NULL){if (node-val val)return node;node node-next;}return NULL;}//删除结点void remove(const T val){Node* node head;while (node ! NULL){if (node-data val){if (node head node tail){node NULL;}else if (node head){head head-next;head-prev NULL;}else if (node tail){tail tail-prev;tail-next NULL;}else{node-prev-next node-next;node-next-prev node-prev;}size--;}node node-next;}}bool empty(){return size 0;}void clear(){//每次都设置一个指针指向要被删除的元素while (head!NULL){Node* node head;//从头开始head head-next;//头不断后移delete node;}tail NULL;size 0;}Node* begin(){return head;}Node* end(){return NULL;}void printElements() const{Node* node head;while (node ! NULL){cout node-data ;node node-next;}cout endl;}};//重载运算符
templatetypename T
ostream operator(ostream os, const ListT pt)
{for (typename ListT::Node* cur pt.head; cur ! NULL; cur cur-next){os cur-data ;}os endl;return os;
}int main() {// 创建一个 List 对象Listint myList;int N;std::cin N;// 读走回车getchar();std::string line;// 接收命令for (int i 0; i N; i) {std::getline(std::cin, line);std::istringstream iss(line);std::string command;iss command;int value;if (command push_back) {iss value;myList.push_back(value);}if (command push_front) {iss value;myList.push_front(value);}if (command pop_back) {myList.pop_back();}if (command pop_front) {myList.pop_front();}if (command remove) {iss value;myList.remove(value);}if (command clear) {myList.clear();}if (command size) {std::cout myList.getSize() std::endl;}if (command get) {iss value;std::cout myList[value] std::endl;}if (command print) {if (myList.getSize() 0) {std::cout empty std::endl;}else {myList.printElements();}}}return 0;
}