【练习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的更多相关文章

  1. 第03章 AOP前奏

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

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

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

  3. 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 ...

  4. 【Weiss】【第03章】增补附注

    基本上每章到增补附注这里就算是结束了. 根据设想,每章的这一篇基本上会注明这一章哪些题没有做,原因是什么,如果以后打算做了也会在这里补充. 还有就是最后会把有此前诸多习题的代码和原数据结构放整理后,以 ...

  5. 【Weiss】【第03章】练习3.25:数组模拟队列

    [练习3.25] 编写实现队列的例程,使用 a.链表 b.数组 Answer: 在这章一开头就已经写了个链表的队列例程了,所以实际上只要做b小题就可以. 数组模拟队列和链表的两点小不同是: ①.数组空 ...

  6. 【Weiss】【第03章】练习3.16:删除相同元素

    [练习3.16] 假设我们有一个基于数组的表A[0,1...N-1],并且我们想删除所有相同的元素. LastPosition初始值为N-1,但应该随着相同元素被删除而变得越来越小. 考虑图3-61中 ...

  7. 【Weiss】【第03章】练习3.26:双端队列

    [练习3.26] 双端队列(deque)是由一些项的表组成的数据结构,对该数据结构可以进行下列操作: Push(X,D):将项X插入到双端队列D的前端. Pop(D):从双端队列D中删除前端项并返回. ...

  8. 【Weiss】【第03章】练习3.22、3.23、3.24:无代码题,栈的思考题

    [练习3.22] a.提出支持栈的Push和Pop操作以及第三种操作FindMin的数据结构,其中FindMin 返回该数据结构的最小元素,所有操作在最坏情况下的运行时间都是O(1). b.证明,如果 ...

  9. 【Weiss】【第03章】练习3.21:单数组模拟双栈

    [练习3.21] 编写仅用一个数组而实现两个栈的例程.除非数组的每一个单元都被使用,否则栈例程不能有溢出声明. Answer: 很简单,一个栈从数组头起,一个栈从数组尾起,分别保留左右栈头索引. 如l ...

  10. 【Weiss】【第03章】练习3.20:中缀表达式转后缀表达式

    [练习3.20] a.编写一个程序将中缀表达式转换为后缀表达式,该中缀表达式含括号及四则运算. b.把幂操作符添加到你的指令系统中去. c.编写一个程序将后缀表达式转化为中缀表达式. Answer: ...

随机推荐

  1. 2015-09-14-C++基础

    声明与定义 声音与定义的区别在于,声明没有给变量分配空间,而定义则给变量分配了空间:定义也是声明. extern int i; // 声明但未定义 int i ; //声明且定义 extern dou ...

  2. MOOC(2)-Django开发get、post请求,返回json数据

    1.对get请求直接返回参数 如果请求多个参数,也只能返回一个参数,这里只返回了username参数 如果想要返回多个参数值,可以返回json格式数据 2.对get请求返回json数据 # views ...

  3. 吴裕雄--天生自然KITTEN编程:角色交换

  4. mabatis中的元素属性

    resultMap属性id 唯一标识type 返回类型extends 继承别的resultMap,可选关联其他标签id 设置主键使用,使用此标签配置映射关系(可能不止一个)result 一般属性的配置 ...

  5. java的23种设计模式之建造者模式

    场景和本质 场景 本质 案例 原理 应用场景 场景和本质 场景 我们要建造一个复杂的产品.比如:神州飞船,Iphone.这个复杂的产品的创建.有这样一个问题需要处理:装配这些子组件是不是有个步骤问题? ...

  6. 解决sendmail发送邮件慢的问题

    sendmail默认会先监听本机的邮件服务,如果本机邮件服务访问不了,在访问其他的邮件服务器 自己测试将本机主机名(通过hostname命令查看)从/etc/hosts中删除,发送邮件的速度就非常快了 ...

  7. C++走向远洋——55(项目一3、分数类的重载、>>

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...

  8. rsync 增量同步总是多两行数据

    从google云机器rsync日志到本地,并通过logstash格式化后存入elasticsearch,但在实施过程中发现,每次rsync后通过查看elasticsearch,都会将上次已同步的数据再 ...

  9. LeetCode 题解 | 237. 删除链表中的节点

    题目描述: 请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点. 现有一个链表 -- head = [4,5,1,9],它可以表示为: 示例 1: 输入: hea ...

  10. 【Art】抗疫路上,温暖相伴

    2020年3月. 本应是春暖花开的时节,武汉却是寒冷的,整个中国也是寒冷的. 疫情将人们逼得退无可退,只能待在家里看着电视新闻与手机上一个个数字不断跳动,等待着它们背后前线的无数命悬一线的战士的胜利讯 ...