主要是,感觉原来的链表例程通过Node的分配形成了链表,但是没有自动消除Node的办法比较危险,一旦在clear()之前把链表赋了其它值就内存泄漏了。

所以改了析构函数,自动清理分配出来的内存。既然改了析构同时就要改拷贝合成与拷贝赋值。

然后还给链表加了个尾指针,否则每次插入都要O(N)的时间真的很蛋疼……改了以后就是O(1)了

栈、队列、双链表的到时候再改。

添加的构造函数、赋值函数、析构函数如下:

 //构造函数,这部分直接增加在链表内部
public:
//拷贝构造函数,深拷贝
List<T>(const List<T>& another)
{
length = ;
front = rear = nullptr;
if (another.length != )
for (Node<T>* another_iter = another.front; another_iter != nullptr; another_iter = another_iter->next)
//additem会自动调整length等变量
additem(another_iter->data);
}
//析构函数
~List<T>(){ clear(); }
//拷贝赋值函数
List<T>& operator=(const List<T>& another)
{
//首先判断传入参数是否与当前为同一链表,如是,则不进行操作直接返回
if (front != another.begin())
{
clear();
if (another.length != )
for (Node<T>* another_iter = another.front; another_iter != nullptr; another_iter = another_iter->next)
//additem会自动调整length等变量
additem(another_iter->data);
}
return *this;
}

添加尾指针后,需要相应改变的包括:additem、remove、clear

additem:

 template <typename T> bool List<T>::additem(const T &item)
{
Node<T>* pnew = new Node<T>(item);
if (length == )
front = rear = pnew;
else
{//修改后直接尾指针往后接
rear->next = pnew;
rear = pnew;
}
++length;
return true;
}

remove:

 template <typename T> bool List<T>::remove(const T &item)
{
if (length == ) //先判断链表是否空避免front->data未定义
{
cout << "No data!" << endl;
return false;
}
Node<T>* iter = find_prev(item);
if (iter == nullptr && front->data != item)
{
cout << "Can not find!" << endl;
return false;
}
Node<T>* save;
if (front->data == item)
{//相应地注意尾指针的位置
if (length == )
rear = nullptr;
save = front;
front = front->next;
free(save);
}
else
{//相应地注意尾指针的位置
if (iter->next == rear)
rear = iter;
save = iter->next;
iter->next = iter->next->next;
free(save);
} --length;
return true;
}

clear:

 template <typename T> void List<T>::clear()
{
Node<T>* iter;
while (front != nullptr)
{
iter = front;
front = front->next;
delete iter;
}
front = nullptr;
rear = nullptr; //尾指针也要赋空
length = ;
}

【Weiss】【第03章】链表例程的一些修改的更多相关文章

  1. 【Weiss】【第03章】练习3.3:通过交换指针交换单/双链表元素

    [练习3.3] 通过之调整指针(而不是数据)来交换两个相邻的元素,使用 a.单链表 b.双链表 Answer: 先放测试代码,折叠标题可以看到分别是哪种链表的测试. 实测可满足题意,但单链表和双链表的 ...

  2. 【Weiss】【第03章】练习3.6:有序多项式相加

    [练习3.6] 编写将两个多项式相加的函数.不要毁坏输入数据.用一个链表实现. 如果这两个多项式分别有M项和N项,那么你程序的时间复杂度是多少? 两个按幂次升序的多项式链表,分别维护一个指针. 幂较小 ...

  3. 【Weiss】【第03章】练习3.2

    [练习3.2] 给你一个链表L和另一个链表P,它们包含以升序排列的整数.操作printlots(L,P)将打印L中那些由P所指定的位置上的元素. 例如,如果p=1,3,4,6,那么,L的第一.第三.第 ...

  4. 第03章 AOP前奏

    第03章 AOP前奏 提出问题 ●情景:数学计算器 ●要求 ①执行加减乘除运算 ②日志:在程序执行期间追踪正在发生的活动 ③验证:希望计算器只能处理正数的运算 ●常规实现 ●问题 ○代码混乱:越来越多 ...

  5. 第03章_基本的SELECT语句

    第03章_基本的SELECT语句 1. SQL概述 1.1 SQL背景知识 1946 年,世界上第一台电脑诞生,如今,借由这台电脑发展起来的互联网已经自成江湖.在这几十年里,无数的技术.产业在这片江湖 ...

  6. suse 12 二进制部署 Kubernetets 1.19.7 - 第03章 - 部署flannel插件

    文章目录 1.3.部署flannel网络 1.3.0.下载flannel二进制文件 1.3.1.创建flannel证书和私钥 1.3.2.生成flannel证书和私钥 1.3.3.将pod网段写入et ...

  7. 【Weiss】【第03章】链表例程

    这种基础例程,如之前所提,会有一个实现和一个简单的测试代码. 链表其实没什么可说的,其实包括后面的栈和队列也没什么可说的,直接放代码吧. 下面这个是测试代码 #include <iostream ...

  8. 【Weiss】【第03章】双链表例程

    双链表因为多了个前向指针,需要考虑的特殊因素多了一倍 所以中间插入(这儿没写)和中间删除会比较复杂. 其它倒没什么特别的,代码如下. 测试代码 #include <iostream> #i ...

  9. 【Weiss】【第03章】队列例程

    前几个例程还是相当简单的,把链表即时改了一下就是队列了. 还有想了一下,决定这种例程的代码放法是:先把测试代码默认折叠放在前面,然后把实现代码默认展开放在后面. 测试代码如下: #include &l ...

随机推荐

  1. Android开发之《ffmpeg解码mjpeg视频流》

    MJPEG格式和码流分析,MJPEG格式的一些简介 FFmpeg解码USB摄像头MJPEG输出:http://blog.csdn.net/light_in_dark/article/details/5 ...

  2. (六)mybatis-spring集成完整版

    mybatis-spring集成完整版 一.项目整体 mybatis接口层.mapper层 Service层 Test调用测试 二.自动生成代码-mybatis generator 主要修改: 接口. ...

  3. YY孵化虎牙,陌陌收购探探:你更看好谁?

    近日欢聚时代公布了2017第四季财报和全年财报,表现不错.其CFO 金秉表示,虎牙最近向美国证券交易委员会(SEC)提交了注册上市申请书草案文件,可能会在美国IPO上市,以便获取自己的投资者群体以融资 ...

  4. <NOI2002>银河英雄传说の思路

    emm并没有什么好说的.毕竟我这个蒟蒻都能yy出来 #include<cstring> #include<cstdio> #include<iostream> #i ...

  5. 网络编程OSI介绍

    网络编程 软件开发架构 c/s架构(client/server) c:客户端 s:服务端 客户端和服务器端架构,这种架构是从用户层划分的,一般客户端就是在用户电脑上安装的应用程序,而服务端就是公司里的 ...

  6. axios 二次封装

    一般项目往往要对 axios 库进行二次封装,添加一些自定义配置和拦截器等 案例 ./service/axios.js 1234567891011121314151617181920212223242 ...

  7. 不同环境下的mvn运行指令

    ///////////////// 研发环境 //////////////////////////////////////// 清空环境: mvn clean -DAPP_ENV=dev 建立Ecli ...

  8. 18岁,赚到了人生中的第一个10W!

    大家好,我是九歌 今年我18岁,赚到了我人生中的第一个10W 截至2019年10月14日,我已经做了43天的公众号啦,粉丝也悄然增长到了1W8,感谢各位读者朋友给我的支持和鼓励. 相信大部分读者都是从 ...

  9. Hihocoder1456 Rikka with Lattice

    众所周知,萌萌哒六花不擅长数学,所以勇太给了她一些数学问题做练习,其中有一道是这样的:勇太有一个$n times m$的点阵,他想要从这$n times m$个点中选出三个点 ${A,B,C}$,满足 ...

  10. 仿豆瓣首页弹性滑动控件|Axlchen's blog

    逛豆瓣的时候看到了这样的控件,觉得挺有趣,遂模仿之 先看看原版的效果 再看看模仿的效果 分析 控件结构分析 由于*ScrollView只能有一个child view,所以整个child view的结构 ...