最近刚学习了数据结构的线性表中的顺序表。
首先简单的说一下线性表:
线性表是n个数据特性相同的元素的组成有限序列,是最基本且常用的一种线性结构(线性表,栈,队列,串和数组都是线性结构),同时也是其他数据结构的基础。
对于非空的线性表或者线性结构的特点:
1)存在唯一的一个被称作“第一个”的数据元素;
2)存在唯一的一个被称作“最后一个”的数据元素;
3)除第一个外,结构中的每个数据元素均只有一个前驱;
4)除最后一个外,结构中的每个数据元素均只有一个后继;
线性表有两种实现方式:顺序表和链表。然后这篇说的是顺序表。
概念:用一组地址连续的存储单元依次存储线性表的数据元素,这种存储结构的线性表称为顺序表。
特点:逻辑上相邻的数据元素,物理次序也是相邻的。
然后现在有一个需求需要用顺序表来实现,需求如下:
->.将3,5,8,11插入到顺序表LA中;
->.将2,6,8,9,11,15,20插入到顺序表LB中;
->打印出插入后的LA,LB;
->将LB中第五个数据删除,并打印出删除的数据
->打印出删除后的LB
代码如下,注释很详细,就不多说了。
#include<bits/stdc++.h>
#include<iostream>
using namespace std;
struct SqList
{
int *elem;//存储空间首地址
int length;//线性表元素的个数
int listsize;//当前线性表的最大容量
};
int InitList_Sq(SqList &L)//构建一个空的线性表,开始时线性表不占有空间
{
L.elem=0;
L.length=0;
L.listsize=0;
return 1;
}
int ListInsert_Sq(SqList &L,int i,int x)//在顺序表L中第i个位置插入数x
{
if(L.listsize==0)//如果是第一次插入数据,申请一个空间
{
L.elem=new int[1];
L.listsize=1;
}
if(i<0||i>L.length) return 0;//插入位置不合法
if(L.length==L.listsize) //空间不足,申请比原来多一倍的空间
{
int *newbase;
newbase=new int[L.listsize*2];
if(newbase==0) return 0;//如果原来顺序表的空间为0
for(int j=0;j<L.listsize;j++)
newbase[j]=L.elem[j];
delete L.elem;//释放原来的空间
L.elem=newbase;//线性表的指针指向新空间的首地址;
L.listsize*=2;
}
for(int j=L.length-1;j>=i;j--)
L.elem[j+1]=L.elem[j];
L.elem[i]=x;
L.length++;
return 1;
}
int ListDelete_Sq(SqList &L,int i,int &x)//删除顺序表L的第i个位置的元素,用x返回其值
{
if(i<0||i>L.length-1) return 0;
x=L.elem[i];
for(int j=i+1;j<=L.length;j++)
L.elem[j-1]=L.elem[j];
L.length--;
return 1;
}
void print(SqList &L)//从前到后打印顺序表中的数据
{
for(int i=0;i<=L.length-1;i++)
cout<<L.elem[i]<<" ";
cout<<endl;
}
int main()
{
SqList LA,LB;//定义顺序表LA,LB
InitList_Sq(LA);//初始化顺序表LA
InitList_Sq(LB);//初始化顺序表LB
int a[4]={3,5,8,11};
int b[7]={2,6,8,9,11,15,20};
for(int i=0;i<4;i++)
ListInsert_Sq(LA,LA.length,a[i]);//将a中的数插入LA中
print(LA);
for(int i=0;i<7;i++)
ListInsert_Sq(LB,LB.length,b[i]);//将b中的数插入LB中
print(LB);
int x;
ListDelete_Sq(LB,5,x);//从LB中删除下标5处的元素,存储到x中
cout<<x<<endl;
print(LB);
return 0;
}