一、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--线性表的更多相关文章

  1. 线性表Linearlist

    顺序存储,链式存储,索引存储,散列存储 基本运算 SLIST         1.置空表 void SetNull(&L)     2.求长度 int Length(L)     3.取元素 ...

  2. 数据结构(Java描述)之线性表

    基础概念 数据结构:是相互之间存在一种或多种关系的数据元素的集合. 逻辑结构和物理结构 关于数据结构,我们可以从逻辑结构和物理结构这两个维度去描述 逻辑结构是数据对象中数据元素之间的关系,是从逻辑意义 ...

  3. JAVASE02-Unit04: 集合框架 、 集合操作 —— 线性表

    Unit04: 集合框架 . 集合操作 -- 线性表 操作集合元素相关方法 package day04; import java.util.ArrayList; import java.util.Co ...

  4. 数据结构代码整理(线性表,栈,队列,串,二叉树,图的建立和遍历stl,最小生成树prim算法)。。持续更新中。。。

    //归并排序递归方法实现 #include <iostream> #include <cstdio> using namespace std; #define maxn 100 ...

  5. Java集合类学习笔记(各种线性表性能分析)

    ArrayList.LinkedList是线性表的两种典型实现:基于数组的线性表和基于链的线性表. Queue代表了队列,Deque代表了双端队列. 一般来说,由于数组以一块连续内存区来保存所有的数组 ...

  6. 动态分配的顺序线性表的十五种操作—C语言实现

    线性表 定义:是最常用的,也是最简单的数据结构,是长度为n个数据元素的有序的序列. 含有大量记录的线性表叫文件 记录:稍微复杂的线性表里,数据元素为若干个数据项组成,这时把一个数据元素叫记录 结构特点 ...

  7. Java Se :线性表

    Java的集合框架分为两个系列,Collection和Map系列.在大学期间,学习数据结构时,好像学习了线性表.非线性表.树,哎,都给忘了.其实,在Collection系列内部又可以分为线性表.集合两 ...

  8. 数据结构算法C语言实现(二)---2.3线性表的链式表示和实现之单链表

    一.简述 [暂无] 二.头文件 #ifndef _2_3_part1_H_ #define _2_3_part1_H_ //2_3_part1.h /** author:zhaoyu email:zh ...

  9. 数据结构算法C语言实现(一)---2.2线性表的顺序表示和实现

    注意: 虽然是用C语言实现,但是考虑到使用了一个C++的特性----引用以简化代码,所以所有的代码均以cpp作为后缀,用g++编译(以后不做说明). g++版本: 一.简述 本节主要讲述线性表的顺序实 ...

  10. C#线性表之顺序表

    线性表是最简单.最基本.最常用的数据结构.线性表是线性结构的抽象(Abstract), 线性结构的特点是结构中的数据元素之间存在一对一的线性关系. 这种一对一的关系指的是数据元素之间的位置关系,即: ...

随机推荐

  1. SpringInAction--Bean自动装配的歧义性处理

    在前面,学习如何装配Bean的时候,或许会发现,有的同类型的Bean智能配置一个 如下: package com.bean.java; import org.springframework.conte ...

  2. Dom4j下载及使用Dom4j读写XML简介(转)

    Dom4j下载及使用Dom4j读写XML简介 要使用dom4j读写XML文档,需要先下载dom4j包,dom4j官方网站在 http://www.dom4j.org/目前最新dom4j包下载地址:ht ...

  3. 使用jQuery操作DOM(1)

    1.常见方法 css(“属性”,”属性值”); //设置单个样式 css({属性1:属性值1,属性2:属性值3...}); //设置多个样式 addClass(“样式名”); //追加单个样式 add ...

  4. HM编码器代码阅读(1)——介绍以及相关知识

    HM是HEVC(H.265)的开源实现,可以从网上直接下载.HEVC(H.265)是新一代的视频编解码标准.本人目前研究的只是编码器部分,而且还是入门阶段!为了提高自己,边学边记,由于理解不够深入,难 ...

  5. c++下使用邮槽实现进程间通信

    Windows API提供了邮槽和命名管道两种机制来实现进程间通信,在这里使用C++实现邮槽. 邮槽是Windows提供的一种进程间单向通信的机制,进程中的一方只能读取(或写入)数据,而另一方只能写入 ...

  6. CentOS常用命令汇总

    将新创建的数据分配某个用户访问 grant all privileges on zhouzdb.* to 'zhouz'@'%' identified by '1234'; flush privile ...

  7. del语句的总结

    删除属性 del 语句 可以删除对象(实例)的属性 语法: del 对象.实例变量名 del 语句 del 变量名 删除变量 del name del 列表[整数表达式] 删除列表中的元素 del L ...

  8. Apache下配置Openstack Horizon (转)

    非常详尽的Horizon配置介绍,转自 dev.cloudwatt.com Deploy Horizon from source with Apache and SSL Some companies ...

  9. [转]:What happens to older developers?

    原文链接可能失效. This post is old but will remain on the front page for the time being. 140313. Jeff Jenkin ...

  10. Codeforces 914H Ember and Storm's Tree Game 【DP】*

    Codeforces 914H Ember and Storm's Tree Game 题目链接 ORZ佬 果然出了一套自闭题 这题让你算出第一个人有必胜策略的方案数 然后我们就发现必胜的条件就是树上 ...