【数据结构】02.顺序表

news2024/11/23 19:08:08

一、顺序表的概念与结构

1.1线性表

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

1.2顺序表分类

1.2.1 顺序表和数组的区别

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

1.2.2顺序表分类

  • 静态顺序表

概念:使用定长数组存储元素
在这里插入图片描述
静态顺序表缺陷:空间给少了不够用,给多了造成空间浪费

  • 动态顺序表

在这里插入图片描述

二、动态顺序表的实现

2.1结构体表示顺序表

首先需要一个结构体来表示顺序表:

typedef int SLDataType;//笔者在此直接使用了接下来要实现的顺序表的数据类型
//顺序表结构体
typedef struct SL
{
	SLDataType* a;
	int size;
	int capacity;
}SL;

2.2顺序表的初始化和销毁

//初始化顺序表
void init(SL* s)
{
	s->a = NULL;
	s->size = s->capacity = 0;
}
//顺序表销毁
void SLDestory(SL* s)
{
	assert(s);
 
	if(s->a)
	{
		free(s->a);
	}
	s->a = NULL;
	s->size = s->capacity = 0;
}

2.3顺序表的增删查改

在每次插入时都会面对着是否扩容的问题,因此我们抽离出检查扩容的函数

//检查是否满了
void check(SL* s)
{
	if (s->size == s->capacity)
	{
		int new_capacity = (s->capacity == 0) ? 4 : s->capacity * 2;
		SLDataType* temp = (SLDataType*)realloc(s->a, sizeof(SLDataType) * new_capacity);
		if (temp == NULL)
		{
			perror("realloc is fail!");//如果realloc失败会报错
			exit (EXIT_FAILURE);
		}
		s->a = temp;
		s->capacity =new_capacity;
	}
}
//头插
void PushFront(SL* s, SLDataType x)
{
	assert(s);
	
	check(s);
	for (int i =s->size;i>0;i--)
	{
		s->a[i] =s->a[i-1];
	}
	s->a[0] = x;
	s->size++;
}
 
//尾插
void PushBack(SL* s, SLDataType x)
{
	assert(s);
	
	check(s);
	s->a[s->size] = x;
	s->size++;
}
 
//头删
void PopFront(SL* s)
{
	assert(s && s->size);
	for (int i =0;i<s->size-1;i++)
	{
		s->a[i] = s->a[i+1];
	}
	s->size--;
}
 
//尾删
void PopBack(SL* s)
{
	assert(s);
	
	assert(s->size);
 
	s->size--;
}
 
//任意位置的插入
void Insert(SL* s, int pos, SLDataType x)
{
	assert(pos >= 0 && pos <= s->size);
	
	check(s);
	for (int i = s->size; i > pos; i--)
	{
		s->a[i] = s->a[i - 1];
	}
	s->a[pos] = x;
	s->size++;
}
 
//任意位置的删除,pos是下标
void Erase(SL* s, int pos)
{
	assert(s);
	assert(pos >= 0 && pos < s->size);
 
	for (int i = pos; i < s->size; i++)
	{
		s->a[i] = s->a[i + 1];
	}
	s->size--;
}
 
//查找元素是否存在,存在返回下标,否则返回-1
int Find(SL* s, SLDataType x)
{
    assert(s);
 
	for (int i = 0; i < s->size; i++)
	{
		if (x == s->a[i])
			return i;
	}
	return -1;
}

2.4顺序表的打印

//打印
void print(SL* s)
{
	for (int i = 0; i < s->size; i++)
	{
		printf("%d ", s->a[i]);
	}
	printf("\n");
}

三、顺序表的源代码

//order_table.h
 
#pragma once
 
 
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<assert.h>
 
typedef int SLDataType;
//顺序表结构体
typedef struct SL
{
	SLDataType* a;
	int size;
	int capacity;
}SL;
 
 
//初始化顺序表
void init(SL *s);
//打印
void print(SL* s);
 
//增删查改
void PushFront(SL* s,SLDataType x);//头插
 
void PushBack(SL* s, SLDataType x);//尾插
 
void PopFront(SL* s);//头删
 
void PopBack(SL* s);//尾删
 
void Insert(SL* s, int pos, SLDataType x);//任意位置的插入,pos意为下标
 
void Erase(SL* s, int pos);//任意位置的删除,pos意为下标
 
int Find(SL* s, SLDataType x);//查找元素是否存在,存在返回下标,否则返回-1
 
void SLDestory(SL* s);
//order_table.c
#include"order_table.h"

//顺序表结构体
void init(SL* s)
{
   s->a = NULL;
   s->size = 0;
   s->capacity = 0;
}

//打印
void print(SL* s)
{
   for (int i = 0; i < s->size; i++)
   {
   	printf("%d ", s->a[i]);
   }
   printf("\n");
}

//检查是否满了
void check(SL* s)
{
   if (s->size == s->capacity)
   {
   	int new_capacity = (s->capacity == 0) ? 4 : s->capacity * 2;
   	SLDataType* temp = (SLDataType*)realloc(s->a, sizeof(SLDataType) * new_capacity);
   	if (temp == NULL)
   	{
   		perror("realloc is fail!");
   		exit (EXIT_FAILURE);
   	}
   	s->a = temp;
   	s->capacity =new_capacity;
   }
}
//头插
void PushFront(SL* s, SLDataType x)
{
   check(s);
   for (int i =s->size;i>0;i-- )
   {
   	s->a[i] =s->a[i-1];
   }
   s->a[0] = x;
   s->size++;
}


void PushBack(SL* s, SLDataType x)//尾插
{
   check(s);
   s->a[s->size] = x;
   s->size++;
}

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

void PopBack(SL* s)//尾删
{
   assert(s);
   assert(s->size);

   s->size--;
}

void Insert(SL* s, int pos, SLDataType x)//任意位置的插入
{
   assert(pos >= 0 && pos <= s->size);
   check(s);
   for (int i = s->size; i > pos; i--)
   {
   	s->a[i] = s->a[i - 1];
   }
   s->a[pos] = x;
   s->size++;
}

void Erase(SL* s, int pos)//任意位置的删除
{
   assert(s);
   assert(pos >= 0 && pos < s->size);

   for (int i = pos; i < s->size; i++)
   {
   	s->a[i] = s->a[i + 1];
   }
   s->size--;
}

int Find(SL* s, SLDataType x)//查找元素是否存在,存在返回下标,否则返回-1
{
   assert(s);

   for (int i = 0; i < s->size; i++)
   {
   	if (x == s->a[i])
   		return i;
   }
   return -1;
}


void SLDestory(SL* s)
{
   assert(s);

   if(s->a)
   {
   	free(s->a);
   }
   s->a = NULL;
   s->size = s->capacity = 0;
} 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1894098.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HighConcurrencyCommFramework c++通讯服务器框架 :简介-信号处理

项目是4月份左右做的现在整理到博客上&#xff0c;顺便加深一下印象 介绍 项目描述:该项目是使用 C 实现的高并发服务器脚手架&#xff0c;包含线程池和连接池等技术&#xff0c;支持开发者进行二次开发复用&#xff0c;只需 要添加对应业务逻辑即可完成通信服务器、网络交易…

【Termius】详细说明MacOS中的SSH的客户端利器Termius

希望文章能给到你启发和灵感~ 如果觉得有帮助的话,点赞+关注+收藏支持一下博主哦~ 阅读指南 开篇说明一、基础环境说明1.1 硬件环境1.2 软件环境二、软件的安装2.1 Termius界面介绍2.1.1 Hosts 主机列表2.1.2 SFTP 文件传输2.1.3 Port ForWarding 端口转发2.1.4 Snippets 片…

afrog-漏洞扫描(挖洞)工具【了解安装使用详细】

★★免责声明★★ 文章中涉及的程序(方法)可能带有攻击性&#xff0c;仅供安全研究与学习之用&#xff0c;读者将信息做其他用途&#xff0c;由Ta承担全部法律及连带责任&#xff0c;文章作者不承担任何法律及连带责任。 1、afrog介绍 afrog 是一款性能卓越、快速稳定、PoC可定…

全面教程:在Ubuntu上快速部署ZeroTier,实现Windows与VSCode的局域网无缝访问

文章目录 1 背景介绍2 Windows上的操作3 Ubuntu上的操作4 连接 1 背景介绍 在现代工作环境中&#xff0c;远程访问公司内网的Ubuntu主机对于开发者来说是一项基本需求。然而&#xff0c;由于内网的限制&#xff0c;传统的远程控制软件如向日葵和todesk往往无法满足这一需求。作…

【后端面试题】【中间件】【NoSQL】MongoDB查询过程、ESR规则、覆盖索引的优化

任何中间件的面试说到底都是以高可用、高性能和高并发为主&#xff0c;而高性能和高并发基本是同时存在的。 性能优化一直被看作一个高级面试点&#xff0c;因为只有对原理了解得很透彻的人&#xff0c;在实践中才能找准性能优化的关键点&#xff0c;从而通过各种优化手段解决性…

YOLOv5改进 | 损失函数 | EIoU、SIoU、WIoU、DIoU、FocuSIoU等多种损失函数

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录&#xff1a; 《YOLOv5入门 …

VsCode允许JSON文件注释

打开设置 配置 输入&#xff1a;文件关联或者Files: Associations

Qt实现检测软件是否多开

Qt实现检测软件是否多开 在桌面软件开发中&#xff0c;软件通常要设置只允许存在一个进程&#xff0c;像一些熟知的音乐软件&#xff0c;QQ音乐这种。而这些软件在限制只有一个进程的同时&#xff0c;通常还会有双击桌面图标唤醒已运行的后台进程的功能。关于双击桌面唤醒已运…

Android广播机制

简介 某个网络的IP范围是192.168.0.XXX&#xff0c;子网 掩码是255.255.255.0&#xff0c;那么这个网络的广播地址就是192.168.0.255。广播数据包会被发送到同一 网络上的所有端口&#xff0c;这样在该网络中的每台主机都将会收到这条广播。为了便于进行系统级别的消息通知&…

Android使用http加载自建服务器静态网页

最终效果如下图&#xff0c;成功加载了电脑端的静态网页内容&#xff0c;这是一个xml文件。 电脑端搭建http服务器 使用“Apache Http Server”&#xff0c;下载地址是&#xff1a;https://httpd.apache.org/download.cgi。具体操作步骤&#xff0c;参考&#xff1a;Apache …

使用 urllib OpenSSL 时遇到的问题及解决

题意&#xff1a; ImportError: urllib3 v2.0 only supports OpenSSL 1.1.1, currently the ssl module is compiled with LibreSSL 2.8.3 当前使用的 urllib3 版本&#xff08;v2.0&#xff09;仅支持 OpenSSL 1.1.1 或更高版本&#xff0c;但你的 Python 环境中的 ssl 模块…

Windows 11 安装 Python 3.11 完整教程

Windows 11 安装 Python 3.11 完整教程 一、安装包安装 1. 下载 Python 3.11 安装包 打开浏览器,访问 Python 官方下载页面。点击“Download Python 3.11”,下载适用于 Windows 的安装包(Windows installer)。 2. 安装 Python 3.11 运行下载的安装包 python-3.11.x-amd6…

django @login_required 为什么会自动重定向到/accounts/login/?next=/myblog/post/new/

在Django中&#xff0c;login_required 装饰器用于确保用户在访问某个视图时已经登录。如果用户未登录&#xff0c;那么Django会自动重定向用户到登录页面。默认情况下&#xff0c;Django使用/accounts/login/作为登录URL。如果用户试图访问一个需要登录的视图&#xff0c;比如…

eNSP-VLAN虚拟局域网

一、出现Vlan的原因 同一个局域网&#xff0c;使用交换机连接&#xff0c;虽然比集线器相连&#xff0c;降低了广播风暴&#xff0c;但是局域网主机数量够多的时候&#xff0c;正常的广播数据(arp、dhcp)也很影响网络性能&#xff0c;所以还需要进一步降低广播风暴——VLAN (图…

Altium Designer专业PCB设计软件下载安装 Altium Designer安装包下载获取

在电子设计的广袤领域中&#xff0c;PCB设计无疑占据着重要的地位。而Altium Designer作为一款业界领先的电子设计自动化软件&#xff0c;其提供的先进布局工具&#xff0c;无疑为设计师们打开了一扇通往高效、精确设计的大门。 在PCB设计的核心环节——布局中&#xff0c;Alti…

xinput1_4.dll丢失怎么办?如何来解决xinput1_4.dll丢失问题

在电脑启动游戏时候经常会出现一些问题导致游戏无法打开运行&#xff0c;其中找不到xinput1_4.dll文件丢失就是常见问题之一&#xff0c;那么当遇到xinput1_4.dll丢失怎么办呢&#xff1f;今天就教大家如何来解决xinput1_4.dll丢失问题。 一、xinput1_4.dll文件详解 XINPUT1_4…

一款优秀、亮眼的开源堡垒机

介绍 在运维的日常工作中&#xff0c;登陆服务器操作不可避免&#xff0c;为了更安全的管控服务器&#xff0c;但凡有点规模的公司都会上线堡垒机系统&#xff0c;堡垒机能够做到事前授权、事中监控、事后审计&#xff0c;同时也可以满足等保合规要求。 提到堡垒机&#xff0…

小白 | 华为云docker设置镜像加速器

一、操作场景 通过docker pull命令下载镜像中心的公有镜像时&#xff0c;往往会因为网络原因而需要很长时间&#xff0c;甚至可能因超时而下载失败。为此&#xff0c;容器镜像服务提供了镜像下载加速功能&#xff0c;帮助您获得更快的下载体验。 二、约束与限制 构建镜像的客…

LVS+Nginx高可用集群--基础篇

1.集群概述 单体部署&#xff1a; 可以将上面内容分别部署在不同的服务器上。 单体架构的优点&#xff1a; 小团队成型就可完成开发&#xff0c;测试&#xff0c;上线 迭代周期短&#xff0c;速度快 打包方便&#xff0c;运维简单 单体架构的挑战&#xff1a;单节点宕机造成…

SecureCRT--使用sftp上传和下载文件

原文网址&#xff1a;SecureCRT--使用sftp上传和下载文件_IT利刃出鞘的博客-CSDN博客 简介 本文介绍SecureCRT如何在软件内直接上传和下载文件。 SecureCRT可以用如下两种方法上传和下载文件&#xff1a; 自带的sftp插件服务器安装rz/sz命令 本文介绍第一种方法&#xff0…