数据存储结构 包括顺序存储和链式存储两种
1 在c#语言中用数组来实现顺序存储结构,因为数组分配的空间是连续的,所有数组天生具有实现顺序存储结构的能力
2 链式存储结构,对逻辑上相邻的元素不要求其存储结构上相邻。链式存储结构中的数据元素称为” 结点“
数据的逻辑结构一般有 4类 :
集合 ,线性结构,树形结构,图状结构
集合:集合中的数据元素 除了“同一集合” 这个关系以外,其他没有任何关系
线性结构:线性结构中数据元素存在一对一的关系
树形结构:数据元素之间存在一对多的关系
图状结构:数据元素之间存在多对多的关系
数据的逻辑结构分为两种: 线性结构和非线性结构 ,树形结构和图状结构属于非线性结构 。
数据的物理结构又叫存储结构,是数据在计算机上的存储方式,存储结构有两类 顺序存储结构和链式存储结构。
顺序存储结构是把数据中逻辑相邻的数据元素存储在物理位置相邻的存储单元。
链式存储结构 是数据中逻辑相邻的数据元素不一定存储在物理位置相邻的存储单元中,数据之间的逻辑关系用引用表示。
单链表允许从一个结点直接访问它的后继结点,所以, 找直接后继结点的时间复杂度是O(1)。但是,要找某个结点的直接前驱结点,只能从表的头引用开始遍历各结点。如果某个结点的Next等于该结点,那么,这个结点就是该结点的直接前驱结点。也就是说,找直接前驱结点的时间复杂度是O(n),n是单链表的长度。当然,我们也可以在结点的引用域中保存直接前驱结点的地址
而不是直接后继结点的地址。这样,找直接前驱结点的时间复杂度只有
O(1),但找直接后继结点的时间复杂度是O(n)。如果希望找直接前驱结点和直接后继结点的时间复杂度都是O(1),那么,需要在结点中设两个引用域,一个保存直接前驱结点的地址,叫prev,一个直接后继结点的地址,叫next,这样的链表就是双向链表(Doubly Linked List)
线性表是最简单、最基本、最常用的数据结构,线性表的特点是数据元素之间存在一对一的线性关系,也就是说,除第一个和最后一个数据元素外,其余数据元素都有且只有一个直接前驱和直接后继。线性表有两种不同的存储结构,即顺序存储结构和链式存储结构。顺序存储的线性表称为顺序表,顺序表中的存储单元是连续的,在C#语言中用数组来实现顺序存储。链式存储的线性表称为链表,链表中的存储单元不一定是连续的,所以在一个结点有数据域存放数据元素本身的信息,还有引用域存放其相邻的数据元素的地址信息。单链表的结点只有一个引用域,存放其直接后继结点的地址信息,双向链表的结点有两个引用域,存放其直接前驱结点和直接后继结点的地址信息。循环链表的最后一个结点的引用域存放头引用的值。对线性表的基本操作有查找、插入、删除等操作。顺序表由于具有随机存储的特点,所以查找比较方便,效率很高,但插入和删除数据元素都需要移动大量的数据元素,所以效率很低。而链表由于其存储空间不要求是连续的,所以插入和删除数据元素的效率很高,但查找需要从头引用开始遍历链表,所以效率很低。因此,线性表采用何种存储结构取决于实际问题,如果只是进行查找等操作而不经常插入和删除线性表中的数据元素,则线性表采用顺序存储结构;反之,采用链式存储结构。
栈和队列是非常重要的两种数据结构,在软件设计中应用很多。栈和队列也是线性结构,线性表、栈和队列这三种数据结构的数据元素以及数据元素间的逻辑关系完全相同,差别是线性表的操作不受限制,而栈和队列的操作受到限制。栈的操作只能在表的一端进行,队列的插入操作在表的一端进行而其它操作在表的另一端进行,所以,把栈和队列称为操作受限的线性表。
字符串简称串,是在应用程序中使用最频繁的数据类型。串由n(n≥0)字符组成的有限序列,一般记为S=”c1c2…cn”。串中的字符都是连续存储的,而在C#中串具有恒定不变的特性,即字符串一经创建,就不能将其变长、变短或者改变其中任何的字符。所以,串一般采用顺序存储。串的基本操作有求串长、串比较、求子串、串连接、串插入、串删除和串定位等操作。 数组可以看作是线性表的推广,其特点是结构中的数据元素属于同一数据类型。数组是(n≥1)个相同数据类型的数据元素的有限序列。通常,数组采用顺序存储结构来存储数组中的数据元素,存放方式有两种:以行序为主序(先行后列)的顺序存放和以列序为主序(先列后行)的顺序存放。