( )除第一个位置的数据
元素外,其它数据元素位置的前面都只有一个数据元素;( )除最后一个位置的
数据元素外,其它数据元素位置的后面都只有一个元素。也就是说,数据元素是
一个接一个的排列。因此,可以把线性表想象为一种数据元素序列的数据结构。
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#数据结构和算法》的更多相关文章

  1. 数据结构(c语言版,严蔚敏)第2章线性表

    弟2章线性表

  2. [数据结构 - 第3章] 线性表之双向链表(C语言实现)

    一.什么是双向链表? 双向链表(double linked list)是在单链表的每个结点中,再设置一个指向其前驱结点的指针域.所以在双向链表中的结点都有两个指针域,一个指向直接后继,另一个指向直接前 ...

  3. C语言数据结构——第二章 线性表

    二.线性表 2.1-线性表简介 2.1.1-线性表的定义 线性表是由若干个相同特性的数据元素组成的有限序列.若该线性表不包含任何元素,则称为空表,此时长度为0,当线性表不为空时,表中的元素的个数就是线 ...

  4. 数据结构(C语言版)-第2章 线性表

    #define MAXSIZE 100 //最大长度 typedef struct { ElemType *elem; //指向数据元素的基地址 int length; //线性表的当前长度 }SqL ...

  5. 《数据结构与STL-第二章 线性表》读书笔记

    线性表 定义 线性表(linear list)是由零个或多个相同类型的数据元素构成的有限序列. 存储结构 顺序存储 最简单的存储方法是顺序存储法,即把线性表的数据元素按照逻辑次序顺序地放在一组地址连续 ...

  6. [数据结构 - 第3章] 线性表之单链表(C++实现)

    一.类定义 单链表类的定义如下: #ifndef SIGNALLIST_H #define SIGNALLIST_H typedef int ElemType; /* "ElemType类型 ...

  7. ytu 2231: 交集问题(线性表)(数据结构,链表练习)

    2231: 交集问题(线性表) Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 6  Solved: 3[Submit][Status][Web Boar ...

  8. 第三章 线性表(C#实现)

    1.线性表 概念::零个或多个数据元素的有序序列. 描述: 2.线性表的抽象数据类型: ADT线性表 Data:线性表的数据对象集合为{a1,a2,...,an},每个元素的类型均为DataType. ...

  9. 第一章:javascript: 数据结构与算法

    在前端工程师中,常常有一种声音,我们为什么要学数据结构与算法,没有数据结构与算法,我们一样很好的完成工作.实际上,算法是一个宽泛的概念,我们写的任何程序都可以称为算法,甚至往冰箱里放大象,也要通过开门 ...

随机推荐

  1. Django model 表与表的关系

    一对多:models.ForeignKey(其他表) 多对多:models.ManyToManyField(其他表) 一对一:models.OneToOneField(其他表) 应用场景: 一对多:当 ...

  2. 查看本地Git仓库历史修改内容

    查看历史内容 在.git文件 同级目录下,右键 选择 git history 但是红框中的路径无法拷贝.右键红框中的任一文件,有 HighLight this only, Highlight this ...

  3. 自学Linux Shell9.2-基于Red Hat系统工具包存在两种方式之一:RPM包

    点击返回 自学Linux命令行与Shell脚本之路 9.2-基于Red Hat系统工具包存在两种方式之一:RPM包 本节主要介绍基于Red Had的系统(测试系统centos) 1. 工具包存在两种方 ...

  4. 【BZOJ3821/UOJ46】玄学(二进制分组,线段树)

    [BZOJ3821/UOJ46]玄学(二进制分组,线段树) 题面 BZOJ UOJ 题解 呜,很好的题目啊QwQ. 离线做法大概可以线段树分治,或者直接点记录左右两次操作时的结果,两个除一下就可以直接 ...

  5. BFS求解迷宫的最短路径问题

    题目:给定一个大小为N*M的迷宫,迷宫由通道('.')和墙壁('#')组成,其中通道S表示起点,通道G表示终点,每一步移动可以达到上下左右中不是墙壁的位置.试求出起点到终点的最小步数.(本题假定迷宫是 ...

  6. PendingIntent的使用

    1, 构造intent Intent mIntent = new Intent("android.intent.action.MAIN"); ComponentName comp ...

  7. Android应用程序签名详解

    http://blog.csdn.net/lyq8479/article/details/6401093 本文主要讲解Android应用程序签名相关的理论知识,包括:什么是签名.为什么要给应用程序签名 ...

  8. JAVA8给我带了什么——并行流和接口新功能

    流,确定是笔者内心很向往的天堂,有他之后JAVA在处理数据就变更加的灵动.加上lambda表达不喜欢都不行.JAVA8也为流在提供另一个功能——并行流.即是有并行流,那么是不是也有顺序流.没有错.我前 ...

  9. MyEclipse上有main函数类运行报错:Editor does not contain a main type

    MyEclipse下有main函数类运行报错:Editor does not contain a main type 出现这种问题的原因是,该java文件所在的包没有被MyEclipse认定为源码包. ...

  10. MATLAB:图像减法运算(imsubtract函数)

    图像减法运行涉及到imsubtract函数 实现代码如下: clear all; %关闭当前所有图形窗口,清空工作空间变量,清除工作空间所有变量 clc close all; A=imread('ca ...