在数据结构的全部结构中中,线性结构属于最简单并且最普通的结构,而线性结构中的顺序结构属于在全部线性结构中最简单的结构
顺序表是具有相同特性的数据元素组成的一个有限序列,顺序表中的所有元素是有限个,并且呈一定的线性排列,所有元素的特性相同。可以是字符串型或者是基本整形。在长度为n的顺序表中,我们以L[0]表示顺序表的第一个元素。相当于表头。以L[n-1]表示最后一个元素。一般c语言中以0开头。
顺序表有3大特性:
(1)有穷性:顺序表中的元素是有限个的。
(2)一致性:所有的元素具有相同的数据类型。
(3)序列性:所有的元素相对位置是线性的,每个位置只存在一个元素。
顺序表排列方式如下图:
先建立一个表示顺序表的结构,代码实现如下:
#include
#include
#define maxsize 50 //定义线性表的最大长度
typedef int elemtype; //定于数据类型,elemtype的数据类型为基本整形,也可以定义为其他类型
typedef struct
{
elemtype data[maxsize]; //data为是记录顺序表的地址
int length; //length为线性表的长度
}Sqlist;
线性表有9大基本操作,分别为
1.InitList(&L):初始化线性表,构建一个空表。
2.DestroyList(&L):销毁线性表,释放线性表中全部元素。
3.ListEmpty(L):判断线性表是否为空,若为空就返回1,不为空返回0。
4.ListLength(L):求线性表的长度然后返回线性表中元素的个数。
5.DispList(L):输出线性表,依次输出线性表中的每个元素。
6.GetElem(L,i,&e):求线性表中的第i个位置的元素值,并用e返回。
7.LocataElem(L,e):按元素值查找,返回第一个与值e元素相等的元素的位置。
8.ListInsert(&L,i,e):在第i个位置插入元素e。
9.ListDelete(&L,i,&e):删除第i个元素,并且将第i个元素值用e返回。
下面对代码实现来讲解。
首先我们通过数组来建立一个顺序表,假设有一个长度为n的数组a[n],将数组a[n]建立成一个顺序表:代码实现如下
void CreateList(Sqlist *&L,elemtype a[],int n)
{
L=(Sqlist*)malloc(Sqlist); //首先给顺序表L,分配一个存储空间。
for(int i=0;idata[i]=a[i];
L->length=n; //将顺序表中长度改为n,整个顺序表建立完成。
}
1.初始化顺序表
初始化线性表是构造一个空表,当表的长度为0是,表中无元素,就成了一个空表,代码实现如下
void InitList(Sqlist *&L)
{
L=(Sqlist*)malloc(Sqlist); //先给顺序表分配一个存储空间
L->length=0; //在将顺序表的长度定义为0。此时,顺序表为空
}
2.销毁顺序表
销毁顺序表是将表中全部元素都删除,释放顺序表L的存储空间,代码实现如下:
void DestroyList(Sqlist *&L)
{
free(L); //释放顺序表中全部空间
}
3.判断顺序表是否为空
该操作是通过返回顺序表长度来判断,如果顺序表长度为0,表示顺序表长度为0,则为空,返回1。若顺序表长度不为0,则返回0。代码实现如下:
bool ListEmpty(Sqlist *L)
{
return (L->length==0); //L->length表示线性表的长度,若长度为0返回真,否则返回1
}
4.返回顺序表的长度
通过求顺序表中的元素的数量,来返回顺序表的长度,L->length表示线性表的长度,相当于元素的个数,我们通过返回L->length来实现该操作,代码实现如下:
int ListLength(Sqlist *L) //该操作需要返回一个值,需要使用int开头
{
return L->length; //length记录表的长度,直接返回求出元素的个数
}
5.输出顺序表
输出顺序表是将顺序表的全部元素依次通过屏幕显示出来,从首元素开始一直到尾元素,当L为空时不显示值域
void DispList(Sqlist *L)
{
for(int i=0;ilength;i++) //从首元素开始到尾元素,依次输出。L->length为元素个数,
printf("%5d",L->data[i]); //从L->data[0]开始,一直到L->data[length-1];
printf("\n");
}
6.求顺序表中某个元素值
要求出顺序表中的第i个元素的元素值,必须先要找到第i个元素,然后在将元素值赋值给e后返回。
代码实现如下:
bool GetElem(Sqlist *L,int i,elemtype &e) //i表示表中第i个位置
{
if(i<0||i>L->length) //如果i不在顺序表可以查找的范围内则返回错误。
return false;
else
{
i--; //从0开始记数,第i个位置表示为L->data[i-1];
e=L->data[i]; //将第i个元素赋给e,然后返回真,查找完成
return true;
}
}
7.按元素查找LocateElem(L,e)
扫描顺序表L中的所有元素,如果有等于e的元素,这返回改元素的位置,没有则返回0。代码实现如下:
void LocateElem(Sqlist *L,elemtype e)
{
int i;
for(i=0;ilength;i++) //从L->data[0]开始到L->[length-1]依次查找
{
if(L->data[i]==e)
{
return i+1; //若在表中有元素的值域为e,返回该元素的位置,循环停止。
break;
}
}
if(i==L->length) //若i=L->length则表示没有找到,返回为0
return 0;
}
8.插入数据元素
将某一固定的元素插入某一固定的位置,需要两个步骤,先应该将该位置后面的所有元素都向后移动一位,然后在将元素插在这个位置上面。代码实现如下:
bool ListInsert(Sqlist *&L,int i,elemtype e)
{
if(i<1||i>L->length) //如果i不在L内,返回错误。
return false;
else //从0开始计数,将i-1;找到应该插入的位置
{
i--;
for(int j=L->length;j>i;j--) //从尾部开始到i,将所有的元素向前移动一位,在将i插入。
L->data[j]=L->data[j-1];
L->data[i]=e;
L->length++; //顺序表的长度增加一位,返回为真。
return true;
}
}
9.删除数据元素
和插入数据元素类似,先找到需要删除元素的位置,在将该元素的值域通过e返回,在将该位置的元素覆盖,然后将后面的全部元素向前移动一位,顺序表减去一位,删除完成,代码实现如下:
bool ListDelete(Sqlist *&L,int i,elemtype &e)
{
if(i<1||i>L->length) //如果i不在长度范围内,返回错误。
return false;
else
{
i--; //找到需要删除的元素的位置,使用e返回
e=L->data[i];
for(int j=i;jlength-1;j++) //从该位置到表尾的全部元素依次前移动一位
L->data[j]=L->data[j+1];
L->length--; //顺序表的长度减去一位,返回为真。删除完成
return true;
}
}
顺序表的全部基本操作已经讲解完成,谢谢您的阅读。若有不足或者错误之处,欢迎在评论区指出,谢谢。