学《数据结构》越学越聪明--第二章》》》线性表之顺序表

本文详细介绍了顺序表的概念,特点以及如何使用C/C++实现顺序表的基本运算,包括创建、初始化、销毁、判断是否为空、获取长度、显示元素、查找元素、插入和删除元素等操作。顺序表在存储和操作上的优势和限制也得到了阐述。
摘要由CSDN通过智能技术生成

顺序表

把线性表中的所有元素按照其逻辑顺序,依次存储到从计算机存储器中指定存储位置开始的一块连续的存储空间中

特点:
  1. 不增加存储逻辑关系的空间开销,方便存储

    无需为表示元素之间的逻辑关系而增加额外的存储空间,可以方便存储表中的任意一个元素
  2. 占用大片连续空间,插入和删除时复杂

    顺序表要求占用一整片连续的空间,而且插入和删除元素时需要移动大量的元素

顺序表的基本运算实现

一旦采用顺序表存储结构就可以利用c/c++语言实现线性表的各种基本运算。为了单,假设顺序表ElemType为int类型:
typedef int ElemType;

定义一个顺序表结构:

//顺序存储结构的线性表---顺序表
//线性表的存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素
//我门需要定义线性表的最大存储空间
#define MAX_SIZE 255
//2、线性表里需要有统一类型的元素集合
typedef int ElemType;
typedef struct {
	int id;
	char * name;
} ElemenetType;
//3、定义顺序表
typedef struct {
	ElemenetType datas[MAX_SIZE];
	int length;
};
//描述线性表的顺序存储结构需要三个属性
//1、存储空间的起始位置:数组datas的存储位置
//2、线性表的最大存储容量:数组长度MAX_SIZE
//3、线性表的当前长度:length;

1、建立顺序表
建立顺序表之前需要建立对应顺序表的数据元素
void CreateList(SqList *&L,ElemType a[],int n)//由a中的n个元素建立顺序表
{
int i=0,k=0;//k表示L中的元素个数,初始值为0   其实K可以被i代替
L=(SqList*)malloc(sizeof(SqList)); //分配存放线性表的空间
while(i<n)  //扫描数组a元素
{
L->data[k]=a[i];//将元素a[i]存放到L中
k++;i++;
}
L->length=k;//设置L的长度K
}
2、顺序表基本运算算法
1)初始化线性表InitList(&L)
该运算的功能是构造一个空的线性表L,实际上只需要分配线性表的存储空间并将length域设置为0即可。
void InitList(SqList *&L)
{
L=(SqList*)malloc(sizeof(SqList)); //分配存放线性表的空间
L->length=0;  //置空线性表的长度为0
}
2)销毁线性表DestroyList(&L)
该运算的功能是释放线性表L占用的内存空间
void DestroyList(SqList *&L)
{
free(L);  //释放L所指向的线性表
}
3)判断线性表是否为空表ListEmpty(L)
该运算的功能是返回线性表的长度是否为空
int ListEmpty(SqList *L)
{
return L->length==0?0:1;
}
4)求线性表的长度ListLength(L)
该运算的功能是返回线性表的长度
int ListLength(SqList *L)
{
return L->length;
}
5)输出线性表DispList(L)
该运算一次显示L中各种元素的值
void DispList(SqList *L)
{
if(l->length==0)
{
printf("此表为空表");
return;
}
for(int i=0;i<L->length;i++)
{
printf("%d",L->data[i]);
}
printf("\n")
}
5)求线性表中的某个数据元素值GetElem(L,i,&e)
该运算用引用型参数e返回L中第i(1<=i<=n)个元素的值 i为数据元素的物理序号
void GetElem(SqList *L,int i,ElemType &e)
{
if(i<1||i>L->length)
{
printf("下标越界异常");
return;
}
e=L->data[i-1];  //把物理序号变为逻辑序号
}
7)按元素值查找LocateElem(L,e)
该运算顺序查找第一个值域与e相等的元素的逻辑序号:
int LocateElem(SqList *L,ElemType e)
{
for(int i=0;i<L->length;i++)
{
if(e==L->data[i])return i+1;  //返回i+1是物理序号
}
return 0;
}
8)插入数据元素ListInsert(&L,i,e)
该运算在顺序表L的第i(1<=i<=n+1)个位置上插入新元素e:
void ListInsert(SqList *&L,int i,ElemType e)
{
if(i<1||i>L->length+1) returm;
i--;
for(int j=L->length;j>i;j--)
{L->data[j]=L->data[j-1];}   //将data[i]之后的元素向后移动一个位置
L->data[i]=e;   //将元素插入到指定位置
L->length++;   //顺序表长度加一
}
9)删除数据元素ListDelete(&L,i,&e)
该运算在顺序表L的第i(1<=i<=n+1)个位置上插入新元素e:
void ListDelete(SqList *&L,int i,ElemType &e)
{
if(i<1||i>L->length+1) returm;  //判断参数i是否错误
i--;
e=L->data[i];  //储存删除元素的值
for(int j=i;j<L->length-1;j++)  
{L->data[j]=L->data[j+1];}   //将data[i]后面的元素前移一个位置
L->length--;   //顺序表长度减一
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雷军的小宝贝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值