线性表的顺序表示

线性表的顺序存储又称顺序表,它是用一组地址连续的存储单元依次存储线性表中数据元素,逻辑上相邻的数据物理上也相邻。第一个元素存储在线性表的起始位置,第i个元素的存储位置后面紧邻着存储的是第i+1个元素,称i为元素ai在线性表中的位序。因此,顺序表的特点是逻辑顺序相同物理位置也相同

顺序表的定义

typedef struct
{
	int data[maxsize] = {0};//顺序表的最大长度
	int length;//当前顺序表的长度
}SqList;

定义一个结构体变量,其中含有一个数据数组和保存表长的变量。此数组按照实际所需要的数据类型来定义。

顺序表的初始化

void InitList(SqList &L) 
{
	L.length = 0;//将顺序表的长度设置为0
}

将表长设置为0,表示空表。

顺序表的插入操作

int ListInsert(SqList &L, int i,int e)
{
	if (i<1 || i>L.length + 1)return 0;
	if (L.length >= maxsize)return -1;
	for (int j = L.length-1; j>=i-1; j--) 
	{
		L.data[j + 1] = L.data[j];//将顺序表的插入位置之后的数据后移
	}
	L.data[i - 1] = e;//将元素插入到位置i
	L.length++;
	return 1;
}

 此操作需要将所插入的位置和数据传入函数,首先判断所给出的位序是否合法,若不合法则直接返回0,若合法则进一步需要判断数组是否已经满,若满则返回-1,表示此数组无法再插入数据。令j等于数组的最后一个数据(数组下标-1),若j大于等于i-1,也就是所要插入的位置的数组下标,则将位序及之后的数据统一向后挪一个位置,反复如此。最后将所要插入的数据赋值给数组下标i-1的位置上,表长加1,时间复杂度O(n)。

顺序表的删除操作

int ListDelete(SqList& L, int i)
{
	if (i<1 || i>L.length)return 0;
	for (int j = i; j < L.length; j++) 
	{
		L.data[j - 1] = L.data[j];//将i位置之后的元素全部前移
	}
	L.length--;
	return 1;
}

此操作是将顺序表中位序为i的数据删除,首先判断所给位序是否合法,若小于1或大于数组长度则返回0,操作失败。令j=i也就是实际位序i+1的数据位序,若j<表长,则令后一个元素向前挪动,知道数组最后一个元素,数组下标为length-1的那个数据也挪好为止。表长减一,时间复杂度O(n)。

顺序表按值查找

int LocateElem(SqList &L,int e)
{
	if (L.length==0)return 0;//如果表为空,则退出
	for (int i = 0; i < L.length; i++) 
	{
		if (L.data[i] == e)	return i+1;
	}
     return -1;
}

此操作就是在顺序表数组中寻找与所给元素相同的数据,首先判断表是否为空,若为空,则返回0,操作失败。否则顺序遍历数组,若找到则返回他的位序,若没有则返回-1表示未找到。按序查找直接输出即可,无需过多操作,时间复杂度O(n)。

全部代码

#include<stdio.h>
#include<stdlib.h>
#define maxsize 10
#define initsize 10
#pragma warning(disable:4996)
#pragma warning(disable:5208)


//顺序表的定义
typedef struct
{
	int data[maxsize] = {0};//顺序表的最大长度
	int length;//当前顺序表的长度
}SqList;

//顺序表的初始化
void InitList(SqList &L) 
{
	L.length = 0;//将顺序表的长度设置为0
}

//顺序表的插入操作
int ListInsert(SqList &L, int i,int e)
{
	if (i<1 || i>L.length + 1)return 0;
	if (L.length >= maxsize)return -1;
	for (int j = L.length-1; j>=i-1; j--) 
	{
		L.data[j + 1] = L.data[j];//将顺序表的插入位置之后的数据后移
	}
	L.data[i - 1] = e;//将元素插入到位置i
	L.length++;
	return 1;
}

//顺序表的删除操作
int ListDelete(SqList& L, int i)
{
	if (i<1 || i>L.length)return 0;
	for (int j = i; j < L.length; j++) 
	{
		L.data[j - 1] = L.data[j];//将i位置之后的元素全部前移
	}
	L.length--;
	return 1;
}

//顺序表按值查找
int LocateElem(SqList &L,int e)
{
	if (L.length==0)return 0;//如果表为空,则退出
	for (int i = 0; i < L.length; i++) 
	{
		if (L.data[i] == e)	return i+1;
	}
	return -1;
}
//主函数
int main()
{
	SqList L;
	int i, e = 0, a;
	InitList(L);
	printf("当前顺序表的长度:%d\n", L.length);
	printf("初始化顺序表:\n");
	for (i = 1; i <= 7; i++)
	{
		ListInsert(L, i, i);//按自然数顺序初始化表
	}
	for (i = 0; i < L.length; i++)
	{
		printf("%d ", L.data[i]);//顺序打印初始化的表
	}
	printf("当前的表长%d\n", L.length);
	/*printf("请输入要插入的数据与位置:\n");
	scanf("%d,%d", &i, &e);
	a=ListInsert(L, i, e);
	printf("执行的结果是%d\n", a);
	printf("插入的结果是:\n");
	for (i = 0; i < L.length; i++)
{
		printf("%d ", L.data[i]);
	}*/
	/*printf("请输入要删除的元素的位序:");
	scanf("%d", &e);
	a = ListDelete(L, e);
	printf("执行的结果是%d\n", a);
	printf("删除的结果是:\n");
	for (i = 0; i < L.length; i++)
	{
		printf("%d ", L.data[i]);
	}*/
	printf("请输入要查找的元素:");
	scanf("%d", &e);
	a=LocateElem(L, e);
	printf("要查找的元素位序是:%d 以及执行结果是:%d", e,a);
	
}

经测试,可以完成基本操作,持续改进学习中,希望大家多多指教。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值