第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: 数据结构与算法
在前端工程师中,常常有一种声音,我们为什么要学数据结构与算法,没有数据结构与算法,我们一样很好的完成工作.实际上,算法是一个宽泛的概念,我们写的任何程序都可以称为算法,甚至往冰箱里放大象,也要通过开门 ...
随机推荐
- 17mysql2█▓
一.数据库的查询用法 1. 数据表记录的查询: 运算符.虑重.列运算.别名.排序.聚合函数.分组 1.1数据准备 create table exam( id int primary key aut ...
- 08 Zabbix Item类型之Zabbix agent类型
点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 08 Zabbix Item类型之Zabbix agent类型 Zabbix agent类型的item是使用部署在服务器端的age ...
- luogu2336 喵星球上的点名 (SA+二分答案+树状数组)
离散化一下然后把姓名串和询问串都放一起做SA 和bzoj3277串类似地,满足某一询问的后缀(就是和这个询问对应的后缀的LCP>=这个询问长度的后缀)的排名也是一个区间,把这个区间二分出来即可 ...
- Android应用程序签名详解
http://blog.csdn.net/lyq8479/article/details/6401093 本文主要讲解Android应用程序签名相关的理论知识,包括:什么是签名.为什么要给应用程序签名 ...
- 压缩和解压缩文件tar, tar.gz and tar.bz2
1, 对于tar.gz 压缩:tar -zcvf archive-name.tar.gz directory-name 解压:tar -zxvf prog-1-jan-2005.tar.gz -C / ...
- Luogu 1979 NOIP 2013 华容道(搜索,最短路径)
Luogu 1979 NOIP 2013 华容道(搜索,最短路径) Description 小 B 最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面 ...
- 【codeforces contest 1119 F】Niyaz and Small Degrees
题目 描述 \(n\) 个点的树,每条边有一个边权: 对于一个 \(X\) ,求删去一些边后使得每个点的度数 \(d_i\) 均不超过 \(X\) 的最小代价: 你需要依次输出 \(X=0 \to n ...
- 【POJ1734】Sightseeing Trip 无向图最小环
题目大意:给定一个 N 个顶点的无向图,边有边权,如果存在,求出该无向图的最小环,即:边权和最小的环,并输出路径. 题解:由于无向图,且节点数较少,考虑 Floyd 算法,在最外层刚开始遍历到第 K ...
- 窗体焦点监听事件WindowFocusListener
public class Demo extends JFrame { JLabel label;//定义变量,以便在自定义方法类中调用 public Demo() { setBounds(100, ...
- linux的防火墙
关闭防火墙: systemctl stop firewalld.service #停止firewall systemctl disable firewalld.service #禁止firewall开 ...