第二讲 线性结构

第二讲 线性结构

线性表及其实现

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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值