【Weiss】【第03章】练习3.2
【练习3.2】
给你一个链表L和另一个链表P,它们包含以升序排列的整数。操作printlots(L,P)将打印L中那些由P所指定的位置上的元素。
例如,如果p=1,3,4,6,那么,L的第一、第三、第四和第六个元素被打印出来。
你应该只使用基本的表操作,该过程的运行时间是多少?
Answer:
老样子,先放折叠的实测代码。
#include <iostream>
#include <string>
#include "linklist.h"
using namespace std;
using namespace linklist;
template class List<unsigned int>;
template class List<string>;
int main(void)
{
List<unsigned int> number; //测试按升序插入
cout << "/*addinorder()*/" << endl;
number.addinorder();
number.addinorder();
number.addinorder();
number.addinorder();
number.addinorder();
number.addinorder();
number.addinorder();
number.traverse();
cout << "\n/*end*/\n\n" << endl; List<string> word;
cout << "/*initialize*/" << endl;
word.additem("The");
word.additem("day");
word.additem("after");
word.additem("tommorow");
word.additem("will");
word.additem("be");
word.additem("a");
word.additem("sunny");
word.additem("day");
word.traverse();
cout << "\n/*end*/\n\n" << endl; //测试printlots,打印word的第2,3,5,7个元素
cout << "/*printlots()*/" << endl;
word.printlots(number);
cout << "\n/*end*/\n\n" << endl; system("pause");
}
在对此前的链表例程
http://www.cnblogs.com/catnip/p/4328889.html
添加下面的成员函数后(类内成员函数声明需自行添加),该实测代码可以正确运行。
因为条件的链表是升序的,所以虽然没要求写,这儿首先还是在链表例程里面加了个自动按升序插入的例程。
//练习3.2新增,按序插入
template <typename T> bool List<T>::addinorder(const T &item)
{
Node<T>* pnew = new Node<T>(item);
Node<T>* curr = front;
Node<T>* prev = nullptr;
while (curr != nullptr && curr->data < item)
{
prev = curr;
curr = curr->next;
}
//如果元素小于头元素,则头指针指向新节点
if (prev == nullptr)
front = pnew;
//否则,找到最后一个不大于元素的节点,将节点插入在此后
else
prev->next = pnew;
//最后,新节点的后向指针连接第一个比新元素大(或为空)的节点
pnew->next = curr;
++length;
return true;
}
然后,虽然题目中要求两个链表元素都是整数,实际上只要第二个链表元素是整数就可以。
假如第一个链表的元素不是整数,那么类模板的一个实例就要访问另一个实例,则需加上一句友元声明。
//头节点及链表主体操作
template <typename T> class List
{
template <typename X> friend class List;
//......
}
最后,按题目要求打印的例程
//练习3.2新增,坑爹的函数....
template <typename T> void List<T>::printlots(const List<unsigned int>& inorder)
{
//计数器,记录已经查询到当原链表第几个元素
//不同于数组,计数器从“第一个”开始计算
unsigned int counter = ;
Node<T>* scan = front;
for (Node<unsigned int>* iter = inorder.front; iter != nullptr; iter = iter->next)
{
//遍历辅助链表,iter->data表示“需要原链表输出其第iter->data个元素”
//当data过大时直接返回
if (iter->data > length)
return;
//迭代直至counter==index并打印
for (; counter < iter->data; ++counter)
scan = scan->next;
cout << scan->data << ends;
}
}
【Weiss】【第03章】练习3.2的更多相关文章
- 第03章 AOP前奏
第03章 AOP前奏 提出问题 ●情景:数学计算器 ●要求 ①执行加减乘除运算 ②日志:在程序执行期间追踪正在发生的活动 ③验证:希望计算器只能处理正数的运算 ●常规实现 ●问题 ○代码混乱:越来越多 ...
- 第03章_基本的SELECT语句
第03章_基本的SELECT语句 1. SQL概述 1.1 SQL背景知识 1946 年,世界上第一台电脑诞生,如今,借由这台电脑发展起来的互联网已经自成江湖.在这几十年里,无数的技术.产业在这片江湖 ...
- 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 ...
- 【Weiss】【第03章】增补附注
基本上每章到增补附注这里就算是结束了. 根据设想,每章的这一篇基本上会注明这一章哪些题没有做,原因是什么,如果以后打算做了也会在这里补充. 还有就是最后会把有此前诸多习题的代码和原数据结构放整理后,以 ...
- 【Weiss】【第03章】练习3.25:数组模拟队列
[练习3.25] 编写实现队列的例程,使用 a.链表 b.数组 Answer: 在这章一开头就已经写了个链表的队列例程了,所以实际上只要做b小题就可以. 数组模拟队列和链表的两点小不同是: ①.数组空 ...
- 【Weiss】【第03章】练习3.16:删除相同元素
[练习3.16] 假设我们有一个基于数组的表A[0,1...N-1],并且我们想删除所有相同的元素. LastPosition初始值为N-1,但应该随着相同元素被删除而变得越来越小. 考虑图3-61中 ...
- 【Weiss】【第03章】练习3.26:双端队列
[练习3.26] 双端队列(deque)是由一些项的表组成的数据结构,对该数据结构可以进行下列操作: Push(X,D):将项X插入到双端队列D的前端. Pop(D):从双端队列D中删除前端项并返回. ...
- 【Weiss】【第03章】练习3.22、3.23、3.24:无代码题,栈的思考题
[练习3.22] a.提出支持栈的Push和Pop操作以及第三种操作FindMin的数据结构,其中FindMin 返回该数据结构的最小元素,所有操作在最坏情况下的运行时间都是O(1). b.证明,如果 ...
- 【Weiss】【第03章】练习3.21:单数组模拟双栈
[练习3.21] 编写仅用一个数组而实现两个栈的例程.除非数组的每一个单元都被使用,否则栈例程不能有溢出声明. Answer: 很简单,一个栈从数组头起,一个栈从数组尾起,分别保留左右栈头索引. 如l ...
- 【Weiss】【第03章】练习3.20:中缀表达式转后缀表达式
[练习3.20] a.编写一个程序将中缀表达式转换为后缀表达式,该中缀表达式含括号及四则运算. b.把幂操作符添加到你的指令系统中去. c.编写一个程序将后缀表达式转化为中缀表达式. Answer: ...
随机推荐
- 亚马逊Prime会员的杀价,能说明会员+会越来越便宜吗?
前段时间,京东又坑了!京东调整了物流方案--从原来的购物不满49元只需6元运费,调整到购物不满46元运费15元,运费猛涨了9元!原本京东PLUS会员每月有5张免运费券,但在运费涨价后运费券限制在6元, ...
- 腾讯云服务器(centos7.2)上安装MySQL
1.到MySQL官网找到相应的版本 https://dev.mysql.com/downloads/repo/yum/ 找到下面的Linux7,即CentOS7(CentOS是Red Hat旗下的)点 ...
- Ionic3学习笔记(六)存储之使用 SQLite
本文为原创文章,转载请标明出处 目录 安装 CURD操作 1. 安装 命令行输入 ionic cordova plugin add cordova-sqlite-storage npm install ...
- 将js进行到底:node学习5
HTTP开发之Connect工具集--中间件 继学习node.js的TCP API和HTTP API之后,node.js web开发进入了正轨,但这就好像Java的servlet一样,我们不可能使用最 ...
- VMware虚拟机里安装CentOS 6.3图文教程
著名服务器版本 CentOS 6.3 已经发布 http://www.centoscn.com/CentosSoft/iso/2013/0720/370.html CentOS 6.3 网易镜像下载: ...
- 8.2.2 使用Java8增强的Iterator遍历集合元素
8.2.2 使用Java 8增强的Iterator遍历集合元素 Iterator接口方法 程序示例 Iterator仅用于遍历集合 Iterator必须依附于Collection对象 修改迭代变量的值 ...
- 高效能Windows人士的N个习惯之一:启动篇
接触电脑十多年,经历了各种折腾阶段,这几年开始沉静下来,不再追求花哨的界面与应用,只注重工作的效率,逐渐养成了一套自己的操作习惯,感觉不错,特撰文分享.标题借用了一下<高效能人士的七个习惯> ...
- tar:file-changed-as-we-read-it报错处理
在使用tar命令对Mysql的数据目录进行备份打包时出现如下报错: tar cvzf mysql.tgz mysql /bin/tar: /path/to/mysql: file changed as ...
- mysql 分表实现方法详解
如果你需要进行mysql分表了我们就证明你数据库比较大了,就是把一张表分成N多个小表,分表后,单表的并发能力提高了,磁盘I/O性能也提高了.并发能力为什么提高了呢,因为查寻一次所花的时间变短了,如果出 ...
- JobScheduler 和 JobService
使用AlarmManager.IntentService和PendingIntent相互配合,创走周期性的后台任务,实现一个完全可用的后台服务还需要手动执行以下操作. 计划一个周期性任务 ...