数据结构小白的顺序表基本操作

什么是顺序表?

就我的理解,顺序表其实是一个数组,只不过这个数组是被封装在一个结构体中的。所以它也算是线性表的一种哦。

顺序表跟有序表的区别?

我觉得顺序表嘛,给定的数据不一定是按照从小到大或者从大到小的顺序排序,可以是随机的数;但是有序表就不一样了哦,它里面的数据一定是按照某种标准排序好了,否则怎么叫有序表呢?是不是。

之前我们说过,顺序表是在计算机内存中以数组的形式保存的线性表,因此呢,我们要先定义一个结构体:

typedef struct
{
	ElementType elem[MAXSIZE];/* 静态申请 */
	int length;/* 当前长度 */
}SeqList;

这个静态申请是什么意思?

这个嘛~就是申请一段静态的内存啦,数组学过吧,静态数组里面分配的都是一段连续的存储空间。我们先给这个顺序表初始化一下:

void CreateList(SeqList *L)/* 创建顺序表 */
{
	int i;
	L->length = 0;
	printf("Enter the length of the sequence table:");
	scanf("%d",&L->length);
	if(L->length == 0) return;
	printf("Enter the elements of the sequence table:\n");
	for(i = 0;i < L->length;i++)
	{
		scanf("%d",&L->elem[i]);
	}
}

要注意哦,我是在创建的时候初始化,因此可以省略掉长度为0以及数组里面数据为0的定义。

下面我们来进行一下判空操作,这一步很简单:

bool IsListEmpty(SeqList *L)/* 判断为空 */
{
	if(L == NULL || L->length == 0) return true;
	else return false;
}

注意是判断是否为空,所以为空返回真。

接下来是遍历顺序表的操作:

bool TraverseList(SeqList *L)/* 遍历顺序表并输出 */
{
	int i;
	if(IsListEmpty(L) == true) return false;/* 如果为空,返回错误 */
	else/* 否则,按照下标顺序输出 */
	{
		for(i = 0;i < L->length;i++)
		{
		    printf("%d\t",L->elem[i]);
		}
		printf("\n");
	}
	return true;
}

如何按位置插入元素呢:

bool InsertListElement(SeqList *L,int i,ElementType e)/* 在第i个位置插入元素e */
{
	if(IsListEmpty(L) == true || L->length == MAXSIZE || i < 0 || i > L->length)
		return false;/* 表空表满,i的位置不合适都返回错误 */
	else
	{
		for(int j = ++L->length;j >= i;j--)
		{
			L->elem[j] = L->elem[j - 1];/* 第i-1个位置之后的数据都后移一位  */
		}
		L->elem[i - 1] = e;
	}
	return true;
}

求顺序表的长度:

int LengthList(SeqList *L)/* 求顺序表表长 */
{
	if(IsListEmpty(L) == true) return 0;
	else printf("%d",L->length);
}

顺序表的逆置,类似于一维数组的逆序输出操作:

bool InversionList(SeqList *L)/* 顺序表的逆置 */
{
	if(IsListEmpty(L) == true || L->length == 1) return false;
	else
	{
		for(int i=0;i < L->length / 2;i++)
		{
			LIST_SWAP(L->elem[i],L->elem[L->length - i - 1]);
		}
	}
	return true;
}

排序顺序表:

bool SortList(SeqList *L,bool style)/* 排序顺序表,style为真表示从小到大,反之从大到小 */
{
	if(IsListEmpty(L) == true) return false;
	else
	{
		for(int i = 0;i < L->length;i++)
		{
			for(int j = 0;j < i;j++)
			{
				if(style == true && L->elem[j] > L->elem[j + 1]) 
					LIST_SWAP(L->elem[j],L->elem[j + 1]);/* 从小到大 */
				else if(style == false && L->elem[j] < L->elem[j + 1]) 
					LIST_SWAP(L->elem[j],L->elem[j + 1]);/* 从大到小 */
			}
		}
	}
	return true;
}

如何按位置删除元素呢,请看下图:

bool DeleteListElement(SeqList *L,int i)/* 删除元素 */
{
	if(IsListEmpty(L) == true || i < 0 || i > L->length)
		return false;/* 表空,i的位置不合适都返回错误 */
	else
	{
		for(int j = i;j < L->length;j++)
		{
			L->elem[j - 1] = L->elem[j];
		}
		L->length--;
	}
	return true;
}

最后,很好玩的是,顺序表可以合并哦~就好比女孩纸的手链串起来,感觉很整齐有木有:

void MergeList(SeqList *L1,SeqList *L2,SeqList *L3)/* 合并顺序表 */
{
	int i = 0,j = 0,k = 0;
	while (i < L1->length && j < L2->length)
	{
		if (L1->elem[i] <= L2->elem[j])
		{
			L3->elem[k++] = L1->elem[i++];
		}
		else
		{
			L3->elem[k++] = L2->elem[j++];
		}
	}
	while (i < L1->length)
	{
		L3->elem[k++] = L1->elem[i++];
	}
	while (j < L2->length)
	{
		L3->elem[k++] = L2->elem[j++];
	}
	L3->length = L1->length + L2->length;
}
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值