首页 > 其他分享 >线性表之一:顺序表

线性表之一:顺序表

时间:2024-10-27 17:16:27浏览次数:3  
标签:ps 之一 线性表 增容 SeqList 顺序 void

文章目录


前言

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


一、顺序表的概念

  1. 顺序表是一种线性表的存储结构,它采用一段连续的存储空间来存储数据元素,顺序表的特点是元素在物理上是连续存储,在逻辑上不一定是连续存储。一般情况下采用数组存储。
  2. 它可以通过下标来访问每个元素,因此支持随机访问。

顺序表和数组的区别顺序表的底层结构是数组,对数组的封装,实现了常用的增删改查等接口

二、顺序表的实现

顺序表的实现方式有两种:静态顺序表和动态顺序表

1.静态顺序表

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

//静态顺序表
typedef int SLDataType;
#define N 7
typedef struct SeqList{
SLDataType a[N],//定长数组
int size;//有效数据个数
}SL:

静态顺序表缺陷:空间给少了不够用,给多了造成空间浪费

为了改善这种缺陷,我们引入了动态顺序表的概念。


2.动态顺序表

动态顺序表按需申请
typedef struct SeqList{
SLDataType* a;
int size      //有效数据个数
intcapacity;  //空间容量
}SL;

动态顺序表的优点:可增容
在这里插入图片描述

有关增容的代码

 //检查是否为空,如果是,则增容
void SeqLCheak(SeqList* ps)    
{
	if (ps->size == ps->Capacity)		
	{
		int new_capacity = ps->Capacity == 0 ? 4 : ps->Capacity * 2;	
		//如果size等于capacity并且不空,则说明顺序表已满
		//一般采用扩大二倍的方式来进行扩容,这样比较适合
		SLDateType* temp = (SLDateType*)realloc(ps->arr, sizeof(SLDateType) * new_capacity);
		if (temp == NULL)
		{
			perror("fail!");
		}
		ps->arr = temp;
		ps->Capacity = new_capacity;
	}
	return 0;
}

三、有关动态顺序表的函数

动态顺序表的实现可以有多种方式,增删查改等等都有所涉及,可以试着编写一下。

// 初始化
void SeqListInit(SeqList* ps);
//销毁
void SeqListDestroy(SeqList* ps);
//打印
void SeqListPrint(SeqList* ps);
//尾插
void SeqListPushBack(SeqList* ps, SLDateType x);
//头删
void SeqListPopFront(SeqList* ps);
// 顺序表查找
int SeqListFind(SeqList* ps, SLDateType x);
// 顺序表删除pos位置的值
void SeqListErase(SeqList* ps, int pos);

总结-顺序表问题与思考

  1. 增容需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗。
  2. 增容一般是呈2倍的增长,势必会有一定的空间浪费。例如当前容量为100,满了以后增容到200,
    我们再继续插入了5个数据,后面没有数据插入了,那么就浪费了95个数据空间。

如何解决以上问题呢?那就是接下来要讲到的单链表了。

标签:ps,之一,线性表,增容,SeqList,顺序,void
From: https://blog.csdn.net/q38491/article/details/143231944

相关文章

  • DDD话语批评之一:评“状态和事件本质相同”[全文]
    有位同学给我发了张逸著的《解构领域驱动设计》中的一页,让我评点一下。图1摘自《解构领域驱动设计》(张逸,2021)书中“状态和事件本质上是相同的”的观点真是令我“耳目一新”。那就针对这页书的内容来讲讲吧。我先介绍状态机的一些知识点,然后根据这些知识点来评价一下这页......
  • 关于 顺序表、单链表、双链表、栈、队列的小总结
    1.结构的定义方式-顺序表:以结构体指针方式定义-链表:以结构体自引用方式定义-栈:个人推荐使用结构体指针方式定义(类似顺序表)-队列:以结构体指针+结构体自引用方式实现2.对顺序表、单链表、双链表的小小对比顺序表:尾插、尾删操作更方便(对头操作的话需......
  • 数据结构与算法——顺序栈的实现
    数据结构栈——一列数据,表尾入栈,表尾出栈,类似于子弹弹匣,压入子弹和拿出子弹都是从最上方进出。结构体structStack{ int*arr; intcapacity;//数组容量 inttop;//存储栈顶元素的下标};初始化栈intInitStack(structStack*stack){ stack->arr=......
  • 初阶数据结构之顺序表的实现
    1线性表什么是线性表呢?线性表是n个具有相同特性的数据元素的有限序列。常见的线性表:顺序表,链表,栈,队列,字符串。线性表在逻辑上是线性结构,在物理结构上不一定是线性的。线性表在物理存储时,通常是以数组或链式结构形式存储。线性表大致分为两种:顺序表和链表。基于这两种......
  • C语言顺序表基本操作
    线性表是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常⻅的线性表:顺序表、链表、栈、队列。顺序表一般由一个数组构成,每个元素都连续存放。头文件#include<iostream>#include<stdio.h>#include<stdlib.h>#include<conio.h>#......
  • 初阶数据结构【3】--单链表(比顺序表还好的一种数据结构!!!)
    本章概述前情回顾单链表实现单链表彩蛋时刻!!!前情回顾咱们在上一章博客点击:《顺序表》的末尾,提出了一个问题,讲出了顺序表的缺点——有点浪费空间。所以,为了解决这个问题,我们今天就要讲解链表,咱们在讲结构体的时候有提到过链表,链表的最大优点——一点空间也不浪费,用多少......
  • 雷池社区版有多个防护站点监听在同一个端口上,匹配顺序是怎么样的
    如果域名处填写的分别为IP与域名,那么当使用进行IP请求时,则将会命中第一个配置的站点以上图为例,如果用户使用IP访问,命中example.com。如果域名处填写的分别为域名与泛域名,除非准确命中域名,否则会命中泛域名,不论泛域名第几个配置。以上图为例,如果用户使用a.examp......
  • Python 文件与模块的运行顺序及调用时的执行流程详解【大白话版本!!】
    Python文件与模块的运行顺序及调用执行流程详解引言ython是一种强大的编程语言,具有极大的灵活性和简洁性。无论是在开发小型脚本,还是构建复杂的应用程序时,理解Python文件的运行顺序以及模块调用时的执行流程都至关重要。尤其当你开发大规模项目,涉及到多个模块(文件)之间......
  • 扩散模型学习顺序推荐
    关注B站可以观看更多实战教学视频:hallo128的个人空间扩散模型学习顺序推荐目录扩散模型学习顺序推荐1.扩散模型学习目录2.学习顺序推荐3.扩散模型论文精读4.代码实战1.扩散模型学习目录基础(1)从同一视角理解扩散模型(VAE)(2)DDPM->DDIM分数匹配(SMLD)朗之万......
  • 如何调整要素类中的字段顺序?
    一、只做临时调整,保持底层不变的方法1.ArcMap的图层属性表里,可以通过左右拖拽的方式移动字段位置2.ArcMap的图层属性里,找到字段选项卡,可以选中字段上移下移以上两种方式都是临时的,只要把数据重新添加到地图项目中,就会发现字段顺序并没有变化,或者在catalog的数据属性中切换到字......