线性表-顺序存储结构
线性表是具有相同特性的数据元素的一个有限序列。线性表的顺序存储结构是,把线性表中的所有元素按照其逻辑顺序依次存储到从计算机存储器中指定的存储位置开始的一块连续的存储空间。
线性表的基本运算
- InitList(&L):初始化线性表,构建一个空的线性表
- CreateList(&L,a[],n):由长度为n的数组创建顺序表
- DestoryList(&L):销毁线性表,释放线性表L占用的空间
- ListEmpty(L):判断线性表是否为空,若L为空返回真,否则返回假
- ListLength(L):求线性表的长度,返回L中的元素的个数
- DispList(L):显示线性表,当线性表L不为空时,顺序显示线性表元素的值域
- GetElem(L,i,&e):求线性表中某个元素的值,将第i(1<=i<=n)个元素的值存入e
- LocateElem(L,e):按元素值查找,返回L中第一个值为e的元素的序号,如果不存在返回0
- ListInsert(&L,i,e):插入元素,在将第i(1<=i<=n)个元素之前插入值为e的元素,并将线性表的总长度加1
- ListDelete(&L,i,&e):删除元素,删除第i(1<=i<=n)个元素,并用e返回其值,线性表长度减1
顺序表实现
#include <iostream>
#include <cstdlib>
#include <cstdio>
#define MaxSize 50
using namespace std;
//假设lemType为int类型
typedef int ElemType;
//定义线性表的顺序存储类型
typedef struct{
ElemType data[MaxSize];//存放顺序表中的元素
int length;//存放顺序表的长度
}SqList;//顺序表的类型定义
//声明函数
void InitList(SqList *&L);
void CreateList(SqList *&L,ElemType a[],int n);
void DestoryList(SqList *&L);
bool ListEmpty(SqList *L);
int ListLength(SqList *L);
void DispList(SqList *L);
bool GetElem(SqList *L,int i,ElemType &e);
int LocateElem(SqList *L,ElemType e);
bool ListInsert(SqList *&L,int i,ElemType e);
bool ListDelete(SqList *&L,int i,ElemType &e);
int main()
{
SqList *L;
ElemType a[]={0,1,2,3,4,5,6,7,8,9};
CreateList(L,a,10);
DispList(L);
cout << "线性表长度:"<<ListLength(L) << endl;
ElemType e;
GetElem(L,4,e);
cout << "线性表第4个元素值:"<<e << endl;
cout << "线性表值为8的下标值:"<<LocateElem(L,8) << endl;
cout << "线性表第5个位置插入10:"<< endl;
ListInsert(L,5,10);
DispList(L);
cout << "线性表删除第7个位置的值:" << endl;
ListDelete(L,7,e);
DispList(L);
DestoryList(L);
return 0;
}
//初始化线性表
void InitList(SqList *&L){
L=(SqList*)malloc(sizeof(SqList));//分配存储线性表的空间
L->length=0;
}
//有数组a创建线性表
void CreateList(SqList *&L,ElemType a[],int n){
int i;
L=(SqList *)malloc(sizeof(SqList));
for(i=0;i<n;i++){
L->data[i]=a[i];
}
L->length=n;
}
//销毁线性表
void DestoryList(SqList *&L){
free(L);
}
//判断数组是否为空
bool ListEmpty(SqList *L){
return (L->length==0);
}
//返回线性表的长度
int ListLength(SqList *L){
return L->length;
}
//显示线性表
void DispList(SqList *L){
int i;
for(i=0;i<L->length;i++){
cout<<L->data[i]<<" ";
}
cout<<endl;
}
//获取线性表的值
bool GetElem(SqList *L,int i,ElemType &e){
if(i<1||i>L->length) return false;//合法下标判断
i--;//将序号转为物理下标
e=L->data[i];
return true;
}
//按元素查找
int LocateElem(SqList *L,ElemType e){
int i=0;
//查找元素
while(i<L->length&&L->data[i]!=e)
i++;
if(i<L->length) //找到,返回序号(物理下标加1)
return i+1;
return 0;
}
//插入元素
bool ListInsert(SqList *&L,int i,ElemType e){
int j;
if(i<1||i>L->length+1)//检查参数合法性
return false;
i--;//把逻辑序号转化为物理序号
for(j=L->length;j>i;j--){
L->data[j]=L->data[j-1];//把data[i]后面的所有元素后移一位
}
L->data[i]=e;//插入元素值
L->length++;//线性表长度加1
return true;
}
//删除指定位置元素
bool ListDelete(SqList *&L,int i,ElemType &e){
int j;
if(i<1||i>L->length)//参数合法性
return false;
i--;//逻辑序号转化为物理序号
e=L->data[i];//保存值到e中
for(j=i;j<L->length-1;j++){
L->data[j]=L->data[j+1];//将data[i]后面元素前移一位
}
L->length--;//线性表长度减1
return true;
}