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), 线性结构的特点是结构中的数据元素之间存在一对一的线性关系. 这种一对一的关系指的是数据元素之间的位置关系,即: ...
随机推荐
- 快速求排列组合 lucas定理
对于C(n, m) mod p.这里的n,m,p(p为素数)都很大的情况. 就不能再用C(n, m) = C(n - 1,m) + C(n - 1, m - 1)的公式递推了. 一般lucas定理的p ...
- Java中用反码表示整数,及int到byte的转换
Java中的整数都是通过补码表示的,当整数为正数时,补码和原码相同,当整数为负数时,补码为原码按位取反(符号位除外),然后加1. 通过一些例子可以比较明显的看出: int a = -1; System ...
- iOS笔记之内存泄露
非ARC中,对于被autorelease的对象,Leak工具也会视其为泄露,自己知道没问题就行. 今天遇到一个bug,App在XCode调试时没有问题,但在真机安装,退出,再进入时,会出现闪退. 用X ...
- Linux真随机数的生成
今天看<白帽子讲WEB安全>一书,看到笔者谈到Linux如何实现真随机数生成,感觉非常有用,记录下来 #include<iostream> using namespace st ...
- c# DataTable行转列
/// <summary> /// datatable行转列 /// </summary> /// <param name="dtSrc">来源 ...
- Laravel 文件夹结构简介
表 1.1:Laravel 文件夹结构简介 文件夹名称 简介 app 应用程序的业务逻辑代码存放文件夹 app/Console 存放自定义 Artisian 命令文件 app/Http/Control ...
- continue的作用
特别有用,用于循环中-跳过不满足某个条件的某轮循环continue后面的语句
- 在servlet中的中文乱码,相对路径和绝对路径
默认情况下在servlet中的中文是显示不出来的,解决问题就是加resp.setContentType("text/html;charset=gbk"); 而且这句加的话必须写在P ...
- PHP进程之信号捕捉中的declare(ticks=1)
转自:http://blog.csdn.net/gavin_new/article/details/65629223 一. 语句在php中的意义 php中,declare(ticks=n)和regis ...
- scala学习笔记(9): 语法续
1 不定长参数 def sum(args: Int*) = { var result = 0 for ( arg <- args) result += arg result } 2 数组初始化 ...