数据结构——线性表的顺序存储

发布于:2022-12-05 ⋅ 阅读:(442) ⋅ 点赞:(0)

目录

线性表的逻辑结构

线性表的顺序存储

顺序存储的结构

查找线性表的顺序存储结构的基本运算

1.顺序表的查找

 2.顺序表的插入

3.顺序表的删除

4.顺序表的合并


线性表的逻辑结构

 线性表是n个类型相同的数据元素的有限排列,数据之间就像上图一样像链锁一样一个接一个的连接在一起,线性表是一种最简单的数据结构。线性表有顺序存储链式存储两种结构,我会分两次来学习这两种不同的结构,下面让我们先来了解一下顺序存储吧。

线性表的顺序存储

线性表的顺序存储就是在内存中开辟一块连续的空间,来依次存储数据,他是靠内存地址的连续来体现出数据之间在逻辑上的相邻性

顺序存储的结构

线性表的存储结构就像一维数组一样。相邻数据元素的地址是连续的。

 上面我们创建了一个线性表的顺序存储结构,当我们存储第一个元素时是存在elem[0]中的,导致了线性表中的序号和数组中的序号不同。其中last记录的是线性表中最后一个元素在数组elem[ ]中的位置,对于上图来说也就是last=99。我们通过定义seplist L 然后通过L.elem[i-1]来访问顺序表中第i个元素,也可以定义一个seplist*PL的指针变量,然后使PL=&L,然后通过PL->elme[i-1]来访问顺序表中第i个元素。

查找线性表的顺序存储结构的基本运算

1.顺序表的查找

当我们要查找第n个元素时,就是查找elme[n-1]这个数组元素。其中需要注意的就是n是顺序表中的序号,但我们返回的是elem【n-1】这个数组元素,代码如下。

char getelem(seplist L, int n)//在顺序表L中寻找第n个元素
{
	int i = 0;
	while (i < L.last && i < n)
		i++;
	if (i == n)
		return(L.elem[i - 1]);//顺序表中第n个元素是elem[n-1]
	else
		return(-1);
}

 2.顺序表的插入

我们学习数组时也有在数组中插入的操作,这时我们需要把插入位置之后的元素依次向后移动,来空出需要插入的位置,然后执行插入操作。顺序表的插入操作也是同样的道理。在第i个元素之前插入新元素后,顺序表的长度加一。代码如下。

int insert(seplist * L, int i, char e)//在第i个位置之前插入元素e
{
	//这里我们需要注意两种不能插入的情况
	if (L->last >= 99)
	{
		printf("表已满\n");
		return (-1);
	}
	if (i<1 || i>L->last + 1)
	{
		printf("位置不合法\n");
		return (-1);
	}
	for (int j = L->last; j >= i - 1; j--)
	{
		L->elem[j + 1] = L->elem[j];//把第i个及以后的元素往后移动
	}
	L->elem[i - 1] = e;
	L->last++;
	return 1;
}

 插入时我们要注意两种不能插入的情况:一个是插入位置不合法,还有一个是表已满,i的取值范围是1<i<=L->last+1

3.顺序表的删除

在顺序存储中删除一个元素需要将删除的元素后的每个元素依次向前移动,在总共有n个元素的顺序表中,删除第i个元素后,需要将第(i+1)个到第n个元素整体向前移动变成第i到n-1个,顺序表的长度减一。i的取值范围也是需要在顺序表的长度之内的,即1<i<=L->last+1。代码如下。

int delete(seplist* L, int i)
{
	if (i<1 || i>L->last + 1)
		printf("插入位置不合法\n");
	for (int j = i-1 ; j < L->last; j++)
	{
		L->elem[j] = L->elem[j + 1];
	}
	L->last--;
	return(1);
}

4.顺序表的合并

 现有两个顺序表LA=(1,3,5)和顺序表LB(1,2,3,4)。我们想让这两个顺序表合并成一个LC(1,2,3,3,4)。那如何操作呢。首先我们需要一个空表LC,然后让LA,LB中的元素从第一个开始两两比较,然后将较小的一个存入空表LC中。

设置两个变量i=0,j=0,k=0,分别指向LA,LB,LC,然后让LA中第i个元素与LB中第j个元素比较假如LA->elem[i]比较小,就把LA->elem[i]赋给LC中第一个元素,然后将i+1,指向LA中i+1个元素,而j不变,再将LA中的i+1个元素与LB中第j个元素比较。重复操作,最后如果LA或LB中有剩余的元素,就把剩余的元素赋给LC。代码如下。

void merge(seplist* LA, seplist* LB, seplist* LC)
{
	int i = 0, j = 0, k = 0;
	while (i <= LA->last && j <= LB->last)//将LA,LB中的元素作比较,较小的赋到LC中
	{
		if (LA->elem[i] <= LB->elem[j])
		{
			LC->elem[k] = LA->elem[i];
			i++;
			k++;
		}
		else
		{
			LC->elem[k] = LB->elem[j];
			j++;
			k++;
		}
	}
	while (i <= LA->last)//当LA剩下元素时将剩余元素赋给LC
	{
		LC->elem[k] = LA->elem[i];
		i++;
		k++;
	}
	while (j <= LB->last)//当LB剩下元素时将剩余元素赋给LC
	{
		LC->elem[k] = LB->elem[j];
		j++;
		k++;
	}
}

好了,线性表的顺序存储结构的基础学习就到这里啦,后面我还会写线性表的链式存储,如果你觉得对你有帮助请多多支持我吧!

本文含有隐藏内容,请 开通VIP 后查看

网站公告


今日签到

点亮在社区的每一天
去签到