c++问题,实现双向循环链表的插入删除等基本功能,以及构造函数和析构函数 2C

谢谢各位师哥师姐,么么哒
这是 节点定义
template
struct DoubleNode
{

T data;
DoubleNode *right;
DoubleNode *left;

DoubleNode() {}
DoubleNode(const T& data)
{this->data = data;}
DoubleNode(const T& data, DoubleNode* right,DoubleNode* left)
{this->data = data;
this->right = right;
this->left = left;}
};

类的定义

template //类的声明
class HDoubleCircular {

public:
HDoubleCircular() {}//构造函数不会写
~HDoubleCircular();//析构函数不会
bool IsEmpty() const {return head->right == head;}
int Length() const;
bool Find(int k, T& x) const;
T Get(int k)const;
int Indexof(const T& x) const;
int Search(const T& x) const;
HDoubleCircular& Delete(int k);
HDoubleCircular& Insert(int k, const T& x);
void Output(ostream& out) const;

private:
DoubleNode *head;
int size
};

2个回答

之前自己做的题目,类的名字不一定完全契合,但是应该可以参考。

#include "List.hpp"
#include
#include
#include
#include

void list::clear() {
listPointer p = this->head;
listPointer q = NULL;
while (p != NULL) {
q = p;
p = p->next;
delete q;
}
this->head = NULL;
this->_size = 0;
}

list::list() {
this->head = this->tail = NULL;
this->_size = 0;
}

list::list(const list& another) {
this->head = this->tail = NULL;
this->_size = 0;
this->assign(another);
}

list::list(const data_type datas[], int length) {
this->head = this->tail = NULL;
this->_size = 0;
this->assign(datas, length);
}

list& list::operator=(const list& another) {
this->assign(another);
return *(this);
}

list::~list() { this->clear(); }

bool list::empty() const { return this->_size == 0; }

list::size_type list::size() const { return this->_size; }

list::data_type& list::front() const {
return this->empty() ? reinterpret_cast<data_type>(NULL) : head->data;
}

list::data_type& list::back() const {
return this->empty() ? reinterpret_cast<data_type>(NULL) : tail->data;
}

inline std::string int2String(int a) {
std::stringstream ss;
ss << a;
return ss.str();
}

std::string list::toString(void) const {
if (this->_size == 0) {
return "NULL";
}
std::string ret;
listPointer p = this->head;
ret += "NULL<-";
while (p != NULL) {
ret += int2String(p->data);
if (p != this->tail) {
ret += "<->";
}
p = p->next;
}
ret += "->NULL";
return ret;
}

void list::assign(const list& another) {
if (!(this == &another)) {
this->clear();
node* p = another.head;
while (p != NULL) {
this->push_back(p->data);
p = p->next;
}
}
}

void list::assign(const data_type datas[], int length) {
this->clear();
for (int i = 0; i < length; i++) {
this->push_back(datas[i]);
}
}

void list::push_front(const data_type& data) {
this->insert(0, data);
assert(this->head->data == data);
}

void list::push_back(const data_type& data) {
this->insert(this->_size, data);
assert(this->tail->data == data);
}

void list::pop_front(void) { this->erase(0); }

void list::pop_back(void) { this->erase(this->_size - 1); }

void list::insert(int position, const data_type& data) {
if (position == 0) {
listPointer temp = new listNode(data, this->head);
this->head = temp;
assert(this->head != NULL);
if (this->_size == 0) {
this->tail = this->head;
} else {
this->head->next->prev = head;
}
this->_size++;
} else if (position == this->_size) {
listPointer temp = new listNode(data, NULL, this->tail);
this->tail->next = temp;
this->tail = this->tail->next;
this->_size++;
} else {
listPointer p = at(position - 1);
if (p != NULL) {
listPointer temp = new listNode(data, p->next, p);
p->next->prev = temp;
p->next = temp;
this->_size++;
assert(this->at(position)->data == data);
}
}
}

void list::erase(int position) {
if (this->empty()) return;
if (position == 0) {
if (this->_size == 1) {
delete this->head;
this->tail = this->head = NULL;
} else {
assert(head->next != NULL);
this->head = this->head->next;
delete this->head->prev;
this->head->prev = NULL;
this->_size--;
}
} else if (position == this->_size - 1) {
this->tail = this->tail->prev;
assert(tail != NULL);
delete this->tail->next;
this->tail->next = NULL;
this->_size--;
} else {
listPointer p = at(position);
if (p != NULL) {
p->prev->next = p->next;
p->next->prev = p->prev;
delete p;
this->_size--;
}
}
}

void list::split(int position, list* dest1, list* dest2) {
if (dest1 == dest2) {
throw dest1;
return;
}
if (position < 0 || position > this->_size) return;
listPointer p = this->head;
int counter = 0;
list temp1, temp2;
while (p != NULL) {
if (counter == position) {
break;
}
temp1.push_back(p->data);
p = p->next;
counter++;
}
while (p != NULL) {
temp2.push_back(p->data);
p = p->next;
}
(*dest1) = temp1;
(*dest2) = temp2;
}

list& list::merge(const list& src1, const list& src2) {
list temp;
if (src1.empty()) {
temp = src2;
} else {
temp = src1;
listPointer p = src2.head;
while (p != NULL) {
temp.push_back(p->data);
p = p->next;
}
}
*(this) = temp;
return *(this);
}

list& list::remove_if(bool (*condition)(list::listPointer)) {
listPointer p = this->head;
while (p != NULL) {
if (condition(p)) {
if (p == this->head) {
this->head = this->head->next;
if (this->head != NULL) {
this->head->prev = NULL;
}
delete p;
this->_size--;
p = this->head;
if (p == NULL) {
this->tail = NULL;
}
} else if (p == this->tail) {
this->tail = this->tail->prev;
this->tail->next = NULL;
delete p;
this->_size--;
p = NULL;
} else {
p->prev->next = p->next;
p->next->prev = p->prev;
listNode* q = p->next;
delete p;
p = q;
this->_size--;
}
} else {
p = p->next;
}
}
return *(this);
}

list& list::unique(void) {
listPointer slow, fast;
slow = this->head;
while (slow != NULL) {
fast = slow->next;
while (fast != NULL) {
if (fast->data == slow->data) {
if (fast == this->head) {
this->head = this->head->next;
if (this->head != NULL) {
this->head->prev = NULL;
} else {
this->tail = NULL;
}
fast = this->head;
} else if (fast == this->tail) {
this->tail = this->tail->prev;
this->tail->next = NULL;
delete fast;
fast = NULL;
} else {
fast->next->prev = fast->prev;
fast->prev->next = fast->next;
listPointer temp = fast;
fast = fast->next;
delete temp;
}
this->_size--;
} else {
fast = fast->next;
}
}
slow = slow->next;
}
return *(this);
}

list& list::reverse(void) {
listPointer p = this->head;
while (p != NULL) {
listPointer q = p->prev;
p->prev = p->next;
p->next = q;
p = p->prev;
}
listPointer q = this->tail;
this->tail = this->head;
this->head = q;
return *(this);
}

list::data_type& list::operator {
listPointer p = at(index);
assert(p != NULL);
return p->data;
}

list& list::operator+=(const list& another) {
return this->merge(*this, another);
}

std::ostream& operator<<(std::ostream& os, const list& li) {
return (os << li.toString());
}

觉得可以望采纳。

luojj26
Johnny_Law #include <string>, #include <sstream>
3 年多之前 回复
luojj26
Johnny_Law 还要多包含两个库,显示出了点问题。。。。
3 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
c++问题,实现双向循环链表的插入删除等基本功能,以及构造函数和析构函数
-
求大神指导双向循环链表问题【0xC0000005: 读取位置 0xfeeefeee 时发生访问冲突】
-
用python实现双向循环链表的问题
-
用c#做基于双向循环链表的长整数运算
-
设某链表中最常用的操作是在链表的尾部插入或删除元素,则选用下列
-
关于c++中的双向循环链表
-
单链表、单循环链表和双向链表概念就是混
-
ARM开发中,用C语言 实现双向链表
-
【数据结构】在c++平台上用循环链表实现节点删除操作
-
c#链表问题,包括最基础的单链表双链表以及循环链表的使用
-
小白关于仿照内核的C语言双向循环链表问题
-
各位大神求解!如何利用C++实现双向链表的相关操作
-
C语言单链表的插入求解了
-
链表插入删除顺序问题
-
C语言:合并有序双向链表问题
-
C语言双向链表求中点
-
循环链表的相关操作。
-
双向链表怎么提高插队效率及实现倒排
-
单链表的基本操作 c语言
-
程序员实用工具网站
目录 1、搜索引擎 2、PPT 3、图片操作 4、文件共享 5、应届生招聘 6、程序员面试题库 7、办公、开发软件 8、高清图片、视频素材网站 9、项目开源 10、算法 11、在线工具宝典大全 程序员开发需要具备良好的信息检索能力,为了备忘(收藏夹真是满了),将开发过程中常用的网站进行整理。 1、搜索引擎 1.1、秘迹搜索 一款无敌有良心、无敌安全的搜索引擎,不会收...
史上最详细的IDEA优雅整合Maven+SSM框架(详细思路+附带源码)
网上很多整合SSM博客文章并不能让初探ssm的同学思路完全的清晰,可以试着关掉整合教程,摇两下头骨,哈一大口气,就在万事具备的时候,开整,这个时候你可能思路全无 ~中招了咩~ ,还有一些同学依旧在使用eclipse或者Myeclipse开发,我想对这些朋友说IDEA 的编译速度很快,人生苦短,来不及解释了,直接上手idea吧。这篇文章每一步搭建过程都测试过了,应该不会有什么差错。本文章还有个比较优秀的特点,就是idea的使用,基本上关于idea的操作都算是比较详细的,所以不用太担心不会撸idea!最后,本文
我的 Input框 不可能这么可爱
作者:陈大鱼头 github: KRISACHAN &lt;input /&gt; 标签是我们日常开发中非常常见的替换元素了,但是最近在刷 whattwg 跟 MDN 的时候发现 跟 &lt;input /&gt; 有很多相关的属性,选择器都没怎么用过,所以就开篇文章来整理一下一些比较有趣或者实用的知识点。 本篇文章默认大家已经知道 &lt;input /&gt; 标签的基本用法,不会做过...
爬虫小程序 - 爬取王者荣耀全皮肤
你也想要王者荣耀全皮肤吗?
挑战10个最难的Java面试题(附答案)【上】
欢迎添加华为云小助手微信(微信号:HWCloud002或HWCloud003),验证通过后,输入关键字“加群”,加入华为云线上技术讨论群;输入关键字“最新活动”,获取华为云最新特惠促销。华为云诸多技术大咖、特惠活动等你来撩! 这是收集的10个最棘手的Java面试问题列表。这些问题主要来自 Java 核心部分 ,不涉及 Java EE 相关问题。你可能知道这些棘手的 Java 问题的答案...
如何优雅的爬妹子网
from urllib import request import os from user_agents import ua_list import time import random import re import requests from lxml import etree class MeiziSpider(): def init(self): self.url = ‘https:/...
GitHub开源的10个超棒后台管理面板
目录 1、AdminLTE 2、vue-Element-Admin 3、tabler 4、Gentelella 5、ng2-admin 6、ant-design-pro 7、blur-admin 8、iview-admin 9、material-dashboard 10、layui 项目开发中后台管理平台必不可少,但是从零搭建一套多样化后台管理并不容易,目前有许多开源、免费、...
花了20分钟,给女朋友们写了一个web版群聊程序
参考博客 [1]https://www.byteslounge.com/tutorials/java-ee-html5-websocket-example
对计算机专业来说学历真的重要吗?
我本科学校是渣渣二本,研究生学校是985,现在毕业五年,校招笔试、面试,社招面试参加了两年了,就我个人的经历来说下这个问题。 这篇文章很长,但绝对是精华,相信我,读完以后,你会知道学历不好的解决方案,记得帮我点赞哦。 先说结论,无论赞不赞同,它本质就是这样:对于技术类工作而言,学历五年以内非常重要,但有办法弥补。五年以后,不重要。 目录: 张雪峰讲述的事实 我看到的事实 为什么会这样 ...
面试官,不要再问我三次握手和四次挥手
三次握手和四次挥手是各个公司常见的考点,也具有一定的水平区分度,也被一些面试官作为热身题。很多小伙伴说这个问题刚开始回答的挺好,但是后面越回答越冒冷汗,最后就歇菜了。 见过比较典型的面试场景是这样的: 面试官:请介绍下三次握手 求职者:第一次握手就是客户端给服务器端发送一个报文,第二次就是服务器收到报文之后,会应答一个报文给客户端,第三次握手就是客户端收到报文后再给服务器发送一个报文,三次握手就...
linux:最常见的linux命令(centOS 7.6)
最常见,最频繁使用的20个基础命令如下: 皮一下,这都是干货偶,大佬轻喷 一、linux关机命令: 1.shutdown命令安全地将系统关机(推荐)参数说明: [-r] 重启计算器。 [-h] 关机后关闭电源〔halt〕。 [-c] cancel current process取消目前正在执行的关机程序。 [-time] 设定关机〔shutdown〕前的时间。 shutdown -h now ...
java学习路线导航【教学视频+博客+书籍整理】
在博主认为,学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,博主将为各位保驾护航,各位赶紧冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 Java基础教学视频 Java零基础教程视频(适合Java 0基础,Java初学入门)【推荐】 JavaSE进阶入门项目实战视频教程_动力节点【推荐】 毕向东Java基础视频教程...
java中的Static、final、Static final各种用法
前言 对Static、final、Static final这几个关键词熟悉又陌生?想说却又不知怎么准确说出口?好的,本篇博客文章将简短概要出他们之间的各自的使用,希望各位要是被你的面试官问到了,也能从容的回答… static 加载:static在类加载时初始化(加载)完成 含义:Static意为静态的,但凡被static 修饰说明属于类,不属于类的对象。 可修饰:Static 可以修饰 内部类、方...
HTML CSS整理笔记
常见字体单位: 1.em 移动端常用的字体尺寸单位,说白em就相当于“倍”,比如设置当前的div的字体大小为1.5em,则当前的div的字体大小为:当前div继承的字体大小*1.5。 但当div进行嵌套时,em始终按当前div继承的字体大小来缩放。 2.rem r是root的意思,即相对于根节点html的font-size进行缩放,当有嵌套关系时,嵌套关系的元素的字体大小始终按照根节点的字体大小...
有哪些让程序员受益终生的建议
从业五年多,辗转两个大厂,出过书,创过业,从技术小白成长为基层管理,联合几个业内大牛回答下这个问题,希望能帮到大家,记得帮我点赞哦。 敲黑板!!!读了这篇文章,你将知道如何才能进大厂,如何实现财务自由,如何在工作中游刃有余,这篇文章很长,但绝对是精品,记得帮我点赞哦!!!! 一腔肺腑之言,能看进去多少,就看你自己了!!! 目录: 在校生篇: 为什么要尽量进大厂? 如何选择语言及方...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 free -m 其中:m表示兆,也可以用g,注意都要小写 Men:表示物理内存统计 total:表示物理内存总数(total=used+free) use...
大学四年,我把私藏的自学「学习网站/实用工具」都贡献出来了
在分享之前,先说说初学者如何学习编程,这个话题想必非常的重要,要学好编程,给你一些学习网站也好、实用工具也好,但前提是你知道如何去学习它。 见过很多初学者,以及小鹿我刚开始学习的时候,也是自己瞎摸索,找不到路子,看什么书?看什么资料?编程的方向太多了,如果确定自己的方向?尤其是上大一、大二甚至大三还没有确定自己到底是学习前端还是后天,每天这学一点,那学一块,掌握那么多,没有一门精通的,去面试的时候...
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入 假设现有4个人...
Python 基础(一):入门必备知识
Python 入门必备知识,你都掌握了吗?
兼职程序员一般可以从什么平台接私活?
这个问题我进行了系统性的总结,以下将进行言简意赅的说明和渠道提供,希望对各位小猿/小媛们有帮助~ 根据我们的经验,程序员兼职主要分为三种:兼职职位众包、项目整包和自由职业者驻场。 所谓的兼职职位众包,指的是需求方这边有自有工程师配合,只需要某个职位的工程师开发某个模块的项目。比如开发一个 app,后端接口有人开发,但是缺少 iOS 前端开发工程师,那么他们就会发布一个职位招聘前端,来配合公司一...
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。
数据库优化 - SQL优化
前面一篇文章从实例的角度进行数据库优化,通过配置一些参数让数据库性能达到最优。但是一些“不好”的SQL也会导致数据库查询变慢,影响业务流程。本文从SQL角度进行数据库优化,提升SQL运行效率。 判断问题SQL 判断SQL是否有问题时可以通过两个表象进行判断: 系统级别表象 CPU消耗严重 IO等待严重 页面响应时间过长 ...
通俗易懂地给女朋友讲:线程池的内部原理
餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”
python学习目录
这是我学习python的一套流程,从入门到上手 一、Python入门、环境搭建、变量、数据类型 二、Python运算符、条件结构、循环结构 三、Python函数 四、做一次综合练习,做一个控制台的员工管理 """ 需求:员工管理系统 功能: 1.添加员工信息 2.删除员工信息 3.修改员工信息 4.查看单个员工信息 5.查看所有员工信息 6.退出 技术:函数、数据类型(字典列表)、循环、条...
刷了几千道算法题,这些我私藏的刷题网站都在这里了!
遥想当年,机缘巧合入了 ACM 的坑,周边巨擘林立,从此过上了"天天被虐似死狗"的生活… 然而我是谁,我可是死狗中的战斗鸡,智力不够那刷题来凑,开始了夜以继日哼哧哼哧刷题的日子,从此"读题与提交齐飞, AC 与 WA 一色 ",我惊喜的发现被题虐既刺激又有快感,那一刻我泪流满面。这么好的事儿作为一个正直的人绝不能自己独享,经过激烈的颅内斗争,我决定把我私藏的十几个 T 的,阿不,十几个刷题网...
2019年18家大厂Java面试题整理了350道(分布式+微服务+高并发+性能调优+框架源码)
前言 2019年还有不到2个月的时间就结束了,这一你,你收获了多少? 前段时间一直有粉丝问我,有没有今年一些大厂Java面试题总结?最新抽时间整理了一些,分享给大家,大家一起共享学习! 一、性能调优系列 1.Tomcat性能调优 JVM参数调优: -Xms&lt;size&gt; 表示JVM初始化堆的大小,一Xmx&lt;size&gt;表示JVM堆的最大值。这两个值的大小一般...
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
致 Python 初学者
欢迎来到“Python进阶”专栏!来到这里的每一位同学,应该大致上学习了很多 Python 的基础知识,正在努力成长的过程中。在此期间,一定遇到了很多的困惑,对未来的学习方向感到迷茫。我非常理解你们所面临的处境。我从2007年开始接触 python 这门编程语言,从2009年开始单一使用 python 应对所有的开发工作,直至今天。回顾自己的学习过程,也曾经遇到过无数的困难,也曾经迷茫过、困惑过。开办这个专栏,正是为了帮助像我当年一样困惑的 Python 初学者走出困境、快速成长。希望我的经验能真正帮到你
YouTube排名第一的励志英文演讲《Dream(梦想)》
Idon’t know what that dream is that you have, I don't care how disappointing it might have been as you've been working toward that dream,but that dream that you’re holding in your mind, that it’s po...
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
相关热词 c#实现简单的文件管理器 c# where c# 取文件夹路径 c# 对比 当天 c#输入double值 c# fir 滤波器 c# 和站 队列 c#控制某个usb口开关 c# txt 去空格 c# list 批量修改
立即提问