**线性表(Linear List)**是由n(n≥0)个数据元素(结点)a[0],a[1],a[2]…,a[n-1]组成的有限序列。线性表分为顺序表、链表等。我们现在来讨论下顺序表结构的基本实现。
顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。简单来说,我们将电脑存储空间想象成一个个网格的形状,每个格子都存储一个数据,那么使用顺序表存储数据的时候,系统会分配一个连续的空间去存储顺序表的数据,也就是说,某个格子存储了第一个数据,那么相邻的第二个格子就存储第二个数据,以此类推。
顺序表结构代码:
#define MaxSize 100 //定义顺序表存储的最大元素个数为100
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct
{
ElemType data[MaxSize];
int length;
}SqList; //定义顺序表的结构,用data[]数组存储,length存储顺序表的长度,且这个结构的元素个数不得超过100
建立顺序表:
void createSqList(SqList *&L, ElemType a[], int n) //定义一个函数建立顺序表,且将数组a[]赋值给顺序表
{
int i, k=0;
L = (SqList *)malloc(sizeof(SqList)); //为顺序表L分配空间
for(i=0; i<n; i++) //逐个遍历数组a[],并存储在顺序表L的空间中
{
L -> data[i] = a[k];
i++;
k++;
L->length = i+1;
}
}
初始化顺序表:
void initSqList(SqList *&L) //初始化顺序表
{
L = (SqList *)malloc(sizeof(SqList)); //给顺序表L分配空间
L -> length = 0; //定义L的长度length为0
}
销毁顺序表:
void destroySqList(SqList *&L) //销毁顺序表
{
free(L); //释放顺序表L的空间
}
判断线性表是否为空:
bool ListEmpty(SqList *&L) //判断是否为空
{
return (L->length == 0); //若L为空,则返回true,否则返回false
}
求线性表的长度:
int ListLength(SqList *&L)
{
return(L->length);
}
输出线性表:
bool outputList(SqList *&L) //输出线性表
{
int i;
if(L == 0) //如果顺序表L为空,则直接返回0
{
return 0;
}
else //否则逐个输出L的元素
{
for(i=0; i < L->length; i++)
{
printf("%ElemType\n",L->data[i]);
}
}
return 0;
}
取顺序表的某个位置的元素:
bool GetElem(SqList *&L, int i, ElemType e) //在线性表L中取第i个值
{
if(i <= 0 || i >= L->length || L==0) //如果i不合法或者L为空,则直接返回0
{
return 0;
}
e = L->data[i-1];
}
判断顺序表中是否有某个元素,并返回其位置:
void LocateElem(SqList *&L, ElemType e) //定位线性表中是否有e元素
{
int i;
for(i=0; i < L->length; i++) //遍历顺序表L
{
if(L->data[i] == e)
{
printf("%d",i+1); //如果顺序表中的i位置元素等于e则返回这个元素所在位置
}
}
}
插入元素:
bool ListInsert(SqList *&L, int i, ElemType e) //在线性表中的i位置插入元素e
{
int j;
if(i <= 0 || i > L->length) //如果i不合法,则返回false
{
return false;
}
for(j = L->length-1; j > i-1; j--) //从最后一个元素开始到第i个元素,依次将元素后退一位
{
L-> data[j+1] = L->data[j];
}
L -> data[i-1] = e; //将e赋值到第i个位置
L -> length = L -> length+1; //顺序表长度增一
return 0;
}
删除元素:
bool ListDelete(SqList *&L, int i, ElemType e) //在线性表中删除第i个元素,并将删除的值赋给元素e
{
int j;
if(i <= 0 || i > L->length) //若i不合法则返回false
{
return false;
}
e = L->data[i-1]; //先将第i个元素赋值给e
for(j = i-1; j < L->length-1; j++) //从第i+1个元素开始,每个元素依次前进一位
{
L -> data[j] = L -> data[j+1];
}
L -> length--; //L的长度减一
return 0;
}