首页 > 代码库 > 数据结构-线性表(2)

数据结构-线性表(2)


线性表定义:

 

线性表是最基本、最简单、也是最常用的一种数据结构。线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的。线性表的逻辑结构简单,便于实现和操作。因此,线性表这种数据结构在实际应用中是广泛采用的一种数据结构。


      


存储空间是否连续:

 

一、顺序表的特点是逻辑上相邻的数据元素,物理存储位置也相邻,并且,顺序表的存储空间需要预先分配。

 

            


优点: 

(1)方法简单,各种高级语言中都有数组,容易实现。   

(2)不用为表示节点间的逻辑关系而增加额外的存储开销。  

(3)顺序表具有按元素序号随机访问的特点。

缺点: 

(1)在顺序表中做插入、删除操作时,平均移动表中的一半元素,因此对n较大的顺序表效率低。 

(2)需要预先分配足够大的存储空间,估计过大,可能会导致顺序表后部大量闲置;预先分配过小,又会造成溢出。

 

二、在链表中逻辑上相邻的数据元素,物理存储位置不一定相邻,它使用指针实现元素之间的逻辑关系。并且,链表的存储空间是动态分配的。


            


优点:插入、删除运算方便。 

缺点: 

(1)要占用额外的存储空间存储元素之间的关系,存储密度降低。存储密度是指一个节点中数据元素所占的存储单元和整个节点所占的存储单元之比。  

(2)链表不是一种随机存储结构,不能随机存取元素

 

链表的操作:

针对双向链表来说,如图:

  

              


删除结点:


            


代码:

p->prior->next=p->next;//p的前驱结点的后链指向p的后继结点

p->next->prior=p->prior;//p后继结点的前链指向P的前驱结点

Free(p)

 

 

插入结点:


            


代码:

q->prior=p;//q的前链指向p

q->next=p->next;//q的后链指向p的后继结点

p->next->prior=q;//p的后继结点的前链指向q

p->next=q;//p的后链指向q

 

对于插入操作来说,要先连线再拆线!而且前链和后链指向的均为数据域!

 

 

顺序表与链表对比


            


栈,队列,数组

 

栈是限制在表的一端进行插入和删除的线性表。允许插入、删除的这一端称为栈顶,另一个固定端称为栈底。当表中没有元素时称为空栈。--先进后出

 

                                


队列(Queue)是限定只能在表的一端进行插入和在另一端进行删除操作的线性表。--先进先出

 

        



循环队列:

 

由来:

 

如图:


        


如果数组的最大下标为5,元素J6已占用了该单元,如果还要有元素入队列,则将超出数组的下标范围,从而使将要入队的新元素无法进入队列,而此时数组中下标底端还有空位置,即数组的实际空间并没有占满,这种现象称为“假溢出”。

若要插入新元素,应将队列中现有元素向队首方向移动,以便在队尾腾出空间。

为了避免元素的移动,可以将存储队列元素的一维数组首尾相接,形成一个环状,这样的队列称为循环队列--克服假上溢

 

循环队列如图:


              


总结:

 

线性表根据存储空间是否连续分为顺序表和链表,栈和队列都是特殊的线性表,它们二者的区别在于出栈的顺序不同。而数组是线性表的变化形式,一般在写程序时线性表都用数组来表示。它们都是软件设计中常用的数据结构。可以说,栈和队列是操作受限的线性表。