首页 > 其他分享 >线性表——顺序表

线性表——顺序表

时间:2024-11-09 20:43:48浏览次数:3  
标签:ps 顺序 线性表 int void SL SLDataType size

文章目录


在这里插入图片描述

前言

上篇博客入门了数据结构,学习了时间复杂度和空间复杂度,本篇博客学习线性表中的顺序表。

线性表是n个具有相同特性的数据元素的有限序列。 线性表是⼀种在实际中⼴泛使⽤的数据结构,常⻅的线性表:顺序表、链表、栈、队列、字符串…线性表在逻辑上是线性结构,也就说是连续的⼀条直线。但是在物理结构上并不⼀定是连续的, 线性表在物理上存储时,通常以数组和链式结构的形式存储。

一、顺序表

1.1 概念与结构

概念:顺序表是⽤⼀段物理地址连续的存储单元依次存储数据元素的线性结构,⼀般情况下采⽤数组存储。
在这里插入图片描述
顺序表和数组的区别?
顺序表的底层结构是数组,对数组的封装,实现了常⽤的增删改查等接口。

就像下面示例一样,每一个东西都经过精心包装。
在这里插入图片描述

1.2分类

1.2.1 静态顺序表

概念:使用指定长度的数组储存元素

typedef int SLDataType;
#define N  7
typedef struct SeqList
{
	SLDataType a[N];  //指定长度
	int size;       //  有效数据个数
};

缺陷:空间给少了不够用,给多了浪费

1.2.2 动态顺序表

按需申请空间

typedef int SLDataType;
typedef struct SeqList
{
	SLDataType* a;       
	int capacity;      //  有效数据个数
	int size;		   //  空间容量
};

1.3 动态顺序表的实现

使用动态顺序表做到对数据的增删改查等功能。

typedef int SLDataType;
typedef struct SeqList
{
	SLDataType* a;
	int capacity;
	int size;
}SL;

void SLInit(SL* ps);  // 初始化

void SLDestory(SL* ps);   // 销毁

void SLCheckCapacity(SL* ps);// 扩容 

void SLPushBack(SL* ps, SLDataType x);  // 尾插

void SLPopBack(SL* ps);  //  尾删

void SLPushFront(SL* ps, SLDataType x);  //  头插

void SLPopFront(SL* ps);  //  头删 

void SLPrint(SL* ps);  //  打印  

int SLFind(SL* ps, SLDataType x);//   查找数据  

void SLInsert(SL* ps, int pos, SLDataType x);  //  指定位置插入  

void SLErase(SL* ps, int pos);     //  指定位置删除  

顺序表的初始化与销毁

void SLInit(SL* ps)  // 初始化
{
	ps->a = NULL;
	ps->capacity = ps->size = 0;
}

void SLDestory(SL* ps)  //  销毁
{
	assert(ps);
	if (ps->a)
	{
		free(ps->a);
	}
	ps->a = NULL;
	ps->capacity = ps->size = 0;
}

在数据的插入过程中,可能有空间不够的情况
这里是顺序表的扩容,每次扩容到原来的两倍

void SLCheckCapacity(SL* ps)   //  判断容量  扩容
{
	if (ps->capacity == ps->size)
	{
		int newCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
		SLDataType* tmp = (SLDataType*)realloc(ps->a, sizeof(SLDataType) * newCapacity);
		ps->a = tmp;				  //  在原来的空间上扩展两倍
		ps->capacity = newCapacity;
	}
}

顺序表的插入和删除

void SLPushBack(SL* ps, SLDataType x)  // 尾插入
{
	assert(ps);
	SLCheckCapacity(ps);
	ps->a[ps->size++] = x;
}

void SLPopBack(SL* ps)  //  尾删除
{
	assert(ps);
	ps->size--;
}

void SLPushFront(SL* ps, SLDataType x)  //  头插
{
	assert(ps);
	SLCheckCapacity(ps);
	for (int i = ps->size; i > 0; i--)
	{
		ps->a[i] = ps->a[i - 1];
	}
	ps->a[0] = x;
	ps->size++;
}

void SLPopFront(SL* ps)  //  头删 
{
	assert(ps);
	for (int i = 0; i < ps->size - 1; i++)
	{
		ps->a[i] = ps->a[i + 1];
	}
	ps->size--;
}

顺序表的查找与指定位置插入删除

int SLFind(SL* ps, SLDataType x)//   查找数据  
{
	assert(ps);
	for (int i = 0; i < ps->size; i++)
	{
		if (ps->a[i] == x)
		{
			return ps->a[i];
		}
	}
	return -1;
}
void SLInsert(SL* ps, int pos, SLDataType x)  //  指定位置插入 
{
	assert(ps);
	assert(pos >= 0 && pos <= ps->size);
	SLCheckCapacity(ps);
	for (int i = ps->size; i > pos; i--)
	{
		ps->a[i] = ps->a[i - 1];
	}
	ps->a[pos] = x;
	ps->size++;
}
void SLErase(SL* ps, int pos)     //  指定位置删除   
{
	assert(ps);
	assert(pos >= 0 && pos < ps->size);
	for (int i = pos; i < ps->size - 1; i++)
	{
		ps->a[i] = ps->a[i + 1];
	}
	ps->size--;
}

顺序表的打印,便与观察代码执行后是否与预想一样

void SLPrint(SL* ps)  //  打印  
{
	assert(ps);
	for (int i = 0; i < ps->size; i++)
	{
		cout << ps->a[i] << ' ';
	}
	cout << endl;
}

总结

今天学习了线性表中的顺序表,并且模拟实现了动态顺序表,对顺序表有了更深刻的理解。

敲的每一行代码,都是迈向更美好的一步。

在这里插入图片描述

标签:ps,顺序,线性表,int,void,SL,SLDataType,size
From: https://blog.csdn.net/daily_233/article/details/143648624

相关文章

  • go语言init函数与main函数的执行顺序
    packageschoolimport"fmt"funcinit(){ fmt.Println("school包初始化了")}typeSchoolstruct{}func(s*School)PrintSchool(){ fmt.Println("我是一所学校")}packagehomeimport"fmt"funcinit(){ fmt.Print......
  • 直播短视频系统,Mysql执行顺序代码解析
    直播短视频系统,Mysql执行顺序代码解析MySQL执行顺序FROM<left_table>ON<join_condition><join_type>JOIN<right_table>WHERE<where_condition>GROUPBY<group_by_list>HAVING<having_condition>SELECTDISTINCT<select_list&......
  • 初级数据结构——顺序表
    目录前言一、定义与特点二、类型三、基本操作四、应用场景五、优缺点六、元素插入和删除动态图解插入删除七、代码模板八、使用顺序表的经典例题1.求奇数的乘积代码题解2.数值统计代码题解九、总结结语前言顺序表示最基础的数据结构之一,它也是我们学习开始学习数......
  • 第八章: 8.10将一个5*5的矩阵中最大的元素放在中心,4个角分别放4个最小的元素(四个角的元
    第八章:8.10将一个5*5的矩阵中最大的元素放在中心,4个角分别放4个最小的元素(四个角的元素的顺序是从左到右,从上到下,依次从小到大存放)思考:1.输入矩阵的值inta[5][5]={0};   inti=0,j=0;   printf("请输入一个5*5的数组:\n");   for(i=0;i<5;......
  • 数据结构学习笔记---线性表:顺序表(插入)
    顺序表的基本操作——插入首先,静态分配一个顺序表#include<stdio.h>#include<stdlib.h>#defineMaxSize5//定义队列的最大长度typedefstruct{ intdata[MaxSize]; intlength;}SqList;然后实现插入方法,for循环我们提前插入了四个元素,顺序排放原理是以i为......
  • 一文轻松了解AUTOSAR系统开发步骤顺序
    目录往期推荐AUTOSAR方法论的典型开发步骤顺序1. 需求分析(RequirementAnalysis)2. 系统架构设计(SystemArchitectureDesign)3.软件组件设计与实现(SoftwareComponentDesignandImplementation)4.ECU配置与基础软件配置(ECUConfigurationandBasicSoftwareConfigu......
  • Java流程控制-顺序结构与选择结构
    顺序结构1.Java的基本结构就是顺序结构,除非特别明指,否则就按顺序一句一句执行。2.顺序结构是最简单的算法结构。3.语句与语句之间,框与框之间是按上到下的顺序进行的,它是由若干个依次执行的处理步骤组成的,它是任何一个算法都离不开的一种基本算法结构。选择结构if单选择结构......
  • 数据结构线性表
    语雀链接:https://www.yuque.com/g/wushi-ls7km/ga9rkw/vrhdf9bfkmshpzus/collaborator/join?token=C3AlDSf6fePw1XfO&source=doc_collaborator#《数据结构线性表》......
  • 【初阶数据与算法】线性表之顺序表的定义与实现
    文章目录一、线性表的概念二、顺序表1.概念与结构2.顺序表的分类静态顺序表动态顺序表三、顺序表的实现1.顺序表的结构2.顺序表的初始化和销毁初始化函数销毁函数3.顺序表的扩容4.顺序表的尾插和头插尾插函数头插函数5.顺序表的尾删和头删尾删函数头删函数6.顺序表......
  • 顺序容器对比
    顺序容器vector特点动态数组内存是连续的以二倍大小进行扩容,其中reserve只进行空间的预留不创建元素而resize既修改空间大小又改变元素个数deque的特点底层为二维动态数组第二维数组空间大小固定扩容时,第一维数组的二倍进行扩容该二维数组的内存并不是连续的list的特点......