【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: ...
随机推荐
- c/c++ main 函数命令行参数的使用
C程序最大的特点就是所有的程序都是用函数来装配的.main()称之为主函数,是所有程 序运行的入口.其余函数分为有参或无参两种,均由main()函数或其它一般函数调用,若调用的是有参函数,则参数在调用 ...
- Golang Interface 解析
转自 https://zhuanlan.zhihu.com/p/27652856 先看一段代码: 123456789101112 func (x interface{}) { if x == nil ...
- unittest(9)- 使用ddt给测试用例传参
# 1. http_request.py import requests class HttpRequest: def http_request(self, url, method, data=Non ...
- 吴裕雄--天生自然 R语言开发学习:高级编程
运行的条件是一元逻辑向量(TRUE或FALSE)并且不能有缺失(NA).else部分是可选的.如果 仅有一个语句,花括号也是可以省略的. 下面的代码片段是一个例子: plot(x, y) } else ...
- 吴裕雄--天生自然 PHP开发学习:在centos7操作系统下使用命令安装ThinkPHP 5框架
前提条件是系统已经安装好了php,一般来说安装好的php根目录是:/var/www/html 系统安装composer(我使用的系统是centos7) .使用命令下载 curl -sS https:/ ...
- 从TP-Link到雷蛇,纷纷入局智能手机业到底想干什么?
"眼看他起朱楼,眼看他宴宾客,眼看他楼塌了",这句形容世态炎凉的话其实与智能手机市场更为相像.诺基亚的辉煌与没落.黑莓的强势与消声无迹.摩托罗拉的数次易手.小米的横空出世与 ...
- 添砖加瓦:简述ELK部署
1.准备工作 ELK下载:https://www.elastic.co/downloads/ jdk version:1.8.0_162 2.环境搭建 ElasticSearch: (1)不能使用ro ...
- git基本命令(二)
忽略文件 git可以将用户指定的文件或者目录排除在版本之外,它会检查代码仓库目录下是否存在名为.gitignore文件,如果存在就会一行一行读取这个文件的内容,会将每一行指定的文件或目录排除 ...
- Mac开发环境部署
1. 安装 Xcode command line tools xcode-select --install 2. 安装 Homebrew 安装 Homebrew 之前,必须先安装 Xcode Comm ...
- windows 10 右键菜单注册表位置
1. 查找 1.1. 打开注册表 # 1. 使用快捷键打开 “运行” win + r # 2. 在 “运行” 中输入 regedit # 3. 回车 1.2. 点击 查找 # 1. 方法 1 : 点击 ...