之前断断续续的学习数据结构的关于线性表的相关内容,这次继续学习的时候本想从栈开始学习了,因为感觉线性表那章的内容已经会了。但是当他说对栈操作的时候说到,栈也是一种线性表,忽然发现线性表全然没有印象。因为笔者不是计算机专业的,对数据结构这么抽象的一门学科学习来说,太困难了。我想学习方法也是很重要的一方面。本着我对学习的一个习惯就是看教材的目录。于是我们从最基本的“找关系”来学习数据结构。笔记记录的有时候有点天马行空,但是我希望当有人看到或者我自己温习的时候还是有点帮助的。
目录:
线性表的定义
线性表的抽象数据类型
顺序存储结构的插入与删除
线性表的链式存储结构
单链表的读取
单链表的插入与删除
单链表的整表创建
单链表的整表删除
单链表的结构与顺序存储结构的优缺点
静态链表
循环链表
双向链表
上述就是我学习的某本教材中关于线性表学习的目录,这时候我们来找关系:
(1)什么是线性表?-------线性表的定义
(2)数据类型就是数据类型,比如我们学的int,char都是一种数据类型,那抽象数据类型又是什么意思呢?---------线性表的抽象数据类型
(3)对一种存储结构通常进行的操作有插入(往里面放数据),删除(剔除不需要或者已用过的数据)。----------插入与删除
(4)线性表的存储结构是什么样?有哪几种?------------顺序存储结构与链式存储结构
(5)链式存储结构是否只是单一不变的如同顺序存储结构一样固定?-------------静态链表、循环链表、双向链表。
(6)只要是一种存储结构就应该有对应对其的操作,那不同的存储结构的操作方式是否相同?---------链表的操作。
问题部分是应该我们对学习一个未知知识提出的问题?通过目录其实我们就大致了解了一个内容如下:线性表是数据结构的一种,既然是一种数据结构就需要我们对他的存储结构进行一些操作,通过学习发现,线性表这种数据结构又有多种存储结构。不同的存储结构我们的操作方法又有些差别。
下面我们依次解决我们提出的问题:
(1)什么是线性表?
就如同大学里面进校园时,每个人都有一个学号,那我们一般从20140001开始算是第一个,假设一个班级是40个人,那最后一个就是20140040。
以20140001来说,他后面是20140002,但是前面没有了,那么就说他没有前驱
以20140040来说,他前面是20140039,但是后面没有了,那么就说他没有后继
以201400XY(1<xy<40)来说,他前面是201400xy-1,后面是20100xy+1,那么就说他有且只有一个前驱和后继
对于这样一个概念来说他就是一个线性表:零个或多个数据元素的有限序列。
扩展一下:上面所说的学号问题,我们需要点名册,那么就按照学号来的,但是学号这关联的还包括姓名、性别等信息。但是这一系列都是一个线性表。即:复杂的线性表,一个数据元素可以由若干数据项组成。比如说20140001这个数据元素,它可以包括:姓名、学号、性别等多个数据项。
(2)数据类型就是数据类型,比如我们学的int,char都是一种数据类型,那抽象数据类型又是什么意思呢?
其实我们处理器中已经存在了很多的数据类型,我们可以利用这些已经存在的数据类型进行“重新的组合”来形成新的结构,同样用已经实现的操作来组合新的操作。这就是所谓的抽象数据类型。
针对线性表而言,抽象数据类型定义如下:
ADT 线性表 (List)
Data
operation
InitList(*L):初始化操作,建立一个空的线性表
ListEmpty(L):若线性表为空,返回ture,否则返回false
clearList(*L):将线性表清空
GetElem(L,i,*e):将线性表中第i个位置的元素返回给e
LocateElem(L,e):在线性表中查找与给定值e相等的元素,如果查找成功,返回该元素在表中序号表示成功;否则,返回0表示失败
ListInser(*L,i,e):在线性表中的第i个位置插入新元素e
ListDelete(*L,i,*e):删除表L中第i个位置元素,并用e返回其值
ListLength(L):返回L的元素个数
endADT
运用:实现两个线性表A和B的并集操作。即使得A=A∪B。
分析:假设有A、B两个集合,就是把存在于集合B中的但不存在A中的数据元素插入A中即可。
实现代码:
void union(List *La,List Lb)
{
int La_len,Lb_len,i;
ElemType e;
La_len = ListLength(La);
Lb_len = ListLength(Lb);
for(i=1;i<Lb_len;i++)
{
GetElem(Lb,i,e);
if(!LocateElem(La,e,equal))
ListInsert(La,++La_len,e);
}
}
具体实现
3、线性表的存储结构
线性表有两种物理结构:顺序结构就是其中一种
顺序存储结构:用一段地址连续的存储单元依次存储线性表的数据元素。
在C语言中用一维数组来实现顺序存储结构。
关键点:起始位置、最大存储量
则顺序结构代码:
#define MAXSIZE 20
typedef int ElemType;
typedef struct
{
ElemType data[MAXSIZE];
int length;
}SqList