Data_Structure02-线性表
一、PTA实验作业
本周要求挑3道题目写设计思路、调试过程。设计思路用伪代码描述。
1、顺序表选择一题(6-2,6-3,7-1选一题),代码必须用顺序结构抽象数据类型封装
2、单链表选择一题(6-1不能选)
3、有序表选择一题
选题:
1、7-1 最长连续递增子序列(20 分)
2、6-4 集合的基本运算(单链表)(10 分)
3、7-3 两个有序序列的中位数(25 分)
题目1:7-1 最长连续递增子序列
1、设计思路
#头文件
结构体LNode{
定义整型变量x; //用来存储记录的数
定义整型变量y; //用来记录连续的个数
}A[100001];
int main(){
定义整型变量i,j; //用于循环
定义 n; //用于记录序列的长度
定义 max<-1,c; //max记录连续最大值
//c记录连续最大的开始
输入n;
/*****输入序列*****/
for i<-0 to n-1 do
输入A[i].x;
end
/*将连续个数初始化为1*/
for i<-0 to n-1 do
A[i].y<-1;
end
/*****判断递增*****/
for i<-0 to n-1 do
for j<-i+1 to n-1 do
if(后一个数的值 > 前一个数的值)
then A[i].y++; //i处的记录加一
else break;
end
end
/*****判断最大值*****/
for i<-0 to n-1 do
if( i的连续的个数 > max )
then max<-A[i].y;
c<-i; //从i开始的序列
end
/*****输出最大子列*****/
for i<-c to c+max-2 do
输出 "A[i].x " //末尾有空格
end
输出"A[c+max-1].x" //末尾没空格
}
2、代码截图


3、PTA提交列表说明

第一次编译错误是因为没有修改编译器的缘故,C++的代码用C的编译器。
题目2:6-4 集合的基本运算(单链表)
1、设计思路
/*********裁判测试程序**********/
#include <stdio.h>
#include <malloc.h>
typedef char ElemType;
typedef struct LNode //定义单链表结点类型
{
ElemType data;
struct LNode *next;
} LinkList;
void DispList(LinkList *L); //输出链表元素,每个结点元素值以空格符间隔,以换行符结束。
void CreateListR(LinkList *&L,ElemType a[],int n); //用数组元素值尾插法创建链表。
void DestroyList(LinkList *&L);//销毁链表。
void sort(LinkList *&L) //单链表元素递增排序。
void Union(LinkList *ha,LinkList *hb,LinkList *&hc) //求两有序集合ha、hb的并集hc。
void InterSect(LinkList *ha,LinkList *hb,LinkList *&hc) //求两有序集合ha、hb的的交集hc。
void Subs(LinkList *ha,LinkList *hb,LinkList *&hc) //求两有序集合ha、hb的差集hc。
int main()
{
LinkList *ha,*hb,*hc;
ElemType a[100]={0};
ElemType b[100]={0};
int i=0;
char ch;
while((ch=getchar())!='\n')
{
a[i++]=ch;
}
CreateListR(ha,a,i);
i=0;
while((ch=getchar())!='\n')
{
b[i++]=ch;
}
CreateListR(hb,b,i);
printf("A: ");DispList(ha);
printf("B: ");DispList(hb);
sort(ha);
sort(hb);
printf("sorted A: ");DispList(ha);
printf("sorted B: ");DispList(hb);
Union(ha,hb,hc);
printf("Union C: ");DispList(hc);
InterSect(ha,hb,hc);
printf("InterSect C: ");DispList(hc);
Subs(ha,hb,hc);
printf("Subs C: ");DispList(hc);
DestroyList(ha);
DestroyList(hb);
DestroyList(hc);
return 0;
}
/* 请在这里填写答案 */
/*输出链表元素,每个结点元素值以空格符间隔,以换行符结束。*/
void DispList(LinkList *L){
定义结构体类型指针p;
p指向L;
while p //当p不为空时进入循环
do 输出p->next;
p <- p->next;
end
输出回车;
}
/*用数组元素值尾插法创建链表。*/
void CreateListR(LinkList *&L,ElemType a[],int n){
定义结构体类型指针p,q;
给L申请结构体内存空间;
L->next <- NULL;
P指向L;
定义整型变量 i<-0;
while n--
do 给q申请结构体内存空间;
q->data <- a[i++]; //赋值后,i++
q->next <- 0;
p->next 指向 q;
p 指向 p->next;
end
L 指向 L->next; //去除空头
}
/*****销毁链表*****/
void DestroyList(LinkList *&L){
定义结构体类型指针p;
while L
do P指向L;
L <- L->next;
清除p的内存空间;
end
}
/***单链表元素递增排序。***/
void sort(LinkList *&L) {
if !L //如果L为空,则返回
then return;
定义整型变量 temp; //用于交换数据
定义结构体类型指针p,q;
for p<-L to p为空
for q<-L to q为空
if p指向的数据 < q指向的数据
then 交换p,q所指向的数据
end
end
}
/***求两有序集合ha、hb的并集hc。***/
void Union(LinkList *ha,LinkList *hb,LinkList *&hc){
定义结构体类型指针pa,pb,pc,pl;
pa 指向 ha;
pb 指向 hb;
给hc申请结构体内存空间
hc->next <- NULL ;
pc 指向hc;
while pa&&pb //pa,pb均不为空
do 给pl申请结构体内存空间
if pa指向的数据 < pb指向的数据
then pl指向的数据 <- pa指向的数据
pl->next <- NULL;
pc->next 指向 pl;
pa 指向 pa->next;
elseif pa指向的数据 > pb指向的数据
then pl指向的数据 <- pb指向的数据
pl->next <- NULL;
pc->next 指向 pl;
pb 指向 pb->next;
else //pa指向的数据 = pb指向的数据
then pl指向的数据 <- pa指向的数据
pl->next <- NULL;
pc->next 指向 pl;
pa 指向 pa->next;
pb 指向 pb->next;
pl 指向 pl->next;
end
/****将不为空的剩余数据依次添加到pl后面****/
while pa
do 给pl申请结构体内存空间
pl指向的数据 <- pa指向的数据
pl->next <- NULL;
pc->next 指向 pl;
pa 指向 pa->next;
pc 指向 pc->next;
end
while pb
do 给pl申请结构体内存空间
pl指向的数据 <- pb指向的数据
pl->next <- NULL;
pc->next 指向 pl;
pb 指向 pb->next;
pc 指向 pc->next;
end
hc 指向 hc->next; //去除空头
}
/***求两有序集合ha、hb的的交集hc。***/
void InterSect(LinkList *ha,LinkList *hb,LinkList *&hc) {
定义结构体类型指针pa,pb,pc,pl;
pa 指向 ha;
pb 指向 hb;
给hc申请结构体内存空间
hc->next <- NULL;
pc 指向 hc;
while pa&&pb //pa,pb均不为空
do 给pl申请结构体内存空间
if pa指向的数据 = pb指向的数据
then pl指向的数据 <- pa指向的数据
pl->next <- NULL;
pc->next 指向 pl;
pa 指向 pa->next;
pb 指向 pb->next;
pc 指向 pc->next;
elseif pa指向的数据 < pb指向的数据
then pa 指向 pa->next;
else //pa指向的数据 > pb指向的数据
pb 指向 pb->next;
end
hc 指向 hc->next; //去除空头
}
/****求两有序集合ha、hb的差集hc。*****/
void Subs(LinkList *ha,LinkList *hb,LinkList *&hc){
//hc已经是两个有序集合ha,hb的交集
定义结构体类型指针pa,pc,p,pl;
pa 指向 ha;
给pc申请结构体内存空间
pc->next <- NULL;
p 指向 hc;
while pa&&pb //pa,pb均不为空
do if hc指向的数据 = pa指向的数据
pa 指向 pa->next;
hc 指向 hc->next;
continue;
else 给pl申请结构体内存空间
pl指向的数据 <- pa指向的数据;
pl->next <- NULL;
pc->next 指向 pl;
pa 指向 pa->next;
pc 指向 pc->next;
end
while pa
do 给pl申请结构体内存空间
pl指向的数据 <- pa指向的数据
pl->next <- NULL;
pc->next 指向 pl;
pa 指向 pa->next;
pc 指向 pc->next;
end
p 指向 p->next;
hc 指向 p;
}
2、代码截图







3、PTA提交列表说明

第一次提交错是因为求并集和差集的函数有错:
并集中的错误是因为一个判断少了一个;
而差集的错误是因为一开始没有发现,hc已经是ha,hb的交集。
题目3:7-3 两个有序序列的中位数
1、设计思路
#头文件
#定义宏 MaxSize 100000
重定义结构体 LNode{
定义int类型的 data;
定义结构体指针 next;
}为LinkList;
函数声明:
void CreateListR( LinkList *&L,ElemType a[],int n ); // 创建链表
void Union(LinkList *ha,LinkList *hb,LinkList *&hc); //求并集
int main(){
定义int类型的n;
定义int类型的数组a[MaxSize];
定义int类型的数组b[MaxSize];
输入n;
定义int类型的i;
for i=0 to n-1
输入a[i]
end
CreateListR(h1,a,i); //将数组a的值创建为单链表
for i=0 to n-1
输入b[i]
end
CreateListR(h2,b,i); //将数组a的值创建为单链表
Union(h1,h2,h3); //将单链表的h1,h2合并为h3
i<-1;
r 指向 h3;
while i<n
do r指向r->next;
i++
end
输出 r->data;
return 0;
}
void CreateListR( LinkList *&L,ElemType a[],int n ){
定义结构体指针p,q;
给L申请指针内存空间;
L->next <- NULL;
p 指向 L;
定义int类型的 i<-0;
while n--
do 给q申请指针内存空间
q指向的数据 <- a[i];
q->next <- NULL;
p->next 指向 q;
p 指向 p->next;
end
L 指向 L->next
}
void Union(LinkList *ha,LinkList *hb,LinkList *&hc){
定义结构体类型指针pa,pb,pc,pl,pm;
pa 指向 ha;
pb 指向 hb;
给hc申请结构体内存空间
hc->next <- NULL ;
pc 指向hc;
while pa&&pb //pa,pb均不为空
do 给pl申请结构体内存空间
if pa指向的数据 < pb指向的数据
then pl指向的数据 <- pa指向的数据
pl->next <- NULL;
pc->next 指向 pl;
pa 指向 pa->next;
elseif pa指向的数据 > pb指向的数据
then pl指向的数据 <- pb指向的数据
pl->next <- NULL;
pc->next 指向 pl;
pb 指向 pb->next;
else //pa指向的数据 = pb指向的数据
then pl指向的数据 <- pb指向的数据
pl->next <- NULL;
pc->next 指向 pl;
pb 指向 pb->next;
给pm申请指针内存空间
pm指向的数据 <- pa指向的数据
pm->next <- NULL;
pc->next 指向 pm;
pa 指向 pa->next;
pc 指向 pc->next;
end
/****将不为空的剩余数据依次添加到pl后面****/
while pa
do 给pl申请结构体内存空间
pl指向的数据 <- pa指向的数据
pl->next <- NULL;
pc->next 指向 pl;
pa 指向 pa->next;
pc 指向 pc->next;
end
while pb
do 给pl申请结构体内存空间
pl指向的数据 <- pb指向的数据
pl->next <- NULL;
pc->next 指向 pl;
pb 指向 pb->next;
pc 指向 pc->next;
end
hc 指向 hc->next; //去除空头
}
2、代码截图





3、PTA提交列表说明

第一次提交编译错误原因:未修改编译器;
接下来的错误均为最小N的错误,当n=1时,应该输出最小的数,而我输出的是一个地址,经过调试发现,在并集里面有一句代码“if( ha->next==NULL&&hb->next==NULL ) return;”导致并集为空,
二、截图本周题目集的PTA最后排名
1、顺序表PTA排名

2.链表PTA排名

3.我的总分
本次两个题集的总分为227分,自评分为2分
三、本周学习总结
1.谈谈你本周数据结构学习时间是如何安排,对自己安排满意么,若不满意,打算做什么改变?
1、如何安排:
首先必须是在上课认真听讲,完成随堂练习和互动,其次,在课堂外,多加训练,完成pta题集,并在时间允许的情况下,完成更多的题目,如pat等平台上的题。
2、我对我的安排感觉还比较满意,只是能空余出来的时间不多,完成pta上的题目花费太多的时间,对链表的操作还不太熟悉,需要多加联系
2.谈谈你对线性表的认识?
线性表是n(n为0时为空表)个数据元素的有限集合,他的特点是:
(1)存在唯一的一个被叫做“第一个”的数据元素,存在唯一的一个被叫做“最后一个”的数据元素。
(2)除了第一个数据元素外,其它的数据元素都有一个前驱。除了最后一个数据元素外,其它的数据元素都有一个后继。
线性表主要有两种实现方式:一种为顺序表,另一种为链表
(1)顺序表的实现主要为数组,算法比较简单,可以容易的找到第i个储存的内容,但是在插入新元素,或者删除一个元素的时候,相对麻烦。
(2)链表的逻辑结构严谨,在进行插入和删除操作时较为简便,但是,在查找元素的时候比较麻烦。
3.代码Git提交记录截图

Data_Structure02-线性表的更多相关文章
- 线性表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), 线性结构的特点是结构中的数据元素之间存在一对一的线性关系. 这种一对一的关系指的是数据元素之间的位置关系,即: ...
随机推荐
- HTML5页面,用JS 禁止弹出手机键盘
用户点击input的时候: 会默认调出手机软键盘: 场景:文本框获取焦点时,需要禁止手机弹出自带的输入键盘: 解决方案1: 用一个p/div等标签显示内容:然后放一个隐藏的input: (可能的场景: ...
- 关于python中urllib.urlencode的时候出错:UnicodeEncodeError: ‘ascii’的记录
原文我参见了:http://hi.baidu.com/setcookie/item/ddc6b694b1f13435336eeb3c 为毛我要费事的写下了,就是为了让自己记录一下,下面的也是直接摘录过 ...
- vue.js 源代码学习笔记 ----- core array.js
/* * not type checking this file because flow doesn't play well with * dynamically accessing methods ...
- jsp采用数据库连接池的方法获取数据库时间戳context.xml配置,jsp页面把时间格式化成自己需要的格式
<?xml version="1.0" encoding="UTF-8"?> <!-- 数据库连接池配置文件 --> <Conte ...
- 《gradle 用户指南中文版》 第一部分、关于Gradle
第一部分.关于Gradle 目录1.介绍1.1 关于本用户指南2.概述2.1 特性2.2 为什么选择Groovy? 上一页 | 目录 | 下一页
- TeamTalk源码分析(十一) —— pc客户端源码分析
--写在前面的话 在要不要写这篇文章的纠结中挣扎了好久,就我个人而已,我接触windows编程,已经六七个年头了,尤其是在我读研的三年内,基本心思都是花在学习和研究windows程序上 ...
- EXC_BAD_ACCESS(code...)坏内存访问 调试
一般很多人遇到这个 都会崩溃 断点一般 找不到 原因 : 只能按照一步一步走readView的模式 : 一般是问题是 相互包含 比如 view2 在view1 上 但是在view2 又创建了一 ...
- 安装redis-3.2.10单节点
前段时间安装好的redis,今天用脚本安装的时候突然出现版本异常的问题,所以更新一篇为大家提供参考 本次安装在CentOS6.5,采用的redis-3.2.10,最新的redis-4.0.1安装同样适 ...
- Git-Svn 建立工作目录
使用Git-SVN 建立工作目录 GIT-SVN可以以SVN的版本为基础, 实现”私有”的版本管理功能. 这样一些不成熟但又需要记录的版本就不必提交到SVN上, 而只在自己本地私有的版本里出现. 下面 ...
- BZOJ4521 Cqoi2016 手机号码 【数位DP】
Description 人们选择手机号码时都希望号码好记.吉利.比如号码中含有几位相邻的相同数字.不含谐音不吉利的数字等.手机运营商在发行新号码时也会考虑这些因素,从号段中选取含有某些特征的号码单独出 ...