线性表的顺序存储(顺序表)的定义、插入删除及查询

一、顺序表的定义

1、线性表的顺序存储又称顺序表,用一组地址连续的存储单元依次存储线性表中的数据元素,从而使得逻辑上相邻的两个元素在物理位置上也相邻。
2、连续的存储单元就是数组。
4、定义顺序表的数据结构

#define Maxsize 20  //顺序表的大小 
typedef int Elemtype; //方便改变顺序表的中数据元素的类型 
typedef  struct{  //定义顺序表结构体 
	Elemtype data[Maxsize]; //用一段连续的空间即数组来存储顺序表 
	int length; //顺序表的长度 
}Sqlist;  //顺序表的类型定义

5、初始化:

Sqlist L;  
L.data[0] = 1;
L.data[1] = 2;
L.data[2] = 3;
L.length = 3;

二、顺序表的插入

1、首先判断:插入的位置是否合理,若现在有三位数字,则插入的合理位置为第一位到第四位(最后一位的后面一位也可以插入),其次判断顺序表存储空间是否已满。

//首先要判断插入的位置是否合理
if(pos<1||pos>L.length+1)  //L.length+1 即是顺序表最后一位的后面 
{
	return false;
} 
if(L.length==Maxsize) //顺序表已满 
{
	return false; 
} 

2、移动元素:把要插入的位置的元素和以后的元素全部后移,用下标 i 记录每个元素后移后的位置,用前一个位置的元素覆盖,下标i 的范围应该是L.length到pos。这样的话,最后一位元素data[L.length-1]就移动到了L.length下标处,下标pos-1也就是我们实际要插入的位置,就移动到了pos下标处。

//移动元素 
for(int i=L.length; i>=pos; i--) //用i记录顺序表中元素被移动后的新位置 当然是从L.length开始
{
	L.data[i] = L.data[i-1]; //右边的元素被左边的元素覆盖 即元素后移 
}

3、插入元素,并更新结构体。

L.data[pos-1] = new_data; //插入新元素 
L.length++; //更新顺序表的长度

三、顺序表的删除

1、首先判断删除位置是否合理,若现在有三位元素,则能删除的位置自然是第一位到第三位,其次判断顺序表是否为空。

//判断删除的位置是否合理
if(pos<1||pos>L.length)
{
	return false;
}
if(L.length==0) //顺序表是空的 
{
	return false;
}

2、移动元素,把要删除位置的元素的后面一位元素移动到要删除位置,就完成了元素的覆盖,也就删除了该元素,用下标 i 记录要移动的元素的位置,覆盖到前一位置,下标 i 的范围应该是pos到L.length,这样下标pos-1位置也就是实际要删除的位置的元素就被下标pos覆盖了,顺序表最后一位元素下标L.length-1就被下标L.length位置空元素覆盖了。

//移动元素
for(int i=pos; i<=L.length; i++) //i记录右边的元素 从pos-1元素开始被覆盖 也删除了第pos-1位 
{
	L.data[i-1] = L.data[i]; //左边的元素被右边的元素覆盖 即前移 
}

3、更新结构体

L.length--; //更新顺序表的长度 

四、顺序表的查询

1、遍历
2、判断
3、返回第一个满足条件的位置

for(int i=0;i<L.length;i++) //遍历 
{
	if(L.data[i]==data)
	{
		return i+1;
	} 
}

五、完整代码

#include <stdio.h>
#define Maxsize 20  //顺序表的大小 
typedef int Elemtype; //方便改变顺序表的中数据元素的类型 
typedef  struct{  //定义顺序表结构体 
	Elemtype data[Maxsize]; //用一段连续的空间即数组来存储顺序表 
	int length; //顺序表的长度 
}Sqlist;  //顺序表的类型定义

//插入顺序表
bool insert_list(Sqlist &L, int pos, Elemtype new_data) //因为要改变顺序表的值所以要加引用& 
{
	//首先要判断插入的位置是否合理
	if(pos<1||pos>L.length+1)  //L.length+1 即是顺序表最后一位的后面 
	{
		return false;
	} 
	if(L.length==Maxsize) //顺序表已满 
	{
		return false; 
	} 
	//移动元素 
	for(int i=L.length; i>=pos; i--) //用i记录顺序表中元素被移动后的新位置 当然是从L.length开始
	{
		L.data[i] = L.data[i-1]; //右边的元素被左边的元素覆盖 即元素后移 
	}
	//移动结束 说明此时pos位置被pos-1覆盖了
	L.data[pos-1] = new_data; //插入新元素 
	L.length++; //更新顺序表的长度
	return true; 
 } 

//删除
bool delete_list(Sqlist &L, int pos, Elemtype &backup)  //backup 用来记录要删除的元素的值
{
	//判断删除的位置是否合理
	if(pos<1||pos>L.length)
	{
		return false;
	}
	if(L.length==0) //顺序表是空的 
	{
		return false;
	}
	//移动元素
	for(int i=pos; i<=L.length; i++) //i记录右边的元素 从pos-1元素开始被覆盖 也删除了第pos-1位 
	{
		L.data[i-1] = L.data[i]; //左边的元素被右边的元素覆盖 即前移 
	}
	L.length--; //更新顺序表的长度 
	return true; 
 } 

//查询元素的位置
int located_list(Sqlist L, Elemtype data)
{
	for(int i=0;i<L.length;i++) //遍历 
	{
		if(L.data[i]==data)
		{
			return i+1;
		} 
	}
	return 0;
 } 

//打印顺序表
void print(Sqlist L)
{
	for(int i=0;i<L.length;i++)
	{
		printf("%d ",L.data[i]);
	}
} 

int main()
{
	//定义顺序表 
	Sqlist L;  
	L.data[0] = 1;
	L.data[1] = 2;
	L.data[2] = 3;
	L.length = 3;
	//插入
	bool ret; //用来接收插入函数的返回值 
	ret = insert_list(L,4,90); 
	if(ret){
		print(L);
		printf("\n");
	}else{
		printf("error\n");
	}
	//删除
	Elemtype backup; //用来存储要删除的那个元素 
	ret = delete_list(L,3,backup); 
	if(ret){
		print(L);
		printf("\n");
	}else{
		printf("error\n");
	}
	//查询元素的位置
	int pos; //接收函数的返回值 所查询元素的位置 
	pos=located_list(L, 90);
	if(pos)
	{
		printf("%d\n",pos);
	}else{
		printf("error\n");	
	}
	return 0;
 } 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘学.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值