【数据结构与算法】线性表 - 顺序表

目录

  • 1. 线性表
  • 2.顺序表
  • 3.顺序表的优缺点
  • 4.实现(C语言)
    • 4.1 头文件 seqList.h
    • 4.2 实现 seqList.c

1. 线性表

  线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串…

  线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储
在这里插入图片描述

2.顺序表

  顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储,在数组上完成数据的增删查改。

顺序表一般可以分为:

  1. 静态顺序表:使用定长数组存储元素。
  2. 动态顺序表:使用动态开辟的数组存储。

  静态顺序表只适用于确定知道需要存多少数据的场景,静态顺序表的定长数组,长度N定大了,空间开多了浪费,开少了不够用。所以基本都是使用动态顺序表,根据需要动态的分配空间大小。

3.顺序表的优缺点

缺点:增删改速度慢。

  1. 中间 / 头部的插入删除,时间复杂度为O(N)。
  2. 增容需要申请新空间,拷贝数据,释放旧空间,会有不小的消耗。
  3. 增容一般是呈1.5或2倍的增长,势必会有一定的空间浪费。

优点:有数组索引,查询速度快。

4.实现(C语言)

4.1 头文件 seqList.h

#pragma once#include <stdlib.h>
#include <assert.h>
#include <string.h>// 初始大小
#define STD_SIZE 4// 顺序表数据类型
typedef int seqListDataType;// 顺序表
typedef struct SeqList 
{seqListDataType* list;int size; // 有效数据个数int cap; // 顺序表容量
} SeqList;// 初始化,销毁
void init(SeqList* psl);
void destroy(SeqList* psl);// 扩容
void checkResize(SeqList* psl);// 头插头删,尾插尾删
void addFront(SeqList* psl, seqListDataType ele);
void removeFront(SeqList* psl);
void addBack(SeqList* psl, seqListDataType ele);
void removeBack(SeqList* psl);// 指定位置[0-size+1)插入,[0~size)删除
void insert(SeqList* psl, int pos, seqListDataType ele);
void erase(SeqList* psl, int pos);

4.2 实现 seqList.c

#define _CRT_SECURE_NO_WARNINGS 1#include "seqlist.h"// 初始化
void init(SeqList* psl)
{assert(psl);psl->list = NULL;psl->size = 0;psl->cap = 0;
}// 销毁
void destroy(SeqList* psl)
{assert(psl && psl->list);free(psl->list);psl->list = NULL;psl->size = 0;psl->cap = 0;
}// 检查容量并扩容
static void checkResize(SeqList* psl)
{if (psl->size == psl->cap) {int newCap = psl->size == 0 ? STD_SIZE : psl->cap * 2;seqListDataType* tmpList = realloc(psl->list, newCap * sizeof(seqListDataType));if (tmpList != NULL){psl->list = tmpList;psl->cap = newCap;// 只将扩容的内存置0memset((psl->list) + psl->size, 0, psl->size * sizeof(seqListDataType));}else{perror("checkCap(SqList* psl) realloc error");}}
} // 头插
void addFront(SeqList* psl, seqListDataType data)
{assert(psl);checkResize(psl);// 所有元素往后挪1位for (int i = psl->size - 1; i >= 0; i--){psl->list[i + 1] = psl->list[i];}psl->list[0] = data;psl->size++;
}// 头删
void removeFront(SeqList* psl)
{assert(psl && psl->size > 0);// 第2个元素开始,所有元素往前挪1位for (int i = 1; i < psl->size; i++){psl->list[i - 1] = psl->list[i];}psl->list[psl->size - 1] = 0;psl->size--;
}// 尾插
void addBack(SeqList* psl, seqListDataType data)
{assert(psl);checkResize(psl);psl->list[psl->size] = data;psl->size++;
}// 尾删
void removeBack(SeqList* psl)
{assert(psl && psl->size > 0);psl->list[psl->size - 1] = 0;psl->size--;
}// 指定位置[0-size+1)插入
void insert(SeqList* psl, int pos, seqListDataType ele)
{	assert(psl);checkResize(psl);assert(pos >= 0 && pos < psl->size + 1);// 从插入位置开始,所有元素向后挪动1位for (int i = psl->size - 1; i >= pos; i--){psl->list[i + 1] = psl->list[i];}psl->list[pos] = ele;psl->size++;
}// 指定位置[0~size)删除
void erase(SeqList* psl, int pos)
{assert(psl && pos >= 0 && pos < psl->size);// 从删除位置开始,所有元素往前移动1位for (int i = pos; i < psl->size; i++){psl->list[i] = psl->list[i + 1];}psl->list[psl->size - 1] = 0;psl->size--;
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络的体系结构

目录 一. 计算机体系结构的形成二. 协议与层次划分2.1 数据传输过程2.2 什么是网络协议2.3 网络协议的三要素2.4 协议有两种形式2.4 各层协议2.5 什么是复用和分用 \quad 一. 计算机体系结构的形成 \quad 计算机网络是一个非常复杂的系统, 相互通信的两个计算机系统必须高度协调…

tomcat8.5处理get请求时,控制台输出中文乱码问题的解决

问题描述 控制台输出中文乱码 版本信息 我使用的是tomcat8.5 问题解决 配置web.xml 注&#xff1a;SpringMVC中处理编码的过滤器一定要配置到其他过滤器之前&#xff0c;否则无效 <!--配置springMVC的编码过滤器--> <filter><filter-name>CharacterEn…

C#特性(Attribute)

C#特性&#xff08;Attribute&#xff09;是一种在程序中添加元数据的机制&#xff0c;它可以为代码提供额外的信息和指示。通过使用特性&#xff0c;我们可以为类、方法、属性等元素添加标记&#xff0c;以便在运行时进行更多的操作和决策。 C#特性是一种声明式编程的工具&…

NSSCTF第13页(1)

[NCTF 2018]Easy_Audit 小小代码审计 $_REQUEST:PHP的内置变量&#xff0c;是一个数组&#xff0c;保存传递的参数&#xff0c;它的特性是如果get,post一起传参&#xff0c;则会优先post传参&#xff0c;可以由此进行变量覆盖。 $_SERVER:PHP的内置变量&#xff0c;是一个数组…

一文搞懂RC滤波器的设计?

滤波器是一种可以对“波”进行过滤的器件&#xff0c;一般是特定频率的信号。所以可以常常看到滤波器的种类繁多&#xff0c;有高通滤波器&#xff0c;低通滤波器&#xff0c;带通滤波器及带阻滤波器等等。 滤波器的主要作用就是滤波&#xff0c;它需要尽可能的让有用信号能够做…

unity教程

前言 伴随游戏行业的兴起&#xff0c;unity引擎的使用越来越普遍&#xff0c;本文章主要记录博主本人入门unity的相关记录大部分依赖siki学院进行整理。12 一、认识unity引擎&#xff1f; 1、Unity相关信息&#xff1a; Unity的诞生&#xff1a;https://www.jianshu.com/p/550…

M2 Mac Xcode编译报错 ‘***.framework/‘ for architecture arm64

In /Users/fly/Project/Pods/YYKit/Vendor/WebP.framework/WebP(anim_decode.o), building for iOS Simulator, but linking in object file built for iOS, file /Users/fly/Project/Pods/YYKit/Vendor/WebP.framework/WebP for architecture arm64 这是我当时编译模拟器时报…

The ultimate UI kit and design system for Figma 组件库下载

Untitled UI 是世界上最大的 Figma UI 套件和设计系统。可以启动任何项目&#xff0c;为您节省数千小时&#xff0c;并祝您升级为专业设计师。 采用 100% 自动布局 5.0、变量、智能变体和 WCAG 可访问性精心制作。 900全局样式、变量&#xff1a;超级智能的全局颜色、排版和效…

springboot321基于java的校园服务平台设计与开发

交流学习&#xff1a; 更多项目&#xff1a; 全网最全的Java成品项目列表 https://docs.qq.com/doc/DUXdsVlhIdVlsemdX 演示 项目功能演示&#xff1a; ————————————————

【MySQL】InnoDB和MyISAM区别详解(MySQL专栏启动)

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;2022年度博客之星全国TOP3&#xff0c;专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化&#xff0c;文章内容兼具广度、深度、大厂技术方案&#xff0c;对待技术喜欢推理加验证&#xff0c;就职于…

新增文章分类

pojo.Category package com.lin.springboot01.pojo;import jakarta.validation.constraints.NotEmpty; import lombok.Data;import java.time.LocalDateTime;Data public class Category {private Integer id;//主键NotEmptyprivate String categoryName;//分类名称NotEmptypr…

Typora——优雅的排版也是一种品味

电脑中用于编辑文本的软件&#xff0c;一直以来可谓是层出不穷&#xff0c;大家脑海中一定会浮现出很多名字&#xff1a;word&#xff0c;OneNote&#xff0c;记事本&#xff0c;wps&#xff0c;LaTeX&#xff0c;还有各种小众的office工具&#xff0c;等等等等。今天学长将介绍…