C#与数据结构线性表

线性表
线性表是最简单也是最常用的一种数据结构。例如,英文字母表(A,B,…,Z)是一个线性表,表中的每一个英文字母是一个数据元素;又如成绩单是一个线性表,表中的每一行是一个数据元素,每个数据元素又是由学号、姓名、成绩等数据项组成。线性表是最简单的数据结构,而顺序表和链表作为线性表的两种重要存在形式,是堆栈、队列、串以及树和图等数据结构的实现基础,内容非常重要,一定要认真对待。
本章将介绍线性表的定义、线性表的顺序存储结构和链式存储结构以及相关算法实现。这些存储结构在C#类库中都有相对应的集合类,本章也将对这些集合类的原理、实现及使用做进一步地探讨。
 线性表的定义
线性表(Linear List)是具有相同特性的数据元素的一个有限序列(如图2.1所示)。该序列中所含元素的个数称作线性表的长度。线性表中的元素在位置上是有序的,好比储户去银行排队取钱,人们依次排列,排在前面的先取钱,排在后面的后取钱。这种位置上的有序性就是一种线性关系。由此可以看出线性表的前后两个元素存在一一对应的关系。但是需要注意,这种前后关系是逻辑而非物理意义上的。就好比银行进行了改革,使用排队机进行排队,所有储户分散在银行的各个角落,他们取钱的顺序是依据从排队机获取的纸条上的号数来决定的。
 
线性表的顺序存储结构—顺序表
线性表的顺序存储结构是指用一块地址连续的存储空间依次存储线性表的数据元素。这种存储方式好比改革前的银行,需要在业务窗口前排队取钱。由此可以看出顺序表中逻辑上相邻的元素在物理上也是相邻的。
 顺序表的特点
1.         容量固定
存储顺序表的元素需要一整块内存空间,因而顺序表的容量一旦确定,便不能更改。为了理解这一点,可以把内存空间想象成一栋学生宿舍楼,一个班集的学生就是一张线性表,宿舍楼的每个房间都可以住10个学生。如图2.2所示,在新生入学时A班的40个学生被安排进了前4个宿舍(101~104),B班的50个学生被安排进了随后的5个宿舍(105~109)。当两个班的学生住进宿舍之后,A班又补录了10个学生,这时如果希望A班的所有学生住在连续的5间宿舍已经变得不可能,因为105宿舍已经住进了B班的学生。其实计算机的内存也存在同样的情况,当为某个表分配了一片固定的内存空间后,这个空间周围的其它内存空间极有可能马上被占用,你无法任意地改变已经分配的内存空间的大小。
 
 
2.         访问速度快
在顺序表使用索引访问数据元素是非常简单、快速的。如图2.3所示,假设顺序表中的第一个元素的位置是Loc,每个数据元素所占用的存储空间为n,那么可以很快地计算出第i个元素的存储地址为:Loc + (i – 1) * n。
 
数组
线性表的顺序存储结构在C#中的最直接表现形式就是数组。在C#语言中,数组是最基础也是存取速度最快的一种集合类型。数组是引用类型,保存它们所需的内存空间会在托管堆上分配,一旦数组被创建,其中的所有元素将被初始化为它们的默认值。
int[] arrInt = new int[5];
arrInt[2] = 5;
arrInt[4] = 3;
以上代码声明了一个值类型int的数组,并把它的长度初始化为5,最后分别给第3和第5个元素赋值。它在内存中的分布如图2.4所示:
 
从图2.4可以得知,new int[5]会在托管堆中会划分一块能够存放5个整型数据的内存空间,并且每个元素都会被初始化为0,这意味着数组在被创建的同时就拥有了值。另外数组的长度一旦确定就不能再被更改,这使得数组没有添加和删除元素的操作。任何对于数组的添加和删除元素的操作都只能是逻辑意义上的。
注意:在托管堆中创建数组时,除了数组元素,数组对象所占有的内存块还包含一个类型对象指针、同步真索引等额外成员。也就是说new int[5]在内存中划分的空间大于20个字节,图2.4省略了这些额外成员。
当数组元素为值类型时,数组对象存放的是值类型对象本身。当元素为引用类型时,数组对象存放的则是对象的引用(指针)。
Control[] arrCtrl = new Control[5];
arrCtrl[0] = new Button();
arrCtrl[3] = new Label();
以上代码声明了一个引用类型Control的数组,并把它的长度初始化为5,最后分别给第1和第4个元素赋值。两个值是分别Button和Label对象,虽然它们都继承自Control类,但两者却是不同类,它们的大小不一样。但数组中各个元素的大小是相同的,这些大小不同的对象是如何存储的呢?下面是arrCtrl数组的内存分布图:
 
由图2.5可知,new Control[5]在托管堆中划分了一块能够存放5个指针的内存空间,并且每个元素都被初始化为null。当使用 arrCtrl[0]=new Button() 给数组元素赋值时,首先在托管堆中创建一个Button对象,然后把Button的内存地址存放在数组的第一个元素中,这样就可以通过数组中的指针访问Button对象了。
数组有很多优点,但它的缺点也非常明显。在实际编程中,经常需要对集合中的元素进行添加和删除,也需要动态地改变集合的大小,数组显然无法满足这些需求。怎么样才能使数组具有改变空间大小的功能呢?

时间: 2024-08-07 07:55:46

C#与数据结构线性表的相关文章

数据结构线性表链表的C语言实现

                                                                                      数据结构线性表链表的C语言实现      说明:线性表是一种最简单的线性结构,也是最基本的一种线性结构,所以它不仅是学习中的重点,也是应用开发非常常用的一种数据结构.它可以分为顺序表和链表.它的主要操作是数据元素的插入,删除,以及排序等.接下来,本篇文章将对线性表链表的基本操作和运用进行详细的说明(包含在源代码的注释中),并给

[考研系列之数据结构]线性表之队列

基本概念 队列的定义 队列是一种只能在表的一头插入,另一头删除的线性表,简而言之具有FIFO的特性 组成 队头 队尾 扩展 双端队列 只能在两端进行删除插入操作的线性表 实现 链队列 顺序队列 循环队列 循环队列 循环队列是将顺序队列臆造成一个环,如图 循环队列有以下参数 front 指向队头的指针 rear 指向队尾的指针 SIZE 循环最大队列长度 对于循环队列,初始状态的时候 front=rear=0; 每次insert的时候 Insert((front++)%SIZE); 那么,当循环队

[考研系列之数据结构]线性表之栈

?基本概念 栈的定义 限定仅在表尾进行插入或删除的线性表 组成 栈顶 栈底 基本操作 入栈(PUSH) 往栈中插入一个元素 弹栈(POP) 从栈顶删除一个元素 栈的表示 顺序栈 链栈 对于顺序栈,有两个指针base和top base指向栈底 top指向栈顶 对于栈的一些基本情况: 栈不存在时候 base=NULL 栈为空时  top=base 栈的长度 top-base 链栈略过. 栈的应用 1 数制转换 数制转换我们使用一种称之为"辗转相除法"的算法.此算法的基本原理基于: N=(N

[考研系列之数据结构]线性表之字符串

基本概念 串(字符串)  由0个或多个字符组成的有限序列,例如s="hello world" 串名  上例中的s 子串  某串任意连续字符组成的子序列,称为此字符串的子串 空串  0个字符的串,s="" 空格串  由一个或多个字符组成的串 模式匹配算法 作用 定位某子串T在字符串S中的位置 主串 S 模式串  T 针对模式匹配算法从简到难我们需要了解两种算法: [1] 朴素的模式匹配算法 [2] KMP匹配算法 朴素的模式匹配算法: 所谓朴素就是简单,这是一种简单的

数据结构-线性表(2)

线性表定义: 线性表是最基本.最简单.也是最常用的一种数据结构.线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的.线性表的逻辑结构简单,便于实现和操作.因此,线性表这种数据结构在实际应用中是广泛采用的一种数据结构. 存储空间是否连续: 一.顺序表的特点是逻辑上相邻的数据元素,物理存储位置也相邻,并且,顺序表的存储空间需要预先分配. 优点: (1)方法简单,各种高级语言中都有数组,容易实现. (2)不用为表示节点间的逻辑关系而增加额外的存储开

数据结构>>线性表【注意】-->链表求A-B(原A与B都递增,求完的A-B不改变A原来的顺序)

/*关于链表的题目 * A.B是两个递增有序的单链表,元素个数分别是m和n,求 * 集合A-B,并将结果保存在A中,且仍然保持递增有序. * converge_ab */ #include <iostream.h> using namespace std; typedef struct lnode{ int data; struct lnode * next; }lnode; int main(){ lnode * create_chain(int num,int interval,int s

java实现数据结构-线性表-顺序表,实现插入,查找,删除,合并功能

package 顺序表; import java.util.ArrayList; import java.util.Scanner; public class OrderList { /** * @param args * @author 刘雁冰 * @2015-1-31 21:00 */ /* * (以下所谓"位置"不是从0开始的数组下标表示法,而是从1开始的表示法.) * (如12,13,14,15,16数据中,位置2上的数据即是13) * * 利用JAVA实现数据结构-线性表-顺

[考研系列之数据结构]线性表概述

1.脑图 2.表示方法 按照数据结构概述所说,线性表有两种表示方法分别是顺序表示和链式表示,链表就是链式表示的典型. 我们知道链式表示是分配了n块内存空间,可以认为彼此不连续,所以不能用偏移量去定位每个元素. 下面就先说最简单的单向链表: 如果每个数据元素能有一个指针指向下一个元素的话,那么只需要知道第一个数据元素就能一个一个的遍历整个链表了,这就是单向链表. 对于每个链表元素我们称之为节点,每个节点都有两个域:数据域&指针域 数据域就是数据元素所在的区域,而指针域则是存储指向另一个节点的指针的

[考研系列之数据结构]线性表之链表

1.链表分类 通过线性表概述,我们知道了链表这样一种数据结构,它又分成三类,分别是 单向链表 循环链表 双向链表 单向链表 单向链表的指针域只有一个指向下一个节点的指针,需要注意几点: 1.头指针--指向第一个节点 2.最后一个结点的指针指向NULL 3.头结点--在链表的第一个结点之前附设一个结点,它的数据域为空 所以,我们看到:  单向链表为空的<=>链表有且只有一个头结点<=>头结点的指针指向NULL 循环链表 循环链表和单向链表最大的不同就是:最后一个结点的指针不再指向NU

数据结构——线性表(第二章)

一.基本概念 1.线性表:简称表,是n(n>=0)个具有相同类型的数据元素的有限序列,线性表中数据元素的个数称为线性表的长度.长度为零时称为空表. 2.线性表的顺序存储结构称为顺序表. 3.单链表:单链表是一组任意的存储单元存放线性表的位置,这组存储单元可以连续也可以不连续,甚至可以零散分布在内存中的任意位置. 下面着重介绍有关单链表的操作: #include<iostream> using namespace std; const int maxsize = 10; // 定义单链表的