热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C++手动实现双向链表(作业版)

双向链表,并实现增删查改等功能首先定义节点类,类成员包含当前节点的值,指向下一个节点的指针和指向上一个节点的指针节点定义templa

双向链表,并实现增删查改等功能

首先定义节点类,类成员包含当前节点的值, 指向下一个节点的指针和指向上一个节点的指针

//节点定义
template
class Node {
public:Node* prior;T value;Node* next;Node():value(0),prior(nullptr),next(nullptr) {}Node(T n):prior(nullptr),value(n),next(nullptr) {}
};

然后是链表类的定义,主要包含了增删查改等功能

//双向链表定义
template
class LinkList_doubly {
public:Node* firstNode;Node* lastNode;LinkList_doubly();LinkList_doubly(int n, const T* arr);LinkList_doubly(const LinkList_doubly& link);~LinkList_doubly();LinkList_doubly& push_back(T n);LinkList_doubly& push_front(T n);LinkList_doubly& insert(int pos, int n, T* arr);LinkList_doubly& pop_front();LinkList_doubly& pop_back();LinkList_doubly& remove(int pos, int num);LinkList_doubly& reverse();T& operator[](int n);T& at(int n);LinkList_doubly& replace(int pos, int n, T* arr);int getLen() {return len;}void clear() {this->~LinkList_doubly();}void display();
private:int len = 0;Node* getNode_next(int n);};

各个函数解释:

LinkList_doubly();      默认构造函数

LinkList_doubly(const T* arr, int len);      一般构造函数

LinkList_doubly(const LinkList& link)           拷贝构造函数

~LinkList_doubly();     析构函数

LinkList_doubly& push_back(T n);    在尾部添加一个元素

LinkList_doubly& push_front(T n);     在头部添加一个元素

LinkList_doubly& insert(int pos, int n, T* arr);   在pos处插入n个元素

LinkList_doubly& pop_front();    删除第一个节点

LinkList_doubly& pop_back();    删除最后一个节点

LinkList_doubly& remove(int pos, int num);     删除pos开始的num个元素

LinkList_doubly& reverse();     反转链表

T& operator[](int n);     重载[ ]运算符,返回第n个节点的值

T& at(int n);                 与[ ]一样,只不过会检查索引是否越界

LinkList_doubly& replace(int pos, int n, T* arr);    替换n个节点

int getLen() {return len;}     返回长度,因为len是private

void clear() {this->~LinkList();}    清除链表

void display();    显示链表所有元素

Node* getNode_next(int n);     返回第n个节点的next指针

#include
using namespace std;template
class Node {
public:Node* prior;T value;Node* next;Node():value(0),prior(nullptr),next(nullptr) {}Node(T n):prior(nullptr),value(n),next(nullptr) {}
};template
class LinkList_doubly {
public:Node* firstNode;Node* lastNode;LinkList_doubly();LinkList_doubly(int n, const T* arr);LinkList_doubly(const LinkList_doubly& link);~LinkList_doubly();LinkList_doubly& push_back(T n);LinkList_doubly& push_front(T n);LinkList_doubly& insert(int pos, int n, T* arr);LinkList_doubly& pop_front();LinkList_doubly& pop_back();LinkList_doubly& remove(int pos, int num);LinkList_doubly& reverse();T& operator[](int n);T& at(int n);LinkList_doubly& replace(int pos, int n, T* arr);int getLen() {return len;}void clear() {this->~LinkList_doubly();}void display();
private:int len = 0;Node* getNode_next(int n);};//默认构造函数
template
LinkList_doubly::LinkList_doubly() {firstNode = nullptr;lastNode = nullptr;len = 0;
}//一般构造函数,用数组进行初始化
template
LinkList_doubly::LinkList_doubly(int n, const T* arr) {Node* temp1 = nullptr;Node* temp2 = nullptr;for (int i = 0; i (arr[i]);if ( i == 0 )firstNode = temp1;if ( i == n-1 )lastNode = temp1;temp1->prior = temp2;if ( i > 0 )temp2->next = temp1;temp2 = temp1;}this->len = n;
}//拷贝构造函数
template
LinkList_doubly::LinkList_doubly(const LinkList_doubly& link) {this->firstNode = link.firstNode;this->lastNode = link.lastNode;this->len = link.getLen();
}//析构函数
template
LinkList_doubly::~LinkList_doubly() {this->len = 0;Node* temp = firstNode;lastNode = nullptr;while ( firstNode ) {temp = firstNode;firstNode = firstNode->next;delete temp;temp = nullptr;}
}//在尾部添加一个元素
template
LinkList_doubly& LinkList_doubly::push_back(T n) {Node* newNode = new Node (n);newNode->prior = lastNode;lastNode->next = newNode;lastNode = newNode;len++;return *this;
}//在头部添加一个元素
template
LinkList_doubly& LinkList_doubly::push_front(T n) {Node* newNode = new Node (n);newNode->next = firstNode;firstNode->prior = newNode;firstNode = newNode;len++;return *this;
}//在position位置插入n个元素
template
LinkList_doubly& LinkList_doubly::insert(int pos, int n, T* arr) {Node* temp_end = getNode_next(pos);Node* temp_frOnt= getNode_next(pos-1);Node* temp_new = nullptr;for ( int i = 0; i (arr[i]);temp_front->next = temp_new;temp_new->prior = temp_front;temp_frOnt= temp_front->next;}temp_front->next = temp_end;temp_end->prior = temp_front;len += n;return *this;
}//删除第一个元素
template
LinkList_doubly& LinkList_doubly::pop_front() {firstNode = firstNode->next;firstNode->prior = nullptr;len--;return *this;
}//删除最后一个元素
template
LinkList_doubly& LinkList_doubly::pop_back() {lastNode = lastNode->prior;lastNode->next = nullptr;len--;return *this;
}//删除position开始的num个元素
template
LinkList_doubly& LinkList_doubly::remove(int pos, int num) {Node* temp_frOnt= getNode_next(pos-1);Node* temp_end = getNode_next(pos+num);temp_front->next = temp_end;temp_end->prior = temp_front;len -= num;return *this;
}//替换元素
template
LinkList_doubly& LinkList_doubly::replace(int pos, int n, T* arr) {Node* temp = getNode_next(pos);for ( int i = 0; i value = arr[i];temp = temp->next;}return *this;
}//反转链表,终极偷懒写法,实在不想动脑子了
template
LinkList_doubly& LinkList_doubly::reverse() {const int num = len;T arr[num];Node* temp = firstNode;for ( int i = 0; i len; i++ ) {arr[i] = temp->value;temp = temp->next;}temp = lastNode;for ( int i = 0; i len; i++ ) {temp->value = arr[i];temp = temp->prior;}return *this;
}//访问第n个元素
template
T& LinkList_doubly::operator[](int n){Node* temp = nullptr;if ( n <= len/2 ) {temp = firstNode;for ( int i = 0; i next;}} else {temp = lastNode;for ( int i = 0; i prior;}}return temp->value;}//访问第n个元素,增加索引检查template
T& LinkList_doubly::at(int n){if ( n <0 || n > len-1 ) {cout <<"[error]:index out of range" <}
//获取第n个Node的next指针
template
Node* LinkList_doubly::getNode_next(int n) {if ( n > len-1 ) {cout <<"[error]: illegal index" <* temp = firstNode;for ( int i = 0; i next;}return temp;
}//显示链表所有元素,会对链表正反向一致性进行检查
template
void LinkList_doubly::display() {const int num = len;T arr1[num];T arr2[num];Node* temp = firstNode;for ( int i = 0; i len; i++ ) {arr1[i] = temp->value;temp = temp->next;}temp = lastNode;for ( int i = 0; i len; i++ ) {arr2[i] = temp->value;temp = temp->prior;}for ( int i = 0; i len; i++ ) {if ( arr1[i] != arr2[len-1-i] ) {cout <<"第"<len; i++ ) {cout <value <<" ";temp = temp->next;}cout <}int main() {int arr[] = {1,5,7,3,5,3,1};LinkList_doubly link(sizeof(arr)/sizeof(int), arr);link.display();link.push_back(25);link.display();link.push_front(10);link.display();int arr2[] = {1,0,0,4};link.insert(2,sizeof(arr2)/sizeof(int), arr2);link.display();link.pop_front();link.display();link.pop_back();link.display();link.remove(2,2);link.display();int arr3[] = {2,3,5};link.replace(4, sizeof(arr3)/sizeof(int), arr3);link.display();link.reverse();link.display();cout <


推荐阅读
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
author-avatar
握住每一缕光
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有