线性表定义:线性表是具有相同特性的数据元素组成的一个有限序列。
数据元素之间为一对一的线性关系。
线性表:(a1,a2,a3,....,ai-1,ai,ai+1,.....,an)
下面我们介绍一些与线性表有关的一些知识:
1. 除起始节点和终端结点外,每个结点都有且只有一个直接前驱和直接后继。
2. 线性表的实现分为顺序存储结构和链式存储结构,顺序存储结构叫做顺序表,链式存储结构叫做链表。本文主要介绍线性表的顺序存储结构及其的C++代码实现。
3. 顺序存储结构和链式存储结构的区别:顺序存储结构是通过物理位置来实现数据元素之间的逻辑关系,而链式存储结构是通过指针来实现数据元素之间的逻辑关系。
4. 顺序存储:逻辑上相邻的数据元素也在物理上相邻的存储单元中存储的存储结构。即逻辑上相邻物理上也相邻。
5. 线性表的第一个数据元素a1的存储位置,称作线性表的起始位置或基地址(首地址)。
6. 线性表的顺序存储结构占用一片连续的存储空间。
7. 顺序表第 i 个元素的存储位置:LOC(ai)=LOC(a1)+(i-1)*l,其中 l 为每个数据元素占据的存储单元。由顺序表的这一性质可以实现随机存取,即在已知首地址的条件下,以O(1)的时间复杂度可以随机存取到线性表中的每一个元素。
8. 顺序表的特点:① 通过物理位置相邻表示逻辑关系
②任一元素均可随机存取(优点)
9. 通过以上顺序表的一些知识可以选择对应合适的基础数据类型来直接或间接的实现:
线性表的顺序实现可通过基础数据类型中的数组来完成。
这里我们应该注意顺序表的长度可以改变(删除,插入操作),但数组长度一旦定义不可改变,即不能动态定义,所以通过用一个变量来表示顺序表的长度属性,对于有多个变量的数据结构我们通过结构体来实现。
一. 线性表的初始化:
1. 初始化顺序表
#include<bits/stdc++.h>//万能头文件
using namespace std;
#define MAXSIZE 100000
typedef struct{
ElemType elem[MAXSIZE];//ElemType为一个数据类型
// ElemType *elem=new ElemType[MAXSIZE];
// new地址分配成功返回分配的首地址,否则返回0
int length; //顺序表当前长度
}SqList;
int main(){
int i=0,n;
SqList list;//定义一个顺序表类型
cout << "请输入一个数字n:";
cin >> n;
//顺序表读入n个数据
for (i;i<n;i++){
cin >> list.elem[i];//scanf("%d",&list.elem[i]);
};
//记录顺序表中数据的长度
list.length=n;
//输出顺序表中的n个数据
for (i=0;i<n;i++)cout << list.elem[i] << " ";
cout << '\n';
cout << "length=" << list.length;
return 0;
}
2.查找算法:查找元素e在顺序表L中的位置,并作为结果返回。
int search_elem(SqList L,ElemType e){
int i=0;
for (i;i<L.length;i++){
if (L.elem[i]==e)return i+1;
}
return 0;}
3. 插入算法:在顺序表L的第 i 个位置中插入数据元素e,插入成功返回1,失败返回0;
int insert_elem (SqList &L,int i, ElemType e) {//L使用引用数据类型
int j=L.length;
if (i<1 || i>L.length+1)return -1;//判断插入位置是否合法
if (L.length==MAXSIZE)return -1;//判断顺序表存储空间是否已满
for (j;j>=i;j--)L.elem[j]=L.elem[j-1];
L.elem[i-1]=e;
L.length++;
return 1;
}
4.删除算法:去除顺序表L中第 i 个位置的元素,删除成功返回1,失败返回0;
int pop_elem(SqList &L,int i){//删除第i个位置的元素
int j;
if (i<1 || i>L.length)return -1;//判断删除的位置是否合法
for (j=i-1;j<L.length-1;j++)L.elem[j]=L.elem[j+1];
L.length--;
return 1;
}