第2章 线性表《C#数据结构和算法》
( )除第一个位置的数据
元素外,其它数据元素位置的前面都只有一个数据元素;( )除最后一个位置的
数据元素外,其它数据元素位置的后面都只有一个元素。也就是说,数据元素是
一个接一个的排列。因此,可以把线性表想象为一种数据元素序列的数据结构。
2.1. 线性表的定义
线性表(List)
线性表的接口如下所示。
public interface IListDS<T> {
int GetLength(); //求长度
void Clear(); //清空操作
bool IsEmpty(); //判断线性表是否为空
void Append(T item); //附加操作
void Insert(T item, int i); //插入操作
T Delete(int i); //删除操作
T GetElem(int i); //取表元
int Locate(T value); //按值查找
}
为了和.NET 框架中的接口 IList 相区分,在 IList 后面加了“DS”,“DS”
表示数据结构。
2.2 顺序表
2.2. 顺序表的定义
在计算机内,保存线性表最简单、最自然的方式,就是把表中的元素一个接
一个地放进顺序的存储单元,这就是线性表的顺序存储(Sequence Storage)。线性
表的顺序存储是指在内存中用一块地址连续的空间依次存放线性表的数据元素,
用这种方式存储的线性表叫顺序表(Sequence List),如图 2.1 所示。顺序表的特点
是表中相邻的数据元素在内存中存储位置也相邻。
… i- i … n- … maxsize-
a1 a2 … ai- ai ai+ … an …
C#语言中的数组在内存中占用的存储空间就是一组连续的存储区域,因此,
数组具有随机存取的特点。所以,数组天生具有表示顺序表的数据存储区域的特性。
由于任何线性表都可以进行倒置操作,所以可以把该操作作为 IListDS 接口
的一个成员方法进行声明,然后在各线性表类中实现。IListDS 接口中倒置方法
Reverse 的声明如下:
public interface IListDS<T> {
……
void Reverse();
} 【例 -】有数据类型为整型的顺序表 La 和 Lb,其数据元素均按从小到大的升
序排列,编写一个算法将它们合并成一个表 Lc,要求 Lc 中数据元素也按升序排
数据结构( C#语言版)2.2 顺序表
列。
算法思路:依次扫描 La 和 Lb 的数据元素,比较 La 和 Lb 当前数据元素的
值,将较小值的数据元素赋给 Lc,如此直到一个顺序表被扫描完,然后将未完
的那个顺序表中余下的数据元素赋给 Lc 即可。 Lc 的容量要能够容纳 La 和 Lb
两个表相加的长度。
按升序合并两个表的算法 C#实现如下:
public SeqList<int> Merge(Seqlist<int> La, SeqList<int> Lb)
{
SeqList<int> Lc = new SeqList<int>(La.Maxsize + Lb.Maxsize);
int i = ;
int j = ;
int k = ;
//两个表中都有数据元素
while ((i <= (La.GetLength()-))&& (j <= (Lb.GetLength()-)))
{
if (La[i] <Lb[j])
{
Lc.Append(La[i++]);
}
else
{
Lc.Append(Lb[j++]);
}
}
//a表中还有数据元素
while (i <= (La.GetLength() - ))
{
Lc.Append(La[i++]);
}
//b表中还有数据元素
while (j <= (Lb.GetLength() - ))
{
Lc.Append(Lb[j++]);
}
return Lc;
}
算法的时间复杂度是 O(m+n), m 是 La 的表长, n 是 Lb 的表长。
2.3 单链表
顺序表是用地址连续的存储单元顺序存储线性表中的各个数据元素,逻辑上
相邻的数据元素在物理位置上也相邻。因此,在顺序表中查找任何一个位置上的
数据元素非常方便,这是顺序存储的优点。但是,在对顺序表进行插入和删除时,
需要通过移动数据元素来实现,影响了运行效率。本节介绍线性表的另外一种存
储结构——链式存储(Linked Storage),这样的线性表叫链表(Linked List)。链表不
要求逻辑上相邻的数据元素在物理存储位置上也相邻,因此,在对链表进行插入
和删除时不需要移动数据元素,但同时也失去了顺序表可随机存储的优点。
2.4 其他链表
2.4. 双向链表
前面介绍的单链表允许从一个结点直接访问它的后继结点,所以, 找直接后
继结点的时间复杂度是 O()。但是,要找某个结点的直接前驱结点,只能从表的
头引用开始遍历各结点。如果某个结点的 Next 等于该结点,那么,这个结点就
是该结点的直接前驱结点。也就是说,找直接前驱结点的时间复杂度是 O(n), n
是单链表的长度。当然,我们也可以在结点的引用域中保存直接前驱结点的地址
而不是直接后继结点的地址。这样,找直接前驱结点的时间复杂度只有 O(),
但找直接后继结点的时间复杂度是 O(n)。如果希望找直接前驱结点和直接后继
结点的时间复杂度都是 O(),那么,需要在结点中设两个引用域,一个保存直
接前驱结点的地址,叫 prev,一个直接后继结点的地址,叫 next,这样的链表就
是双向链表(Doubly Linked List)。双向链表的结点结构示意图如图 2.15 所示。
prev data next
图 2.15 双向链表的结点结构示意图
//a tong 的单链表问题
ListNode* root = &ListNode();
ListNode* curNode = root;
for (int i = ; i < ; i++) {
curNode->next = New ListNode(i);
curNode = curNode->next;
}
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
第2章 线性表《C#数据结构和算法》的更多相关文章
- 数据结构(c语言版,严蔚敏)第2章线性表
弟2章线性表
- [数据结构 - 第3章] 线性表之双向链表(C语言实现)
一.什么是双向链表? 双向链表(double linked list)是在单链表的每个结点中,再设置一个指向其前驱结点的指针域.所以在双向链表中的结点都有两个指针域,一个指向直接后继,另一个指向直接前 ...
- C语言数据结构——第二章 线性表
二.线性表 2.1-线性表简介 2.1.1-线性表的定义 线性表是由若干个相同特性的数据元素组成的有限序列.若该线性表不包含任何元素,则称为空表,此时长度为0,当线性表不为空时,表中的元素的个数就是线 ...
- 数据结构(C语言版)-第2章 线性表
#define MAXSIZE 100 //最大长度 typedef struct { ElemType *elem; //指向数据元素的基地址 int length; //线性表的当前长度 }SqL ...
- 《数据结构与STL-第二章 线性表》读书笔记
线性表 定义 线性表(linear list)是由零个或多个相同类型的数据元素构成的有限序列. 存储结构 顺序存储 最简单的存储方法是顺序存储法,即把线性表的数据元素按照逻辑次序顺序地放在一组地址连续 ...
- [数据结构 - 第3章] 线性表之单链表(C++实现)
一.类定义 单链表类的定义如下: #ifndef SIGNALLIST_H #define SIGNALLIST_H typedef int ElemType; /* "ElemType类型 ...
- ytu 2231: 交集问题(线性表)(数据结构,链表练习)
2231: 交集问题(线性表) Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 6 Solved: 3[Submit][Status][Web Boar ...
- 第三章 线性表(C#实现)
1.线性表 概念::零个或多个数据元素的有序序列. 描述: 2.线性表的抽象数据类型: ADT线性表 Data:线性表的数据对象集合为{a1,a2,...,an},每个元素的类型均为DataType. ...
- 第一章:javascript: 数据结构与算法
在前端工程师中,常常有一种声音,我们为什么要学数据结构与算法,没有数据结构与算法,我们一样很好的完成工作.实际上,算法是一个宽泛的概念,我们写的任何程序都可以称为算法,甚至往冰箱里放大象,也要通过开门 ...
随机推荐
- 当你觉得大学没学到Linux时的感想
你的大学生活是什么样的呢?你在大学有学到特殊的技能吗?你可以在大学毕业的时候找到一份满意的工作吗?当这些问题摆在你面前的时候,你会迷茫吗,绝大多数的人在毕业的时候并不能找到一份好的工作,那不是因为你的 ...
- python---集合及深浅copy
一.集合 相信大家都在数学中接触过集合,在python中集合也是有这相同的性质,1.去重,集合会将内部元素自定去重 2.关系测试,类似数学中的交集并集子集一样 1.1如何创建集合 集合在python中 ...
- BZOJ2793[Poi2012]Vouchers——枚举
题目描述 考虑正整数集合,现在有n组人依次来取数,假设第i组来了x人,他们每个取的数一定是x的倍数,并且是还剩下的最小的x个.正整数中有m个数被标成了幸运数,问有哪些人取到了幸运数. 输入 第一行一个 ...
- php语言基础语法与编程工具推荐
php脚本语言,需要在服务器端执行,用浏览器返回HTML结果.在PHP中所有的语法都是如此,用户端是无法修改的,只有浏览权限. 一.php基础语法之输出方法 1.PHP中所有的脚本,可以放在文件中的任 ...
- 【CF809E】Surprise me!(动态规划,虚树,莫比乌斯反演)
[CF809E]Surprise me!(动态规划,虚树,莫比乌斯反演) 题面 洛谷 CodeForces 翻译: 给定一棵\(n\)个节点的树,每个点有一个权值\(a[i]\),保证\(a[i]\) ...
- emwin之GUIBuilder使用控件命名技巧
@2018-07-30 使用emwin-GUIBuilder布局界面时,各控件命名技巧及规则如下图所示(遵循此规则在写代码时好处多多) > 如上图所示所使用的第一组控件分别为 Text.Edit ...
- 部署kubernetes1.8.4+contiv高可用集群
原理和架构图参考上一篇,这里只记录操作步骤.由于东西较多,篇幅也会较长. etcd version: 3.2.11 kube version: 1.8.4 contiv version: 1.1.7 ...
- intent 几种用法
Intent 应该算是Android中特有的东西.你可以在Intent中指定程序 要执行的动作(比如:view,edit,dial),以及程序执行到该动作时所需要的资料.都指定好后,只要调用start ...
- 【LOJ#6282】数列分块6
题目大意:给定一个由 N 个数组成的序列,维护两种操作:单点询问,单点插入.N < 100000 题解:在块内维护一个链表,支持动态插入数字,同时对于非随即数据来说,若块的大小过大,需要重构. ...
- VBScript入门篇
VBScript入门篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.定义一个过程 定义一个过程:可以将相同的操作的代码提取出来,方便其他人来调用这段代码,可以减少你的代码的重 ...