文章目录
一、什么是线性表?
线性表是具有相同特性的数据元素的一个有限序列。由n(n>=0)个数据元素(结点)a1,a2,……an组成的有限序列。 其中a1我们叫做a2的直接前驱,a2叫做a1的直接后继。a1为线性起点,an为线性终点。线性表有顺序存储结构和链式存储结构,下面我们主要讲解线性表的顺序存储结构,之后为了区分我们简称为顺序表。
通俗来说,顺序表与我们之前学习数组的概念相类似。
二、线性表的基本操作
#include <iostream>
using namespace std;
#define MAXSIZE 100 //线性表存储空间的初始分配量
#define OVERFLOW -1
//定义顺序表的存储结构
typedef struct{
int *data;
int length; // 顺序表的表长
} SqList; //顺序表类型
//线性表的初始化
void Init(SqList &L){ // 构造一个空的顺序表L
L.data=new int[MAXSIZE]; // 为顺序表分配空间
if(!L.data) exit(OVERFLOW); //如果存储分配失败,则返回OVERFLOW
L.length=0; //初始顺序表长度为零
}
3.创建
//创建顺序表
void Create(SqList &L,int n){ // 创建顺序表L,输入总表长
int e;
for (int i=0;i<n;i++){
cin >>e; //从键盘中输入想要的元素
L.data[i]=e; //将元素赋值给L的数据域中
L.length++; //表长+1
}
}
4.插入
// 顺序表的插入
int Insert(SqList &L,int i,int e) { // 创建顺序表L,插入的位置i,插入的元素e
if((i<1 ) || (i>L.length+1)) //插入位置不合法
return OVERFLOW;
if(L.length==MAXSIZE) //存储空间已满
return OVERFLOW;
for(int j=L.length-1;j>=i-1;j--){
L.data[j+1]=L.data[j]; //插入位置及之后的元素后移
}
L.data[i-1]=e; //将新元素 e 放入第 i 个位置
L.length++; //表长+1
}
5.删除
//顺序表的删除
int Delete(SqList &L,int i){
if((i<1)||(i>L.length)) //删除的位置i不合法
return OVERFLOW;
for(int j=i;j<=L.length;j++)
L.data[j-1]=L.data[j]; //被删除元素之后的元素前移
L.length--; //表长减1
}
6.顺序表的查找(按值)
//按值查找
int Locate(SqList L,int e){
// 在线性表L中查找值为e的数据元素,返回其序号(是第几个元素)
for(int i=0;i<L.length;i++)
if(L.data[i]==e)
return i+1; //查找成功,返回序号
return 0; //查找失败,返回零
}
7.遍历
//遍历顺序表
void Print (SqList L){
if(L.length==0)
cout <<"线性表长度为 0";
for(int k=0;k<L.length;k++){
cout <<L.data[k] <<" "; //循环输出L中的数据
}
cout <<endl;
}
全部代码
#include <iostream>
using namespace std;
#define MAXSIZE 100 //线性表存储空间的初始分配量
#define OVERFLOW -1
//定义顺序表的存储结构
typedef struct{
int *data;
int length; // 顺序表的表长
} SqList; //顺序表类型
//线性表的初始化
void Init(SqList &L){ // 构造一个空的顺序表L
L.data=new int[MAXSIZE]; // 为顺序表分配空间
if(!L.data) exit(OVERFLOW); //如果存储分配失败,则返回OVERFLOW
L.length=0; //初始顺序表长度为零
}
//创建顺序表
void Create(SqList &L,int n){ // 创建顺序表L,输入总表长
int e;
for (int i=0;i<n;i++){
cin >>e; //从键盘中输入想要的元素
L.data[i]=e; //将元素赋值给L的数据域中
L.length++; //表长+1
}
}
// 顺序表的插入
int Insert(SqList &L,int i,int e) { // 创建顺序表L,插入的位置i,插入的元素e
if((i<1 ) || (i>L.length+1)) //插入位置不合法
return OVERFLOW;
if(L.length==MAXSIZE) //存储空间已满
return OVERFLOW;
for(int j=L.length-1;j>=i-1;j--){
L.data[j+1]=L.data[j]; //插入位置及之后的元素后移
}
L.data[i-1]=e; //将新元素 e 放入第 i 个位置
L.length++; //表长+1
}
//顺序表的删除
int Delete(SqList &L,int i){
if((i<1)||(i>L.length)) //删除的位置i不合法
return OVERFLOW;
for(int j=i;j<=L.length;j++)
L.data[j-1]=L.data[j]; //被删除元素之后的元素前移
L.length--; //表长减1
}
//按值查找
int Locate(SqList L,int e){
// 在线性表L中查找值为e的数据元素,返回其序号(是第几个元素)
for(int i=0;i<L.length;i++)
if(L.data[i]==e)
return i+1; //查找成功,返回序号
return 0; //查找失败,返回零
}
//遍历顺序表
void Print (SqList L){
if(L.length==0)
cout <<"线性表长度为 0";
for(int k=0;k<L.length;k++){
cout <<L.data[k] <<" "; //循环输出L中的数据
}
cout <<endl;
}
//运行调试
int main(int argc, char** argv) {
SqList L; //创建顺序表L
Init(L); //初始化顺序表
cout <<"输入当前元素:";
Create(L,5);
cout <<"输出后的元素:";
cout <<Locate(L,15)<<endl; //按值查找
Delete(L,4); //删除
Insert(L,2,3); //插入
Print(L);
return 0;
}