DS01-线性表
0.PTA得分截图

1.本周内容总结
1.1总结线性表内容
- 顺序表结构体定义
typedef struct LNode *List
struct LNode
{
ElementType Data[MAXSIZE];
int last;
};
struct LNode L;
List PtrL;
- 顺序表插入
void Insert(ElementType X, int i; List PtrL)
{
int j;
if (PtrL->Last == MAXSIZE - 1)
{
cout << "表满"<<endl;
return;
}
if (i < 1 || i> PtrL->Last + 2)
{
cout << "位置不合法" << endl;
return;
}
for (j = PtrL->Last; j >= i - 1; j--)
{
PtrL->Data[j + 1] = PtrL->Data[j];
}
PtrL->Data[i - 1] = X;
PtrL->Last++;
return;
}
- 顺序表删除
void Delete(int i, List PtrL)
{
int j;
if (i<1 || i>PtrL->Last + 1)
{
cout << "不存在第" << i << "个元素" << endl;
return;
}
for (j = i; j <= PtrL->Last; j++)
{
PtrL->Data[j - 1] = PtrL->Data[j];
}
PtrL->Last--;
return;
}
- 链表结构体定义
typedef struct LNode //定义单链表结点类型
{
ElemType data;
struct LNode* next; //指向后继结点
} LNode, * LinkList;
- 链表头插法及尾插法
List Insert(ElementType X, int i, List PtrL)
{
List p, s;
if (i == 1)/*新结点插入在表头*/
{
s == new LNode;/*申请、填装结点*/
s->Data = x;
s->Next = PtrL;
return s;/*返回新表头指针*/
}
p = FindKth(i - 1, PtrL);/*查找第i-1个结点*/
if (p == NULL)/*第i-1个不存在,不能插入*/
{
cout << "参数i错" << endl;
return NULL;
}
else
{
s = new LNode;/*申请、填装结点*/
s->Data = X;
s->Next = p->Next;/*新结点插入在第i-1个结点的后面*/
p->Next = s;
return PtrL;
}
}
- 链表删除
List Delete(int i, List PtrL)
{
List p, s;
if (i == 1)/*若要删除的是第一个结点*/
{
s = PtrL;/*s指向第一个结点*/
if (PtrL != NULL)
{
PtrL = PtrL->Next;/*从链表中删除*/
}
else
{
return NULL;
}
delete s;/*释放被删除结点*/
return PtrL;
}
p = FindKth(i - 1, PtrL);/*查找第i-1个结点*/
if (p == NULL)
{
cout << "第" << i - 1 << "个结点不存在" << endl;
return NULL;
}
else if(p->Next==NULL)
{
cout << "第" << i << "个结点不存在" << endl;
return NULL;
}
else
{
s = p->Next;/*s指向第i个结点*/
p->Next = s->Next;/*从链表中删除*/
delete s;/*释放被删除结点*/
return PtrL;
}
- 链表插入
bool ListInsert(LinkList& L, int i, ElemType e)
{
int j = 0;
LinkList p = L;//p指向头结点,j为0
while (j < i - 1 && p != NULL)
{
j++;
p = p->next;
}
if (p == NULL)//未找到第i-1个节点
return false;
else
{
LinkList s;
s = new LNode;
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
}
- 有序链表的插入
void ListInsert(LinkList& L, ElemType e)
{
LinkList pre = L, p;
while (pre->next != NULL && pre->next->data < e)
{
pre = pre->next;
}
p = new LNode;
p->data = e;
p->next = pre->next;
pre->next = p;
}
- 有序链表的删除
void ListDelete(LinkList& L, ElemType e)
{
LinkList p = L, s,j=L;
int flag = 0;
int cnt = 0;
while (p->next != NULL )
{
if (p->next->data == e)
{
flag = 1;
s = p->next;
p->next = p->next->next;
delete s;
}
else
{
p = p->next;
}
}
while (j->next != NULL)
{
cnt++;
j = j->next;
}
if (flag == 0&&cnt!=0)
{
cout << e << "找不到!" << endl;
}
}
- 有序链表的归并
void UnionList(LinkList L1, LinkList L2, LinkList L3)
{
LinkList p1 = L1->next, p2 = L2->next, r, s;
L3 = new LNode;
r = L3;
while (p1 != NULL && p2 != NULL)
{
if (p1->data < p2->data)
{
s = new LNode;
s->data = p1->data;
r->next = s;
r = s;
p1 = p1->next;
}
else
{
s = new LNode;
s->data = p2->data;
r->next = s;
r = s;
p2 = p2->next;
}
}
while (p1 != NULL)
{
s = new LNode;
s->data = p1->data;
r->next = s;
r = s;
p1 = p1->next;
}
while (p2 != NULL)
{
s = new LNode;
s->data = p2->data;
r->next = s;
r = s;
p2 = p2->next;
}
r->next = NULL;
}
- 双链表定义
typedef struct DNode
{
ElemType data;
struct DNode* prior;//指向前驱节点
struct DNode* next;//指向后继节点
}DNode, * Dlist;
- 双链表节点的插入片段
s->next=p->next;
p->next=s;
s->next->prior=s;
s->prior=p;
- 双链表节点的删除片段
q=p->next;
p->next=p->next->next;
q->next->prior=p;
delete p;
1.2对线性表的认识及学习体会
- 线性表是点对点的一个逻辑结构
- 线性表(数据结构)所需要掌握的基本操作多,需多加练习才能达到要求
- 线性表是数据结构之后学习的基础,应加以重视并多多练习
2.PTA实验作业
2.1题目1:两个有序序列的中位数
2.1.1代码截图






2.1.2本题PTA提交列表说明

- Q1:段错误
- A1:

尾指针r一开始没有指向表头L3所导致
- A1:
- Q2:部分正确
- A2:

通过注释排查,问题出在链表合并这一函数的实现上。
把合并还没合并完链表的代码错写在了合并两链表共有长度的片段上,导致出错。

- A2:
2.2题目2:jmu-ds-有序链表的插入删除
2.2.1代码截图


2.2.2本题PTA提交列表说明

- Q1:部分正确得5分
- A1:没看清题目要求,没编辑相应的代码

- A1:没看清题目要求,没编辑相应的代码
- Q2:部分正确得10分
- A2:

此代码为最终代码,在VS上的结果是:

没有头绪。
- A2:
2.3题目3: jmu-ds-有序表插入数据
2.3.1代码截图


2.3.2PTA提交列表说明

- Q1:部分正确得10分
- A1:插入函数中,寻找插入位置用for循环,导致考虑数组溢出问题,难以完成代码要求。故,改用while循环查找插入位置。


- A1:插入函数中,寻找插入位置用for循环,导致考虑数组溢出问题,难以完成代码要求。故,改用while循环查找插入位置。
- Q2:部分正确得15分
- A2:未编辑空表需输出error的代码导致空表的测试点过不去
- Q3:部分正确得20分
- A3:查找插入位置的代码不严谨,在插入最后一个出现问题。因为顺序表用数组来实现,而没有读入数据的数组位置的数据随机,因此需完善代码。


- A3:查找插入位置的代码不严谨,在插入最后一个出现问题。因为顺序表用数组来实现,而没有读入数据的数组位置的数据随机,因此需完善代码。
3.阅读代码
3.1题目及解题代码


3.1.1该题的设计思路





3.1.2该题的伪代码
if (表A或表B为空表) return NULL;
定义链表指针pA指向表A,pB指向表B;
while (pA的值与pB的值不相等)
{
if (pA的值为NULL)
pA = headB;
else
pA = pA->next;
if (pB的值为NULL)
pA = headA;
else
pB = pB->next;
}
return pA;
3.1.3运行结果


3.1.4解题优势及难点
- 难点
- 怎么样构思找到相交的点
- 是地址也要相同还是只有数据相同
- 解题优势
- 从具有相同长度入手,并遍历表后使其指向另一个表从而解决长度差的问题
- 否则需考虑两表谁长谁短而进行分类,加大代码量
- 运用了三目运算符,压缩了代码量,使得代码更为简洁
- 从具有相同长度入手,并遍历表后使其指向另一个表从而解决长度差的问题
DS01-线性表的更多相关文章
- 线性表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), 线性结构的特点是结构中的数据元素之间存在一对一的线性关系. 这种一对一的关系指的是数据元素之间的位置关系,即: ...
随机推荐
- 接口测试-chap6-获取页面动态token
1.在发起某些请求时,可能会要求必须是从某个页面进行请求,此时会验证页面的token 2.这个token是动态生成的,每次请求时值都是不同的, 不可以通过fiddler抓取的值作为固定值传入,通过fi ...
- phpStrom安装PHP_CodeSniffer检查代码规范
为什么使用PHP_CodeSniffer 一个开发团队统一的编码风格,有助于他人对代码的理解和维护,对于大项目来说尤其重要. PHP_CodeSniffer是PEAR中的一个用PHP5写的用来检查嗅探 ...
- 在腾讯云服务器上安装JDK+Tomcat并启动tomcat
由于Java web项目需要使用到tomcat所以决定在腾讯云服务器(centos7.X)上安装JDK和tomcat,来部署我们的项目. 准备工具: 云服务器:centos7.x+ 本地连接服务器:X ...
- 神经网络的Python实现(一)了解神经网络
网络上深度学习相关博客教程质量参差不齐,很多细节很少有文章提到,所以本着夯实深度学习基础的想法写下此系列博文. 本文会从神经网络的概述.不同框架的公式推导和对应的基于numpy的Python代码实现等 ...
- 在CodaLab上提交MURA竞赛的结果
What is MURA? MURA (musculoskeletal radiographs) is a large dataset of bone X-rays. Algorithms are t ...
- 基于mykernel完成时间片轮询多道进程的简单内核
基于mykernel完成时间片轮询多道进程的简单内核 原创作品转载请注明出处+中科大孟宁老师的linux操作系统分析:https://github.com/mengning/linuxkernel/ ...
- LitePal
Litepal采用的是对象关系映射(ORM)模式 LitePal的配置工作. 1.添加依赖 compile 'org.litepal.android:core:1.3.2' 2.配置lite ...
- 1,Java知识储备
1,关于 . java文件 规定:第一行为 package name; 表示该.java文件属于哪一个包. 一个.java文件中可以有多个类,但是只能有一个public类,并且这个public类必须与 ...
- [面试专题]前端需要知道的web安全知识
前端需要知道的web安全知识 标签(空格分隔): 未分类 安全 [Doc] Crypto (加密) [Doc] TLS/SSL [Doc] HTTPS [Point] XSS [Point] CSRF ...
- 基础JavaScript练习(一)总结
任务目的 在上一任务基础上继续JavaScript的体验 接触一下JavaScript中的高级选择器 学习JavaScript中的数组对象遍历.读写.排序等操作 学习简单的字符串处理操作 任务描述 参 ...