数据结构第一篇——线性表的逻辑结构

?注:未经博主同意,不得转载。

线性表(linear list)是最常用且最简单的数据结构。简言之,一个线性表是n个数据元素的有限序列。至于每个数据元素的具体含义,在不同的情况下各不相同。例如,26个英文字母的字母表:

(A,B,C,D,......Z)

线性表的抽象数据类型定义如下:

 1 ADT List
 2 {
 3     Data: D={Ai|Ai<DataSet,i=1,2,...,n, n>=0}
 4     //称n为线性表的表长
 5     //称n=0时的线性表为空表
 6     Structure: R={<A(i-1),Ai>|A(i-1),Ai∈D,i=1,2,...,0}
 7     //设线性表为(A1,A2,...,Ai,...,An)
 8     //称i为Ai在线性表中的位序
 9
10     Operation:
11     {
12         List();                            //构造一个空的线性表
13         Length();                        //求线性表的长度
14         Locate(Data x);                //查找值为x的元素
15         Insert(Data x ,int i);        //在i的位置上插入元素x
16         Delete(int i);                    //删除第i个元素
17         Next (Data x);                    //求值为x的前驱元素
18         Prior(Data x);                    //求值为x的后继元素
19         IsEmpty();                        //判断线性表是否为空
20         IsFull();                        //判断线性表是否为满
21         GetElem(int i);                //查找第i个元素
22         Print();                            //输出所有元素
23     }
24 }

对上述定义了抽象数据类型的线性表,还可进行一些更复杂的操作,比如:
1.将两个或两个以上的线性表合并成一个线性表:

 1 void Union(List LA, List LB)
 2 {
 3     int i=0;
 4     while(i<LB.size)
 5     {
 6         x=LB.GetElem(i);   //在LB中取一元素
 7         k=LA.Locate(x);        //在LA中搜索它
 8         if(k==-1)                //未找到,将它插入到LA中
 9         {
10             LA.Insert(x,i);
11         }
12         else ++i;
13     }
14 }
15 //此算法时间复杂度为O(LA.size*LB.size)

2.已知线性表LA和LB中的元素按值递增有序排列,现要求将LA和LB归并为一个新的线性表LC,且LC中的元素值仍递增排列。例如,设
LA=(2,3,5,8,11,15)

LB=(4,5,6,9,15,20,24)

LC=(2,3,4,5,5,6,8,9,11,15,15,20,24)

 1 void MergeList()
 2 {
 3     int i=j=1;        //跟随LA和LB
 4     int k=1;            //跟随LC
 5     while((i<LA.size)&&(j<LB.size))    //LA和LB长度范围内
 6     {
 7         x=LA.GetElem(i);        //获取LA中元素
 8         y=LB.GetElem(j);        //获取LB中元素
 9         if(x<=y)
10         {
11             LC.Insert(x,k);
12             ++i;
13             ++k;
14         }
15         else
16         {
17             LC.Insert(y.k);
18             ++j;
19             ++k;
20         }
21     }
22     while(i<LA.size)        //LB已经添加完毕
23     {
24         x=LA.GetElem(i);
25         LC.Insert(x,k);
26         ++i;
27         ++k;
28     }
29     while(j<LB.size)        //LB已经添加完毕
30     {
31         y=LB.GetElem(j);
32         LC.Insert(y,k);
33         ++j;
34         ++k;
35     }
36 }
37 //算法复杂度为O(Length(LA)+Length(LB)) 

以上代码中关于自增运算用++i而不用i++,想要了解请转至http://www.cnblogs.com/tenjl-exv/p/7469016.html
如要更加追求效率可写为 i+=1。

时间: 2024-08-27 06:30:08

数据结构第一篇——线性表的逻辑结构的相关文章

数据结构第二篇——线性表的顺序存储

?注:未经博主同意,不得转载. 线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素. 由于高级程序语言中的数组类型也有随机存取的特性,因此,通常都用数组来描述数据结构中的书序存储结构. 如下描述: 1 const int MaxListSize=100; //最大数据个数 2 //other way 3 //define MaxListSize 100 4 5 class List{ 6 7 private: 8 Data data[MaxListSize]; //存放数据

数据结构——第一章线性表:03线性表的链式存储结构

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "PingFang SC" } span.s1 { font: 12.0px Helvetica } span.s2 { color: #fb0207 } 1.单链表:用一组地址任意的存储单元存放线性表中的数据元素.以元素(数据元素的映象)+ 指针(指示后继元素存储位置)= 结点(表示数据元素). 2.以线性表中第一个数据元素a1的存储地址作为线性表的地址,称作线性表的头指针.为了

数据结构第一章——线性表的实现

#include<stdio.h> #include<stdlib.h> #include<malloc.h> #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10 #define OVERFLOW -2 #define ERROR 0 #define OK 1 using namespace std; //typedef int Status; typedef struct { int *elem; //指向整个线性表

数据结构和算法 (二)数据结构基础、线性表、栈和队列、数组和字符串

Java面试宝典之数据结构基础 —— 线性表篇 一.数据结构概念 用我的理解,数据结构包含数据和结构,通俗一点就是将数据按照一定的结构组合起来,不同的组合方式会有不同的效率,使用不同的场景,如此而已.比 如我们最常用的数组,就是一种数据结构,有独特的承载数据的方式,按顺序排列,其特点就是你可以根据下标快速查找元素,但是因为在数组中插入和删除元素会 有其它元素较大幅度的便宜,所以会带来较多的消耗,所以因为这种特点,使得数组适合:查询比较频繁,增.删比较少的情况,这就是数据结构的概念.数据结构 包括

数据结构与算法—线性表详解

前言 通过前面数据结构与算法前导我么知道了数据结构的一些概念和重要性,那么我们今天总结下线性表相关的内容.当然,我用自己的理解解分享给大家. 其实说实话,可能很多人依然分不清线性表,顺序表,和链表之间的区别和联系! 线性表:逻辑结构, 就是对外暴露数据之间的关系,不关心底层如何实现. 顺序表.链表:物理结构,他是实现一个结构实际物理地址上的结构.比如顺序表就是用数组实现.而链表用指针完成主要工作.不同的结构在不同的场景有不同的区别. 对于java来说,大家都知道List接口类型,这就是逻辑结构,

数据结构学习笔记——线性表

第2章  线性表 2.1  线性表的类型定义  线性结构的特点是:在数据元素的非空有限集中,(1)存在唯一的一个被称做“第一个”的数据元素:(2)存在唯一的一个被称做“最后一个”的数据元素:(3)除第一个之外,集合中的每个数据元素只有一个前驱:(4)除最后一个外,集合中每个数据元素均只有一个后继. 线性表的类型定义 线性表(linear_list)是最常用的且最简单的一种数据结构.一个线性表是n个数据元素的有限序列.在稍复杂的线性表中,一个数据元素可以由若干个数据项(item)组成.在这种情况下

数据结构学习笔记——线性表的应用

数据结构学习笔记——线性表的应用 线性表的应用 线性表的自然连接 计算任意两个表的简单自然连接过程讨论线性表的应用.假设有两个表A和B,分别是m1行.n1列和m2行.n2列,它们简单自然连接结果C=A*B(i==j),其中i表示表A中列号,j表示表B中的列号,C为A和B的笛卡儿积中满足指定连接条件的所有记录组,该连接条件为表A的第i列与表B的第j列相等. 如:         1 2 3                3 5 A  =  2 3 3         B =  1 6       

python数据结构之一:线性表

线性表:零个或多个数据元素的有限序列. 咋一看这句话,我也不明白是什么意思,哈哈,举例说明一下吧.去电影院买票时,人们的排队就是一个线性表,有固定的最前一个,固定的最后一个. 张三是其中一个,他的前一个人,和后一个人是确定的单一的. 再如,一个公司里的一个部里有一个领导,多名员工,他们的关系就不是线性表了,有一对多的关系. 那么在python里如何创建线性表呢?如下: L1=["a","b","c","d","e&q

数据结构第五篇——线性表的链式存储之循环链表

?注:未经博主同意,不得转载. 链表是另一种形式的链式存储结构,它是线性链表的一种变形.在线性链表中,每个结点的指针都指向它的下一个结点,最后一个结点的指针域为空,表示链表的结束.若使最后一个结点的指针指向头结点,则链表呈环状,这样的链表称为循环链表. 循环链表当然也分为单链表和双向列表. 通常情况下,在循环链表中设立尾指针而不设头指针,可使某些操作简化. 循环链表的定义和操作与单链表类似,只是循环结束条件有所不同,下面只给出单循环链表的定义和部分操作,至于双向循环链表可能会在以后的项目中出现,