数据结构之线性表

线性表ADT

取自严蔚敏版数据结构

ADT List{
数据对象:D = {ai | ai ∈ ElemSet, i = 1,2,…, n, n>= 0}
数据关系:R1 = {<ai-1, ai> | ai-1, ai∈D, i = 2, …, n}
基本操作:InitList(&L)
     Length(L)
     LocateElem(L, e)
     GetElem(L,i)
     ListInsert(&L, i, e)
     LIstDelete(&L,i,&e)
     PrintList(L)
     Empty(L)
     DestroyList(&L)
}ADT List

线性表之顺序表

顺序表——用顺序存储的方式来实现线性表的存储。属于一种逻辑结构
初始化:动态分配和静态分配

动态分配

L.data = (ElemType *)malloc(sizeof(ElemType) * MaxSize);

malloc函数返回一个指针,需要强制转型为定义的数据元素类型指针,参数指明要分配多大的连续内存空间。
头文件为 <stdlib.h>

静态分配

其实就是一个数组,从一开始就固定了大小,不易扩展。

插入与删除

在第i的位置上插入
 移动(n - i +1)

最好情况i = n+1移动0次
最差情况i = 1移动n次
平均情况1/n∑(n - i + 1)移动n/2次

删除第i个元素
 移动(n - i )

最好情况i = n移动0次
最差情况i = 1移动n-1次
平均情况1/n∑(n - i)移动(n-1)/2次

插入与删除的区别在于,删除只能删去n个元素,而插入可以插到n+1个位置。因此,介于此去记忆理解就可以得到以上结果。

线性表之链表

链表就是使用链式存储实现的结构,同样也是一种存储结构。说到这,其实自然就想到了逻辑结构,线性表就是一个逻辑结构。那么如何识别两种结构?

  1. 逻辑结构是针对问题描述所形成的,他的对象就是问题本是,与计算机,与存储结构无关。
  2. 存储结构,又叫物理结构。那么自然就是与计算机有关的,是针对逻辑结构所做出的存储选择,是逻辑结构在计算机世界的映象,使用计算机语言实现。
  3. 因此区分是否为逻辑还是存储,便是探究其是否可以由多种结构存储的问题。若只是反映了数据关系,并且可以使用多种存储结构实现,那便是逻辑结构。 例如,栈有顺序栈和链栈;队列有顺序队列和链队列等等。

在此特意说说静态链表。为啥呢?因为我发现做了几个简单的选择题,居然栽在这上面了。

  1. 静态链表的出现,并不是为了解决顺序表的某个缺点而产生的。因此它不同时具备链表的优点和顺序表的优点。
  2. 静态链表的出现,是为了那些没有指针的高级语言,用数组来实现这种结构。

操作受限的线性表

常用的一个逻辑结构,也是一个操作受限的线性表。操作受限就是指的只能一边进,同时也是那一边出。就像一个胡同一样。相关应用有括号匹配,表达式求值,递归,进制转化,迷宫求解,函数调用等等。

表达式求值

初学认为这个有点绕,其实后知后觉,这个不难。表达式求值=中缀转后缀 + 后缀的计算
中缀转换成后缀
 给定中缀,转成后缀。通过一个符号栈进行。记住,符号进栈即可。
后缀表达式的计算
 通过一个对象栈进行。记住,数字进栈即可。
综上,后缀表达式求值(做题)就是将给定的一个中缀表达式先手写成后缀表达式,然后就进栈操作,就可以将对象栈写出来了。至于符号栈,如果采取一致原则,那么中缀还是后缀,从左往右就行了。

队列

队列就是排队问题,一个接着一个,只要你排上队了,那你必须排完(不准跑,即使队伍很长),意思是必须从第一(front)的位置那出队。就好比是一个独木桥。
说着说着,有个很简单的问题:那就是循环队列是什么结构呢?
  分析:能用链队列实现吗?不可以,那么他就是逻辑结构。
循环队列是因为循环队列假溢出的问题才想到的一个解决方法。因此他就是顺序队列。使用模的数学知识,解决假溢出问题。使得顺序队列的物理上的问题转成一个逻辑上的闭环,从而解决了假溢出问题。
不过,其实又引出新问题,那就是空与满的问题?如何去判断呢?

常用解决问题方法有三个:1. 加一个标志位tag 2. 加一个结构体变量size 3. 空一个单元

其实三个方法都挺简单的,我就不写了。
不过,其实这里面有一个问题,那就是空一个的方法。如何做到最后一个不用呢?
其实也很简单,就是判断满的条件设置好就行了。谈到满,那空呢?那便是“如何开始呢?”的问题了。
这就是一个做题中出现过的一个问题,乍一做,不对味(当然其实不难)但其实仔细分析一下,还是有点意思的。发现,最终判满和开始的front和rear的位置问题,都是由进队和入队决定的。此话怎讲?
这就要回顾入队和出队问题了,其实出队和入队就两种情况,先赋值后移动还是先移动后赋值 理解这个,就可以理解整个问题了。这里就不想打字了,附图如下:
有点看不清,就这样吧hh

其实就是只能由字符组成的序列,也是线性表的一种。

串,即字符串是由零个或多个字符组成的有限序列

对比一下,线性表定义

线性表是由相同的数据类型的n(n >= 0)个数据元素的有限序列

难理解的话其实就是模式匹配问题,多看看书就会理解了。做选择题的话其实就是写出数组的问题。掌握这里就行了。搞懂前缀和后缀关系就可以了,这里也附图了,不想打字了:
在这里插入图片描述

广义表

对线性表的一种推广,也结合了树。具有共享和递归特性。
也不难,记住常规操作即可。对了,考考你:你会画广义表的头尾链表存储结构和扩展线性链表存储结构吗?

至此,就分享到这里了。
感谢您能看到这里,文中的难易评价均是笔者水平比较,并不是骄傲,我也是勤勤恳恳的学过来的。希望和大家一同进步。如果对你有用,我会很开心;如果有错误也请指出,感谢!!!
最后,希望动动你的小手指☀

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值