Return to Data Structures--线性表(一)

概述:

线性表是最常用且最简单的一种数据结构。它有两种存储结构,即顺序表与链表。在其上的操作主要有:查找、插入、删除等。[ 1 ]要掌握单链表上的插入、删除算法,必须明白:一是离不开对被操作结点的寻找;二是利用指向结点的指针的变化。其他操作比如: (1) 建立单链表就是不断地使用插入操作; (2) 销毁单链表、将单链表重置为空表,此两种操作都是不断使用删除操作; (3) 读取某个元素、计算单链表的表长则都是利用查找操作。对于循环链表,双循环链表,都可以用单链表的相关操作推出,不同的是多加一个指向前驱的指针。以后若无特殊声明,均指带头的单链表。

一、单链表

a1

a2

ai

ai+1

an    ^

head

不带表头节点的单链表

 

1、插入:在元素ai前插入一个新元素ax

情况一:i = 1;

实现语句:newnode -> link = head; head = newnode;

ax

a1

a2

head

ax

a1

a2

newnode

head

newnode

插入后

 

情况二:1 < i <= n;

实现语句: newnode -> link = q -> link ; q -> link = newnode ;

newnode

ax

ai-1

q

ax

ai

newnode

ai-1

ai

q

插入后

 

情况三: i > n;

实现语句:q -> link = q -> next ; delete q ;

 

2、删除

 

ai-1

q

ai

ai+1

q

ai-1

ai+1

二、双向链表

概述:由于单链表每个元素的指针都是指向其后继元素,在操作时只能从head开始从前向后依次访问每个结点,若对后面的数据元素访问后还要访问前面的数据元素,还是从头结点开始访问,即单链表不能反向操作,遂提出双向链表结构即除数据域外设两个指针域,一个指向直接驱结点,一个指向直接后断结点。双向链中数据元素因为有了指向前驱和后驱的两个指针域,在确定元素位置方面比单链表更具灵活性,访问效率高,但在某些操作(如插入、删除)则要繁琐些,步骤较多。

例:(插入)

假设P 为指向数据元素ai-1 的指针, P - > prior

为指向后继元素的指针, P - > next 为指向后继元

素的指针,S 为指向结点ax 的指针。

这个插入过程用程序语句可描述为:

S - > next = P - > next ; P - > next - > prior =S ;

S - > prior = P ; P - > next = S

^           

       a1

       an    ^

       a2

带头节点的双向链表

head

 

 

 

 

 

 

 

 

 

ai-1

       ai

ax

插入过程

S

P

 

 

 

ai-1

       ai             

ai+1  

删除过程

 

   

   

三、线性表的应用

1. 栈

顺序栈也就是栈的顺序存储结构。进栈与出栈操作分别相当于在顺序表的表尾进行插入与删除操作。链栈也就是栈的链式存储结构。进栈与出栈操作分别相当于在无头链表上插入首元结点与删除表头结点的操作。计算链栈的长度、读栈顶的操作可利用链表的查找算法。

2. 队列

顺序队列也即队列的顺序存储结构,由于该存储结构常出现假溢出,因此一般采用循环队列。链队列也即队列的链式存储结构。用链表表示的队列简称为链队列。进队与出队操作分别相当于在链表的表尾进行的插入操作与表头进行的删除操作,所不同的是链队列有指向队尾的指针Q. rear 。计算队列的长度、读队头可利用链表的查找算法。

3. 图

图是一种较复杂的数据结构。它有两种存储结构:邻接矩阵与邻接表。邻接矩阵也称数组表示。在邻接矩阵上求图中的边数、每个结点的度、入度、出度,相当于在顺序表上进行查找操作。邻接表是由顺序表与单链表构成的。邻接表的建立也就是对图中每一个结点都相应地建立一个链表,其建立过程与单链表的建立相同,即在表头进行插入操作。若求图中的边数、每个结点的入度、出度,相当于求链表的表长操作。

4. 查找表

查找表有静态查找表、动态查找表和哈希表。在此仅考虑顺序表与哈希表。顺序查找与线性表中的顺序表上的查找基本相同,所不同的是为了减少关键字的比较次数,使用了监视哨。哈希表分为闭散列表与开散列表。闭散列表与开散列表的建立以及在其上查找关键字的操作分别相当于在顺序表与链表上的查找与插入操作。

5. 排序

排序就是将一个记录的任意序列,按一定的规律重新排列成一个新序列的操作。其中直接插入排序算法主要利用线性表中的顺序表的查找、插入操作;归并排序其核心操作是将一维数组中前后相邻的两个有序序列归并为一个有序序列,其算法基本采用线性表中的两个有序表的合并算法;选择排序包括简单选择排序、树形选择排序、堆排序,它们的共同特点是每一趟在n - i + 1 (i = 1 , ⋯,n - 1) 个记录中选出关键字最小的记录作为有序序列中第i 个记录,其算法可利用线性表中的顺序表的查找算法。

四、算法题

(1) 有关多个线性表的操作。这类习题在线性表这一章属于高难度题,[2 ]如两个线性表混合合并、有序合并、取交集,一个线性表的数据元素进行分类等。若这些题用顺序表、链表做存储结构,实际使用的是前面提到顺序表、链表的查找、插入、删除操作的综合。

(2) 内部排序。比如,用链表做存储结构编写插入排序算法、冒泡排序算法、归并排序。这类习题主要用链表的查找、插入、删除操作。再比如奇偶交换排序、求中值记录的算法,这类习题也主要用于顺序表的查找、两数据元素交换。

 

参考文献:《线性表及其应用浅谈》 王素格 杨尔弘 (山西教育学院)

      

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值