第二讲 线性结构

第二讲 线性结构

线性表及其实现

1,顺序存储

线性表是零个或多个数据元素的有限序列,元素之间有顺序,且第一个元素无前驱,最后一个元素没有后继,其它的元素都有一个前驱一个后继,就是我们说的一对一。
我们先来谈一谈顺序存储结构,顺序存储是通过一维数组来实现的,且顺序结构存储需要三个属性,存储空间的起始位置,线性表的最大存储容量,以及线性表的当前长度。如果需要获取里面的数据,那么要通过下标的值来获取。
插入操作
数组的插入,那么我们要先判断空间是否足够,因为数组是一个固定的存储结构,如果我们想要插入一个数,那么我们要从要插入的位置开始,把所有的数都往后移一位,把当前位置空出来,然后再把数插进去,下面是代码实现

bool Insert( List L, ElementType X )
{
    int i,j;
    if(L->Last==MAXSIZE-1)
    {
        return false;
    }
    for(i=0;i<=L->Last;i++)
    {
        if(L->Data[i]==X)
        return false;
        else if(L->Data[i]<X)
        {
            for(j=L->Last;j>=i;j--)
            {
                L->Data[j+1]=L->Data[j];
            }
            L->Data[i]=X;
            L->Last=L->Last+1;
            break;
        }
        else if(L->Last==i&&L->Data[i]>X)
        {
            L->Data[i+1]=X;
            L->Last=L->Last+1;
            break;
        }
    }
    return true;
}

删除操作
那么我们找到当前想要删除的地方,先判断当前删除的位置是否在数组范围内,然后如果是在中间我们可以将从这个位置开始之后的元素都往前移动一位,如果在末尾,我们就不用移动直接删去就行。我们写一下主要的步骤

if(L->length==0)//判断数组是否为空
return error;
if(i<l||i>L->length)//判断是不是越界
return error;
if(i<L->length)//判断删除位置是否为末尾
{
for(k=i;k<L->length;k++)
{
L->data[k-1]=L->data[k];
}
L->length--;
return true;
}

总结一下顺序存储结构的优缺点
优点是可以快速的获取表中的元素,缺点是插入删除需要移动大量元素,当数据过多时,难以确定一个容量。

2,链式存储
链式存储结构就是为了解决插入删除这个麻烦的问题的,链式存储结构是有多个结点构成的一个链表,每一个结点有两个部分构成,一个是存放数据的数据域一个是用来链接结点的指针域,我们称第一个结点为头结点,因为有两部分构成,所以我们在构建一个链表的时候往往采用的是结构体来定义

struct node
{
	Elemtype data;
	struct node *next;;

如果想要读取其中的一个数,我们常常会设一个头指针方便我们遍历链表。
插入操作
单链表的插入就不像数组那样,而是直接申请一个新的空间,然后改变指针,就可以完成插入操作,如下图
在这里插入图片描述
核心代码是

struct node *s;
s=(struct node *)malloc(sizeof(struct node));
s->date=e;
s->next=p->next;
p->next=s;

如果看不懂可以结合上面的图看看
删除操作
删除操作就更容易理解了,直接把p的指针指向当前所指结点的下一个结点
在这里插入图片描述

struct node *p;
p->next=p->next->next;

还有循环链表,循环链表其实和单链表没差别就是将尾指针指向头部,双向链表就是加了一个指向前驱的指针,使得遍历更方便。
链表的优缺点
链表的优点是可以储存任意多得数据,不用担心会越界,且不会浪费储存空间,想要就随时申请,而且删除插入很方便,不用去移动其它位置的数,缺点是想要找到每个数的时候每次都要从头开始遍历寻找。

堆栈

栈的作用我们可以联想一下手枪,先装进去的子弹肯定是最后打出去的,最后装的,一定是第一个打出去的,由此我们可以联想到栈其实就是仅仅限定在表尾进行插入和删除操作的线性表,允许插入和删除的一端称为栈顶,另一端称为栈底,不含任何元素的称为空栈。我们可以对栈进行简单记忆就是后进先出。栈的插入操作又称为进栈,也称压栈,入栈,栈的删除操作,叫作出栈,又称为弹栈。
栈的顺序存储的结构及实现
我们也可以使用数组来实现,通过移动rail来实现入栈和出栈。

int head=0,rail=0,t;
int a[1000];
for(int i=0;i<100;i++)//入栈
{
	scanf("%d",&t);
	a[rail++]=t;
}
for(int i=0;i<100;i++)//出栈
{
	t=a[rail--];
	printf("%d",t);
}

栈的应用—四则运算表达式求值
先看后缀表达式的计算
在这里插入图片描述
中缀表达式转后缀表达式
在这里插入图片描述

队列

队列的定义,队列就相当于我们日常生活中的排队,排在前面的人先走,队列就是只允许在一端进行插入操作,而在另一端进行删除操作的线性表,允许插入的一端称为队尾,允许删除的一端称为队头。
队列也可以用数组来实现,通过移动队尾标记来实现插入,移动头标记实现删除操作。

int head=0,rail=0,t;
int a[100];
for(int i=0;i<100;i++)
{
	scanf("%d",&t);
	a[rail++]=t;
}
for(int i=0;i<100;i++)
{
	t=a[head++];
	printf("%d ",t);
}
Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值