什么是顺序表?
就我的理解,顺序表其实是一个数组,只不过这个数组是被封装在一个结构体中的。所以它也算是线性表的一种哦。
顺序表跟有序表的区别?
我觉得顺序表嘛,给定的数据不一定是按照从小到大或者从大到小的顺序排序,可以是随机的数;但是有序表就不一样了哦,它里面的数据一定是按照某种标准排序好了,否则怎么叫有序表呢?是不是。
之前我们说过,顺序表是在计算机内存中以数组的形式保存的线性表,因此呢,我们要先定义一个结构体:
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;
}