顺序表的基本操作(非常全,非常详细)

1.顺序表的定义

#define LIST_INIT_SIZE 100
typedef char ElemType;
typedef struct
{
	ElemType data[LIST_INIT_SIZE];//存储顺序表元素空间
	int length;//顺序表长度(以sizeof(ElemType)为单位)
}SqList;//顺序表类型定义

2.初始化顺序表
在主函数中利用malloc函数向堆区分配一个大小为Sqlist的空间并返回一个指向该内存空间的无类型的指针,利用强制转化,将指针转化为一个Sqlist*类型的指针,并赋值给L。
使用 初始化函数将顺序表的现有长度初始化0。

//构造一个空的顺序表L
void InitSqList(SqList *L)
{
	L->length=0;//初始长度为0
}

3.增加元素
顺序表的添加可以想象成排队时有人插队。排队时每个人的位置都是固定的,当有人要插队时,那它插队时后面的每个人都要向后移动,不然没有位置让他插。
还需要判断插入的位置是否合法,比如那里本来就没人,你怎么去插队是吧。判断时还需注意数组下标是从0开始的,所以判断是否合法时,临界值要注意不能出错。
因此步骤是:判断插入位置是否合法->元素后移->最后插入。

//在顺序表L中第i(1≤i≤ListLength(L))个位置上插入新的数据元素e
void SqListInsert(SqList *L,int i,ElemType e)
{
	int j;
	if(i>=1&&i<=L->length+1)//判断i是否合法
	{
		i--;
		for(j=L->length;j>i;j--)//找到插入的位置
			L->data[j]=L->data[j-1];
		L->data[i]=e;//将元素插入到已找到的适当位置
		L->length++;    //顺序表L长度增一
	}
	else
		printf("i不符合要求");
}

这里if语句就是判断是否合法,for语句用来找到插入位置并后移元素,之后插入。
假设插入位置为3。

进行元素后移
元素后移
最后进行添加。
4.显示顺序表中元素个数
这个没什么好说的,直接返回就行了。

//求顺序表L中数据元素个数
int SqListLength(SqList *L)
{
	return L->length;
}

5.判断顺序表是否为空
这里根据顺表长度判断。返回值1代表不为空,返回值为0代表顺序表为空。

//判断顺序表L是否为空
int SqListEmpty(SqList *L)
{
	//调用函数可通过判断函数返回值确定结果状态
    if(L->length==0)//根据顺序表L当前长度判断
        return 0;
    else
        return 1;
}

6.求顺序表特定位置的元素
这里同理,也要先判断位置是否合法。如果合法则直接返回该位置的元素。不合法则退出函数。

//求顺序表L中第i(1≤i≤ListLength(L))个数据元素的值
char GetSqListElem(SqList *L,int i,ElemType e)
{
	if(i>=1&&i<=L->length)//判断i是否合法
	{
		e=L->data[i-1];//获取第i个元素的值
		return e;
	}
	else
		printf("i不符合要求");
}

7.求顺序表L中第1个与e的值相等的数据元素的位序
这里也很简单,直接遍历一遍顺序表,进行与e值得比较,那怎样判断顺序表中没有与e相等得元素呢?遍历结束时i值就等于顺序表得长度,因此可以根据i得值来判断。

//求顺序表L中第1个与e的值相等的数据元素的位序
int LocateSqListElem(SqList* L, ElemType e)
{
	int i;
	for (i = 0; L->data[i] != e && i < L->length; i++)//判断条件,在i合法的基础上逐个比较当前值与e值是否相等
		;
	if (i == L->length)//根据情况返回相应的值
		return -1;
	else
		return i + 1;
}

8.删除指定位置得元素
删除元素时也可以想象成排队。正在排队时你前面的人走了,这时(你内心是不是很高兴)你立马向前走一步把那个空位补上,同理你后面的人也向前走补空位。因此删除时步骤:判断位置是否合法->合法则删除->补空位。
删除前
删除后

//删除顺序表L的第i(1≤i≤ListLength(L))个数据元素
void SqListDelete(SqList *L,int i)
{
	int j;
	if(i>=1&&i<=L->length)//判断i是否合法
	{
		i--;
		for(j=i;j<L->length-1;j++)//找到插入的位置
			L->data[j]=L->data[j+1];//元素前移
		L->length--;    //顺序表L长度减一
	}
	else
		printf("i不符合要求");
}

9.销毁顺序表
主函数创建顺序表时,利用malloc函数向堆区申请了空间,堆区内存需要我们自己释放,因此销毁顺序表时,利用free函数将内存释放。

//销毁顺序表L
void DestroySqList(SqList *L)
{
	free(L);
}

完整代码如下:

#include<stdio.h>
#include<malloc.h>
#define LIST_INIT_SIZE 100
typedef char ElemType;
typedef struct
{
	ElemType data[LIST_INIT_SIZE];//存储顺序表元素空间
	int length;//顺序表长度(以sizeof(ElemType)为单位)
}SqList;//顺序表类型定义
//基本操作算法代码实现

//构造一个空的顺序表L
void InitSqList(SqList* L)
{
	L->length = 0;//初始长度为0
}

//销毁顺序表L
void DestroySqList(SqList* L)
{
	free(L);
}

//判断顺序表L是否为空
int SqListEmpty(SqList* L)
{
	//调用函数可通过判断函数返回值确定结果状态
	if (L->length == 0)//根据顺序表L当前长度判断
		return 0;
	else
		return 1;
}

//求顺序表L中数据元素个数
int SqListLength(SqList* L)
{
	int l;
	l = L->length;
	return l;
}

//输出顺序表L中的元素
void DispSqList(SqList* L)
{
	int i = 0;
	while (i < L->length)//依次输出元素
	{
		printf("%c ", L->data[i]);
		i++;
	}
	printf("\n");
}

//在顺序表L中第i(1≤i≤ListLength(L))个位置上插入新的数据元素e
void SqListInsert(SqList* L, int i, ElemType e)
{
	int j;
	if (i >= 1 && i <= L->length + 1)//判断i是否合法
	{
		i--;
		for (j = L->length; j > i; j--)//找到插入的位置
			L->data[j] = L->data[j - 1];
		L->data[i] = e;//将元素插入到已找到的适当位置
		L->length++;    //顺序表L长度增一
	}
	else
		printf("i不符合要求");
}

//删除顺序表L的第i(1≤i≤ListLength(L))个数据元素
void SqListDelete(SqList* L, int i)
{
	int j;
	if (i >= 1 && i <= L->length)//判断i是否合法
	{
		i--;
		for (j = i; j < L->length - 1; j++)//找到插入的位置
			L->data[j] = L->data[j + 1];//元素前移
		L->length--;    //顺序表L长度减一
	}
	else
		printf("i不符合要求");
}

//求顺序表L中第i(1≤i≤ListLength(L))个数据元素的值
char GetSqListElem(SqList* L, int i, ElemType e)
{
	if (i >= 1 && i <= L->length)//判断i是否合法
	{
		e = L->data[i - 1];//获取第i个元素的值
		return e;
	}
	else
		printf("i不符合要求");
}

//求顺序表L中第1个与e的值相等的数据元素的位序
int LocateSqListElem(SqList* L, ElemType e)
{
	int i;
	for (i = 0; L->data[i] != e && i < L->length; i++)//判断条件,在i合法的基础上逐个比较当前值与e值是否相等
		;
	if (i == L->length)//根据情况返回相应的值
		return -1;
	else
		return i + 1;
}

//整体建立顺序表L
void CreateSqList(SqList* L, ElemType a[], int n)
{
	for (int i = 0; i < n; i++)
		L->data[i] = a[i];
	L->length = n;//设置长度
}

//主函数
void main()
{
	SqList* L = (SqList*)malloc(sizeof(SqList));
	ElemType e = 0;
	printf("1、初始化顺序表\n");
	InitSqList(L);
	printf("2、插入元素h、e、l、l、o\n");
	SqListInsert(L, 1, 'h');//插入元素'h'
	SqListInsert(L, 2, 'e');//插入元素'e'
	SqListInsert(L, 3, 'l');//插入元素'l'
	SqListInsert(L, 4, 'l');//插入元素'l'
	SqListInsert(L, 5, 'o');//插入元素'o'
	printf("3、顺序表元素为:");
	DispSqList(L);//输出顺序表L
	printf("4、长度为%d\n", SqListLength(L));//显示顺序表L中数据元素个数
	printf("5、顺序表是否为空?");
	if (SqListEmpty(L) == 1)//判断当前顺序表L的状态
		printf("非空\n");
	else
		printf("空\n");
	printf("6、顺序表的第5个元素是:%c\n", GetSqListElem(L, 5, e));//求顺序表L中第5个数据元素的值
	printf("7、元素'h'的位置是:%d\n", LocateSqListElem(L, 'l'));//查找顺序表L中第1个与e的值相等的数据元素的位序
	printf("8、删除第2个元素,并在第2个元素位置上插入‘w’元素\n");
	SqListDelete(L, 2);//删除顺序表L的第2个数据元素
	SqListInsert(L, 2, 'w');//在顺序表L中第2个位置上插入新的数据元素'w'
	printf("输出当前顺序表:");
	DispSqList(L);//输出顺序表L
	printf("9、销毁顺序表");
	DestroySqList(L);//销毁顺序表L
}
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值