DS02--线性表
一、PTA实验作业
题目1:线性表元素的区间删除
给定一个顺序存储的线性表,请设计一个函数删除所有值大于min而且小于max的元素。删除后表中剩余元素保持顺序存储,并且相对位置不能改变。
1. 设计思路
定义整型变量统计变量n,循环变量i
if (最小值大于等于最大值)
return L
for( i=0 to 链表最后)
if ( L->Data[i]满足条件 )
统计变量n++
否则 L->Data[i-n]=L->Data[i] 剔除不合题意的值
i++ end
L->Last-=n改变链表最后位置
2.代码截图
3.PTA提交列表说明
4.调试问题
- 思路错误:最初始参考课堂派的一道题来做的,后来发现不用那么麻烦,一层循环就可以
题目2:判断链表结点对称
设计算法,判断带头结点的循环双向链表中的数据结点是否对称。 如果对称,输出“yes” 如果不对称,输出“no” 链表空则输出“NULL”
1.设计思路
------------初始化函数-------------
创建头节点L
L的前后指向自己,构成循环链表
销毁函数
定义L及其下一个节点的代理工作结构体指针s,p
while (p指针没指到头结点L)
delete pre删除前一节点
pre = p;同时向后移
p = p->next;
end p==L循环结束
delete pre 删除最后节点
--------------输出函数---------------
定义L下一个节点的代理工作结构体指针s
若L为空 输出NULL
while(s指针没指到头结点L)
输出s->data
指针后移
end s==L
换行
---------------插入函数--------------
定义计数变量j=0
定义L的代理工作结构体指针p,带插入节点指针s
while(前i-1个节点且不为空)寻找插入位置
p向后移
j计数++
end j==i-1找到第i-1个元素
s申请空间并给数据域赋值
s->next = p->next 在p后插入s新节点
s->prior = p 双向
p->next->prior = s
p->next = s
--------------判断对称函数-------------
定义L前后节点的代理工作结构体指针s,r
while (s不等于r)
若 s数据域不等于r数据域 不对称
return 0
否则 继续循环链表
s,r分别向前后移动遍历链表
end 链表遍历结束
return 1 成功循环则对称
2.代码截图
3.PTA提交列表说明
4.调试问题
4.1 编译错误:没有加c++头文件
4.2 运行超时:销毁函数错误
调试过程:
最初在dev运行时答案正确但会停止工作
所以我先把判断是否对称函数注释掉,发现在输出链表后就会停止工作
最后检查出是销毁函数的条件错误,因为是双向链表,所以在循环到头结点L时就停止销毁,而我惯性思维将条件写成不为空
4.3 部分正确:空表输出NULL
题目3:顺序表删除重复元素
设计一个算法,从顺序表中删除重复的元素,并使剩余元素间的相对次序保存不变。
1. 设计思路
-----------------创建函数----------------
定义循环变量i
若 节点个数n为0 exit 0
为L申请存放空间
for(i=0 to n)
L数据域赋值
end 数据存放结束
链表长度=n
------------------输出函数-----------------
定义循环变量i
for(i=0 to 长度-1)
输出数据加空格
end 输出n-1个数据
输出最后一个数据不加空格
---------------删除重复元素函数--------------
定义循环变量i=0,j=1,记录变量len=1
while (j小于长度)遍历链表
for(i=0 to len)
若 有重复元素
break 跳出
若 i==len
剩余元素加入
否则 j++
end
2.代码截图
3.PTA提交列表说明
4.调试问题
部分正确:重复元素,只判断了前后元素是否重复。
二、截图本周题目集的PTA最后排名
1.顺序表PTA排名
2.链表PTA排名
3.我的总分:2.5分
三、本周学习总结
1.谈谈你本周数据结构学习时间是如何安排,对自己安排满意么,若不满意,打算做什么改变?
这周的话,几乎都在PTA上磨时间,有收获也有失落,可能还没能将链表理解透彻,并不能在题目中较好的使用链表。每道题都是极大的挑战。碰到做不出的操作,我会先百度看完思路后,再自己动手打出来,模仿也是种学习。当自己打完后还有不会的地方,这时会自己思考。我认为这种学习方式很适合自己,会坚持下去。
2.谈谈你对线性表的认识?
2.1顺序表:连续的内存划分及数据存储
性质:
①随机访问(查找快,直接定位)
②存储密度高,只存储数据元素
③插入、删除操作需要大量移动元素
插入:
①时间复杂度:O(n)
②空间复杂度:O(1)
删除:
①时间复杂度:O(n)
②空间复杂度:O(1)
2.2单链表:非连续的内存划分
性质:
①逐个遍历(查找慢)
②存储密度相对低,存放指针域
③插入、删除操作快
2.3双链表
在单链表的基础上,结构体增加一个指向前驱结点的prior的指针
2.4循环单链表
在单链表的基础上,在表尾的next指向表头 r->next = L
2.5循环双链表
在循环单链表基础上,结构体增加一个指向前驱结点的prior的指针,加上L->prior = r;r->next = L
3.代码Git提交记录截图
四、阅读代码
题目:重排链表
void reorderList(ListNode head)
{
if(head == null || head.next == null)
return;
ListNode p = head;
ListNode q = head.next;
while(q != null && q.next != null)
{
p = p.next;
q = q.next.next;
}
//中间节点
q = p.next;
p.next = null;
//将后半段逆序
ListNode rHead = null;
while(q != null)
{
ListNode r = q.next;
q.next = rHead;
rHead = q;
q = r;
}
//向前半段插入
q = rHead;
p = head;
while(p != null && q != null)
{
ListNode rr = q.next;
ListNode lr = p.next;
q.next = lr;
p.next = q;
q = rr;
p = lr;
}
}
分析:这道题很有意思,第一眼看上去很复杂,其实只要先找到链表的中间节点,然后将后半部分提出来,把后半部分反转,然后将前半部分与反转了的后半部分交叉合并起来。这段代码是从网上找的,只贴出了最核心的一部分。
DS02--线性表的更多相关文章
- 线性表Linearlist
顺序存储,链式存储,索引存储,散列存储 基本运算 SLIST 1.置空表 void SetNull(&L) 2.求长度 int Length(L) 3.取元素 ...
- 数据结构(Java描述)之线性表
基础概念 数据结构:是相互之间存在一种或多种关系的数据元素的集合. 逻辑结构和物理结构 关于数据结构,我们可以从逻辑结构和物理结构这两个维度去描述 逻辑结构是数据对象中数据元素之间的关系,是从逻辑意义 ...
- JAVASE02-Unit04: 集合框架 、 集合操作 —— 线性表
Unit04: 集合框架 . 集合操作 -- 线性表 操作集合元素相关方法 package day04; import java.util.ArrayList; import java.util.Co ...
- 数据结构代码整理(线性表,栈,队列,串,二叉树,图的建立和遍历stl,最小生成树prim算法)。。持续更新中。。。
//归并排序递归方法实现 #include <iostream> #include <cstdio> using namespace std; #define maxn 100 ...
- Java集合类学习笔记(各种线性表性能分析)
ArrayList.LinkedList是线性表的两种典型实现:基于数组的线性表和基于链的线性表. Queue代表了队列,Deque代表了双端队列. 一般来说,由于数组以一块连续内存区来保存所有的数组 ...
- 动态分配的顺序线性表的十五种操作—C语言实现
线性表 定义:是最常用的,也是最简单的数据结构,是长度为n个数据元素的有序的序列. 含有大量记录的线性表叫文件 记录:稍微复杂的线性表里,数据元素为若干个数据项组成,这时把一个数据元素叫记录 结构特点 ...
- Java Se :线性表
Java的集合框架分为两个系列,Collection和Map系列.在大学期间,学习数据结构时,好像学习了线性表.非线性表.树,哎,都给忘了.其实,在Collection系列内部又可以分为线性表.集合两 ...
- 数据结构算法C语言实现(二)---2.3线性表的链式表示和实现之单链表
一.简述 [暂无] 二.头文件 #ifndef _2_3_part1_H_ #define _2_3_part1_H_ //2_3_part1.h /** author:zhaoyu email:zh ...
- 数据结构算法C语言实现(一)---2.2线性表的顺序表示和实现
注意: 虽然是用C语言实现,但是考虑到使用了一个C++的特性----引用以简化代码,所以所有的代码均以cpp作为后缀,用g++编译(以后不做说明). g++版本: 一.简述 本节主要讲述线性表的顺序实 ...
- C#线性表之顺序表
线性表是最简单.最基本.最常用的数据结构.线性表是线性结构的抽象(Abstract), 线性结构的特点是结构中的数据元素之间存在一对一的线性关系. 这种一对一的关系指的是数据元素之间的位置关系,即: ...
随机推荐
- watch和computed的用法区别是什么?
在模板中绑定表达式是非常便利的,但是它们实际上只用于简单的操作.模板是为了描述视图的结构.在模板中放入太多的逻辑会让模板过重且难以维护.这就是为什么 Vue.js 将绑定表达式限制为一个表达式.如果需 ...
- Django中间件(勾子函数)使用
中间件 Django中的中间件是一个轻量级.底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出.中间件的设计为开发者提供了一种无侵入式的开发方式,增强了Django ...
- 2018-2019-2 网络对抗技术 20165202 Exp6 信息搜集与漏洞扫描
博客目录 一.实践目标 二.实践内容 各种搜索技巧的应用 DNS IP注册信息的查询 基本的扫描技术:主机发现.端口扫描.OS及服务版本探测.具体服务的查点 漏洞扫描:会扫,会看报告,会查漏洞说明,会 ...
- New Concept English there (9)
31 65% Cats never fail to fascinate human beings. They can be friendly and affectionate towards huma ...
- Getting command line access to PHP and MySQL running MAMP on OSX
建立自己profile路径应该在/Users/yourname/,最后要运行. ./.profile使文件生效,和windows中给添加环境变量是一个道理,还可以看出linux和UNIX默认运行路径为 ...
- 解析6种常用View 的滑动方法
View 的滑动是Android 实现自定义控件的基础,实现View 滑动有很多种方法,在这里主要讲解6 种滑动方法,分别是layout().offsetLeftAndRight()与offsetTo ...
- keras系列︱利用fit_generator最小化显存占用比率/数据Batch化
本文主要参考两篇文献: 1.<深度学习theano/tensorflow多显卡多人使用问题集> 2.基于双向LSTM和迁移学习的seq2seq核心实体识别 运行机器学习算法时,很多人一开始 ...
- HAWQ + MADlib 玩转数据挖掘之(五)——奇异值分解实现推荐算法
一.奇异值分解简介 奇异值分解简称SVD(singular value decomposition),可以理解为:将一个比较复杂的矩阵用更小更简单的三个子矩阵的相乘来表示,这三个小矩阵描述了大矩阵重要 ...
- MySQL存储引擎(engine:处理表的处理器)
1.基本的操作命令: 1.查看所有存储引擎 show engines: 2.查看已有表的存储引擎: show create table 表名: 3.创建表指定的存储引擎 create table 表名 ...
- MySQL性能指标计算方式
-- 生成报告文件到/tmp目录中 tee /tmp/mysql_performance_stat.txt -- 统计性能指标前先开启下列参数,该参数使用IS数据库来存放数据库信息,由于使用PS库存放 ...