这是我参与11月更文挑战的第26天,活动详情查看:2021最后一次更文挑战
前言:
前面博主数据的文章是从单链表开始的,漏了一个知识点,线性表的顺序表,线性表的顺序表是一个单独的知识点,这篇文章我们主要讲解一下数据结构的线性表的顺序表,线性表是最简单且最常用的数据结构。线性表的存储方法在我们编程里面用的比较多,所以有必要去了解,好了话不多说,我们开始学习吧,原谅博主的反向输出知识!!!哈哈哈哈
注:顺序表和链表是线性表的主要存储结构。
每日一遍,星期五就要有星期五的状态
有什么事下周一再说,哈哈哈哈!!!
1.线性表的基本概念
线性表是最基本、最简单、也是最常用的一种数据结构。线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的(注意,这句话只适用大部分线性表,而不是全部。比如,循环链表逻辑层次上也是一种线性表(存储层次上属于链式存储,但是把最后一个数据元素的尾指针指向了首位结点)。
1.1线性表的定义
线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。数据元素是一个抽象的符号,其具体含义在不同的情况下一般不同。在稍复杂的线性表中,一个数据元素可由多个数据项(item)组成,此种情况下常把数据元素称为记录(record),含有大量记录的线性表又称文件(file)。线性表中的个数n定义为线性表的长度,n=0时称为空表。在非空表中每个数据元素都有一个确定的位置。讲人话:(线性表是由n(n≥0)个相同类型的数据元素组成的有限序列。当n=0时为空表,记为()或Φ.当n>0时,线性表的逻辑表示为(al, a2, … , ai, … , an),也可以用下图所示的逻辑结构图表示)
2.顺序表
2.1顺序表的定义
顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素、使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系,采用顺序存储结构的线性表通常称为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。讲人话:(顺序表是线性表采用顺序存储结构在计算机内存中的存储方式,它由多个连续的存储单元构成(也就是数组),每个存储单元存放线性表的一个元素。顺序表逻辑上相邻的数据元素在内存的存储结构中也是相邻的,不需要额外的内存空间来存放元素之间的逻辑关系,就是一个结构体里面有个数组变量,这个数组用来存值,这个结构体就叫顺序表)
注:博主简单讲解了一下增删改查,其实不难我们只要去看C语言的数组的应用就可以了。
2.2顺序表的基本运算
顺序表的运算和数组的运算差不多,我们学过C语言理解起来应该很容易,不是很难,博主也不做过多的结束,C语言学的好的,这一篇文章理解很容易,博主直接把操作放下面啦:
#include <stdio.h>
#define MaxSize 100
typedef struct
{ int data[MaxSize]; //存放顺序表的元素
int length; //顺序表的实际长度
} SqList; //顺序表类型
// 初始化顺序表
void InitList(SqList &L) //由于L要回传给值参,所以用引用类型
{
L.length=0;
}
// 销毁顺序表,其实程序结束了就销毁了
void DestroyList(SqList L)
{
}
//获取表的长度
int GetLength(SqList L)
{
return L.length;//我们结构体里面有一个length负责统计,输出就好了
}
// 获取顺序表第i个的值
int GetElem(SqList L,int i,int &e)
{ if (i<1 || i>L.length) //判断i在顺序表的有效性
return 0;
else
{ e=L.data[i-1];//由于数组是从下标0开始,所以i-1
return 1;
}
}
//查找顺序表x的值的位置
int Locate(SqList L,int x)
{ int i=0;
while (i<L.length && L.data[i]!=x)//循环查找,直到找到相等的或者没有找到,已经到最后length位置了
i++; //查找值为x的第1个元素,查找范围为0~L.length-1
if (i>=L.length) return(0); //未找到返回0
else return(i+1); //找到后返回其逻辑序号,i+1
}
// 插入元素,在i的位置插入x的值
int InsElem(SqList &L,int x,int i)
{ int j;
if (i<1 || i>L.length+1) //无效的参数i
return 0;
for (j=L.length;j>i;j--) //将位置为i的结点及之后的结点后移
L.data[j]=L.data[j-1]; //j=L.length,L.data[j],length这个位置是没有保存值的
L.data[i-1]=x; //在位置i处放入x
L.length++; //线性表长度增1
return 1;
}
// 删除第i个的值
int DelElem(SqList &L,int i)
{ int j;
if (i<1 || i>L.length) //无效的参数i
return 0;
for (j=i;j<L.length;j++) //将位置为i的结点之后的结点前移
L.data[j-1]=L.data[j]; //直接从i这个位置把值往前面覆盖实现删除操作
L.data[L.length]=0; //其实最后一个是在的我们把它赋值为0;
L.length--; //线性表长度减1
return 1;
}
//输出顺序表运算
void DispList(SqList L)
{ int i;
for (i=0;i<L.length;i++)//直接遍历输出
printf("%d ",L.data[i]);
printf("\n");
}
//整体创建顺序表
void CreateList(SqList &L,int a[],int n)
{
int i,k=0; //k累计顺序表L中的元素个数
for (i=0;i<n;i++)
{
L.data[k]=a[i]; //向L中添加一个元素
k++; //L中元素个数增1
}
L.length=k; //设置L的长度
}
//两个值交换
void swap(int &x,int &y)
{
int tmp=x;
x=y;
y=tmp;
}
//交换最大值最小值
void Swapmaxmin(SqList &L)
{
int i,maxi,mini;
maxi=mini=0;
for (i=1;i<L.length;i++)
if (L.data[i]>L.data[maxi])
maxi=i;
else if (L.data[i]<L.data[mini])
mini=i;
swap(L.data[maxi],L.data[mini]);
}
int main()
{
int i; int e;
SqList L; //定义一个顺序表L
InitList(L); //初始化顺序表L
//博主直接用插入建立表格,如果用数组整体创建体现不出效果
InsElem(L,6,1); //插入元素1
InsElem(L,4,2); //插入元素3
InsElem(L,8,3); //插入元素1
InsElem(L,2,4); //插入元素5
InsElem(L,3,5); //插入元素4
InsElem(L,1,6); //插入元素2
//上面就是插入创建
printf("输出已经创建的线性表:"); DispList(L);//创建好了输出一遍
printf("线性表的长度:%d\n",GetLength(L));
i=3;
GetElem(L,i,e);
printf("第%d个元素:%d\n",i,e);//或者第i个位置的元素
e=1;
printf("元素%d是第%d个元素\n",e,Locate(L,e));
i=4; printf("删除第%d个元素\n",i);
DelElem(L,i);
printf("线性表:");DispList(L);
DestroyList(L);
return 0;
}
复制代码
总结:
线性表的顺序表呢,我们在学习C语言的时候应该会接触到,就是我们在学结构体的时候里面有数组,那就叫顺序表,我们是讲的在直白一点就是数组,数据结构整的有点花里胡哨,顺序表我们使用起来很简单的,没什么难度,算是学数据结构的入门篇,博主写到图的时候再返回写这个说实话有点不想写,但是博主再写肯定要写完整才行,好了创作不易点赞关注评论收藏。