当前位置: 首页 > news >正文

数据结构与算法系列之顺序表的实现

在这里插入图片描述

这里写目录标题

  • 顺序表的优缺点:
  • 注意事项
  • test.c(动态顺序表)
  • SeqList.h
  • SeqList.c
  • 各接口函数功能详解
    • void SLInit(SL* ps);//定义
    • void SLDestory(SL* ps);
    • void SLPrint(SL* ps);
    • void SLPushBack(SL* ps ,SLDataType * x );
    • void SLPopBack(SL* ps);
    • void SLPushFront(SL* ps,SLDataType * x );
    • void SLPopFront(SL* ps);
    • void SLCheckCapacity(SL* ps);
    • void SLInsert(SL* ps, int pos, SLDataType x);//pos位置插入
    • void SLErase(SL* ps, int pos);//pos位置删除
    • int SLFind(SL* ps, SLDataType x);

顺序表的优缺点:

优点:存储密度高,可以随机存取结点。
缺点:1.长度为定值,中途无法扩充
2.插入删除需要移动结点,效率低

注意事项

1.N个数头删和尾删的时间复杂度是O(N)
N个数头插和尾插的时间复杂度是O(N^2)
//当数组只有一个元素时,移动1次,有两个元素时,移动两次,有三个元素时移动三次… 所以成等差数列经大O表达式为(N^2)

2.柔性数组与顺序表的关系
柔性数组是与结构体变量占一个空间
而顺序表是结构体额外开辟的空间

3.不能用realloc进行缩容
//缩容之后,可能缩容的部分会被使用,在进行扩容的话,不能回到原样

4.free()
//不能在动态数组中间进行释放,必须开辟多大空间,就一次释放完

顺序表
在这里插入图片描述
柔性数组
在这里插入图片描述

test.c(动态顺序表)

int main()
{SL s;SLInit(&s);int option = 0;while (option != -1){menu();scanf("%d", &option);if (option == 1){printf("请依次输入要尾插的数据");int x = 0;while (x != -1){scanf("%d", &x);SLPushBack(&s, x);}}else if (option == 7){SLPrint(&s);}}return 0; 
}

SeqList.h

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#define INT_CAPACITY 4
typedef int  SLDataType;typedef struct SepList
{SLDataType* a;int size;int capacity;
}SL;void SLInit(SL* ps);
void SLDestory(SL* ps);
void SLPrint(SL* ps);void SLPushBack(SL* ps ,SLDataType * x );//尾插
void SLPopBack(SL* ps);//尾删
void SLPushFront(SL* ps,SLDataType * x );//头插
void SLPopFront(SL* ps);//头删
void SLCheckCapacity(SL* ps);//扩容void SLInsert(SL* ps, int pos, SLDataType x);//pos位置插入
void SLErase(SL* ps, int pos);//pos位置删除
int  SLFind(SL* ps, SLDataType x);

SeqList.c

#include "SeqList.h"
void SLCheckCapacity(SL* ps)
{assert(ps);if (ps->size == ps->capacity){		//realloc 可能会原地扩容 也可能异地扩容SLDataType* tmp = (SLDataType*)realloc(ps->a, sizeof(SLDataType) * (ps->capacity* 2));if (tmp == NULL){perror("realloc fail");return;}ps->a = tmp;ps->capacity *= 2;}}void SLInit(SL* ps)
{assert(ps);ps->a = (SLDataType*)malloc(sizeof(SLDataType)*  INT_CAPACITY);if (ps->a == NULL){perror("malloc fail");return;}ps->size = 0;ps->capacity = INT_CAPACITY;
}
void SLDestory(SL* ps)
{assert(ps);free(ps->a);ps->a = NULL;ps->size = 0;ps->capacity = 0;
}
void SLPushBack(SL* ps, SLDataType  x)
{assert(ps);SLCheckCapacity(ps);//扩容ps->a[ps->size++] = x;//SLInsert(ps,ps->size, x)尾插
}
void SLPopBack(SL* ps)
{assert(ps);assert(ps->size > 0);/*if (ps->size == 0){return;}*/ps->size--;//尾删SLErase(ps, ps->size-1);
}
void SLPushFront(SL* ps ,SLDataType x)
{assert(ps);SLCheckCapacity(ps);int end = ps->size - 1;while (end >= 0){ps->a[end + 1] = ps->a[end];end--;}ps->a[0] = x;ps->size++;}
void SLPopFront(SL* ps)
{assert(ps);assert(ps->size > 0);int begin = 1;while (begin < ps->size){ps->a[begin - 1] = ps->a[begin];begin++;}ps->size--;
}
void SLPrint(SL* ps)
{assert(ps);for (int i = 0; i < ps->size; i++){printf("%d ", ps->a[i]);}
}void SLInsert(SL* ps, int pos, SLDataType x)
{assert(ps);assert(pos >= 0 && pos <= ps->size);//可以等于size,相当于尾插SLCheckCapacity(ps);int end = ps->size-1;while (end >= pos){ps->a[end + 1] = ps->a[end];end--;}ps->a[pos] = x;ps->size++;
}void SLErase(SL* ps, int pos)
{assert(ps);assert(pos >= 0 && pos < ps->size);int begin = pos + 1;while (begin < ps->size){ps->a[begin-1] = ps->a[begin];begin++;}ps->size--; 
}int SLFind(SL* ps, SLDataType x)
{assert(ps);for (int i = 0; i < ps->size; i++){if (ps->a[i] == x)return i;}return -1;}

各接口函数功能详解

void SLInit(SL* ps);//定义

assert(ps);//进行assert判断ps这个结构体指针是否存在ps->a = (SLDataType*)malloc(sizeof(SLDataType)*  INT_CAPACITY);//使用malloc函数进行扩容,必须用free()释放 if (ps->a == NULL){perror("malloc fail");return;}ps->size = 0;初始化ps->capacity = INT_CAPACITY;

void SLDestory(SL* ps);

{assert(ps);free(ps->a);ps->a = NULL;ps->size = 0;ps->capacity = 0;
}

void SLPrint(SL* ps);

assert(ps);for (int i = 0; i < ps->size; i++){printf("%d ", ps->a[i]);}

void SLPushBack(SL* ps ,SLDataType * x );

{assert(ps);SLCheckCapacity(ps);//判断是否扩容//扩容ps->a[ps->size++] = x;//SLInsert(ps,ps->size, x)尾插
}

void SLPopBack(SL* ps);

    assert(ps);assert(ps->size > 0);因为尾删判断数组是否有元素存在,如果没有元素则不可以尾删/*if (ps->size == 0){return;}*/ps->size--;//尾删SLErase(ps, ps->size-1);

void SLPushFront(SL* ps,SLDataType * x );

{assert(ps);SLCheckCapacity(ps);//是否扩容int end = ps->size - 1;while (end >= 0){ps->a[end + 1] = ps->a[end];end--;}ps->a[0] = x;ps->size++;}

在这里插入图片描述

void SLPopFront(SL* ps);

{assert(ps);assert(ps->size > 0);int begin = 1;while (begin < ps->size){ps->a[begin - 1] = ps->a[begin];begin++;}ps->size--;
}

在这里插入图片描述

void SLCheckCapacity(SL* ps);

	
void SLCheckCapacity(SL* ps)
{assert(ps);if (ps->size == ps->capacity){		//realloc所以扩容成功后,可能会原地扩容 也可能异地扩容,所以用ps->a = tmp来重新接收SLDataType* tmp = (SLDataType*)realloc(ps->a, sizeof(SLDataType) * (ps->capacity* 2));if (tmp == NULL){perror("realloc fail");return;}ps->a = tmp;ps->capacity *= 2;}}

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

//可用于头插和尾插

assert(ps);assert(pos >= 0 && pos <= ps->size);//可以等于size,相当于尾插SLCheckCapacity(ps);int end = ps->size-1;while (end >= pos){ps->a[end + 1] = ps->a[end];end--;}ps->a[pos] = x;ps->size++;

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

//可用于头删和尾删


assert(ps);assert(pos >= 0 && pos < ps->size);int begin = pos + 1;while (begin < ps->size){ps->a[begin-1] = ps->a[begin];begin++;}ps->size--; 

int SLFind(SL* ps, SLDataType x);

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

在这里插入图片描述

相关文章:

数据结构与算法系列之顺序表的实现

这里写目录标题顺序表的优缺点&#xff1a;注意事项test.c&#xff08;动态顺序表&#xff09;SeqList.hSeqList.c各接口函数功能详解void SLInit(SL* ps);//定义void SLDestory(SL* ps);void SLPrint(SL* ps);void SLPushBack(SL* ps ,SLDataType * x );void SLPopBack(SL* ps…...

基于Linux_ARM板的驱动烧写及连接、挂载详细过程(附带驱动程序)

文章目录前言一、搭建nfs服务二、ARM板的硬件连接三、putty连接四、挂载共享文件夹五、烧写驱动程序六、驱动程序示例前言 本文操作环境&#xff1a;Ubuntu14.04、GEC6818 这里为似懂非懂的朋友简单叙述该文章的具体操作由来&#xff0c;我们的主要目的是将写好的驱动程序烧进…...

python-爬虫-字体加密

直接点 某8网 https://*****.b*b.h*****y*8*.com/ 具体网址格式就是这样的但是为了安全起见,我就这样打码了. 抛出问题 我们看到这个号码是在页面上正常显示的 F12 又是这样就比较麻烦,不能直接获取.用requests库也是获取不到正常想要的 源码的,因为字体加密了. 查看页面源代码…...

计算机组成原理4小时速成5:输入输出系统,io设备与cpu的链接方式,控制方式,io设备,io接口,并行串行总线

计算机组成原理4小时速成5&#xff1a;输入输出系统&#xff0c;io设备与cpu的链接方式&#xff0c;控制方式&#xff0c;io设备&#xff0c;io接口&#xff0c;并行串行总线 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c…...

安全狗受聘成为福州网信办网络安全技术支撑单位

近日&#xff0c;福州市委网信办召开了2022年度网络安全技术支撑单位总结表彰大会。 作为国内云原生安全领导厂商&#xff0c;安全狗也出席了此次活动。 据悉&#xff0c;会议主要对2022年度优秀支撑单位进行表彰&#xff0c;并为2023年度支撑单位举行授牌仪式。 本次遴选工…...

RV1126 在Ubuntu18.04开发环境搭建

1:安装软件终端下输入安装命名&#xff1a;sudo apt install openssh-serversudo apt install android-tools-adbsudo apt install vim net-tools gitsudo apt install cmakesudo apt install treesudo apt install minicomsudo apt install gawksudo apt install bisonsudo ap…...

如何在 C++ 中调用 python 解析器来执行 python 代码(一)?

实现 Python UDF 中的一步就是学习如何在 C 语言中调用 python 解析器。本文根据 Python 官方文档做了一次实验&#xff0c;记录如下&#xff1a; 1. 安装依赖包 $sudo yum install python3-devel.x86_642. 使用 python-config 来生成编译选项 $python3.6-config --cflags -…...

操作系统权限提升(二十三)之Linux提权-通配符(ws)提权

系列文章 操作系统权限提升(十八)之Linux提权-内核提权 操作系统权限提升(十九)之Linux提权-SUID提权 操作系统权限提升(二十)之Linux提权-计划任务提权 操作系统权限提升(二十一)之Linux提权-环境变量劫持提权 操作系统权限提升(二十二)之Linux提权-SUDO滥用提权 利用通配符…...

Zookeeper下载和安装

Zookeeper 1.下载 官方下载地址&#xff1a;https://zookeeper.apache.org/ 版本&#xff1a;apache-zookeeper-3.7.1-bin.tar.gz 2. 安装 2.1 本地安装 2.1.1 安装JDK 见&#xff1a;Hadoop集群搭建 2.1.2 上传安装包 使用远程工具拷贝安装包到Linux指定路径 /opt/s…...

Biomod2 (上):物种分布模型预备知识总结

Biomod11.栅格数据处理1.1 读取一个栅格图片1.2 计算数据间的相关系数1.3 生成多波段的栅格图像1.4 修改变量名称1.4.1 计算多个变量之间的相关性2. 矢量数据处理2.1 提取矢量数据2.2 数据掩膜2.2 栅格计算2.3 拓展插件的使用3. 图表绘制3.1 遥感影像绘制3.2 柱状图分析图绘制3…...

操作指南:如何高效使用Facebook Messenger销售(二)

上一篇文章我们介绍了使用Facebook Messenger作为销售渠道的定义、好处及注意事项&#xff0c;本节我们将详细介绍怎么将Facebook Messenger销售与SaleSmartly&#xff08;ss客服&#xff09;结合&#xff0c;实现一站式管理多主页配图来源&#xff1a;SaleSmartly&#xff08;…...

计算机三级|网络技术|中小型网络系统总体规划与设计方案|IP地址规划技术|2|3

p3 p4一、中小型网络系统总体规划与设计方案网络关键的设备选型路由器技术指标性能指标综述吞吐量背板能力丢包率时延抖动突发处理能力路由表容量服务质量网管能力可靠性和可用性1 吞吐量指路由器的包转发能力&#xff0c;涉及两个内容&#xff1a;端口吞吐量和整机吞吐量&…...

为什么一定要做集成测试?

集成测试&#xff0c;我们都不陌生&#xff0c;几乎我们产品每天都在进行。但是我们真的有好好思考&#xff1a;为什么一定要做集成测试吗&#xff1f;只是为了简单的将“积木”搭起来就行&#xff0c;还是有什么其他的深意&#xff1f; 深意可能不一定会有&#xff0c;但是意…...

前端:CSS

CSS基本语法规则&#xff1a;选择器若干属性声明 style标签&#xff1a;可以放到代码的任意位置处&#xff0c;head/body中都可以 三种写CSS的方式&#xff1a; 1、内部样式&#xff1a;使用style标签&#xff0c;直接把CSS写到html文件中。此时的style标签可以放到任何位置…...

CMMI—组织级过程定义(OPD)

大家好&#xff0c;我是Doker 多克&#xff01;一、目的组织级过程定义&#xff08;Organizational Process Definition&#xff0c; OPD&#xff09;的目的在于建立并维护一套可用的组织级过程资产、工作环境标准以及团队规则与指南二、简介组织级过程资产使得整个组织具有一致…...

华为OD机试真题Python实现【猜字谜】真题+解题思路+代码(20222023)

猜字谜 题目 小王设计了一个简单的猜字谜游戏,游戏的谜面是一个错误的单词,比如nesw,玩家需要猜出谜底库中正确的单词。 猜中的要求如下: 对于某个谜面和谜底单词,满足下面任一条件都表示猜中: 变换顺序以后一样的,比如通过变换w和e的顺序,nwes跟news是可以完全对应的…...

软测入门(三)Selenium(Web自动化测试基础)

Selenium&#xff08;Web端自动测试&#xff09; Selenium是一个用于Web应用程序测试的工具&#xff1a;中文是硒 开源跨平台&#xff1a;linux、windows、mac核心&#xff1a;可以在多个浏览器上进行自动化测试多语言 Selenium WebDriver控制原理 Selenium Client Library…...

备战蓝桥杯——sort函数

备战蓝桥杯——sort函数排列字母lambda匿名函数排列字母 链接: 排列字母 不用多说&#xff0c;很简单的签到题&#xff0c;我们先来了解一下sort函数的用法 list.sort(cmpNone, keyNone, reverseFalse) cmp:进行比较的方法&#xff08;可以自定义排序的方法&#xff0c;通常…...

华为机试题:HJ86 求最大连续bit数(python)

文章目录&#xff08;1&#xff09;题目描述&#xff08;2&#xff09;Python3实现&#xff08;3&#xff09;知识点详解1、input()&#xff1a;获取控制台&#xff08;任意形式&#xff09;的输入。输出均为字符串类型。1.1、input() 与 list(input()) 的区别、及其相互转换方…...

机器学习复习--logistic回归简单的介绍和代码调用

最近需要复习一下机器学习相关知识&#xff0c;记录一下 一、简介 线性回归&#xff1a;h(x)wTxbh(x)w^T x bh(x)wTxb logistic回归就是在线性模型的基础上加上一个sigmoid函数ggg&#xff0c;即h(x)g(wTxb)h(x)g(w^T xb)h(x)g(wTxb)。。。g(z)1/(1e−z)g(z)1/(1e^{-z})g(z)…...

uniapp小程序接入腾讯地图sdk

新建一个项目。配置uniapp配置文件设置小程序的appid注意&#xff1a;匿名用户可能存在地理定位失效。查uniapp官网官网->apiuni.getLocation(OBJECT) 获取当前的地理位置、速度。属性&#xff1a;success匿名函数返回值&#xff1a;uni.getLocation({type: gcj02,success: …...

总结JavaScript中的条件判断与比较运算

一、条件判断 JavaScript 中有三种方法可以用来进行条件判断&#xff1a; 1、使用 if-else 语句。这种方法用于在特定条件为 true 时执行一段代码&#xff0c;否则执行另一段代码。例如&#xff1a; let a 5; if (a > 10) {console.log("a is greater than 10"…...

算法练习-排序(一)

算法练习-排序(一) 文章目录算法练习-排序(一)1 排序算法1.1 冒泡排序1.1.1代码1.2插入排序1.2.1代码1.3 选择排序1.3.1代码1.4归并排序1.4.1代码1.5 快速排序1.5.1 思路1.5.2 代码2 题目2.1 特殊排序2.1.1 题目2.1.2 题解2.2 数组中的第k个最大元素2.2.1 题目2.2.2 题解2.3 对…...

CentOS7.6快速安装Docker

快速安装 官网安装参考手册&#xff1a;https://docs.docker.com/install/linux/docker-ce/centos/ 确定你是CentOS7及以上版本,yum是在线安装! [rootVM-4-5-centos ~]# cat /etc/redhat-releaseCentOS Linux release 7.6.1810 (Core)接下来您只管自上向下执行命令即可&#x…...

CentOS 7安装N卡驱动和CUDA和cuDNN

前言系统一开始是CentOS 7.6&#xff0c;安装依赖时yum给的内核文件的版本号和uname -r的结果不一样&#xff0c;这时不能直接装依赖&#xff0c;装上后后面装驱动时会报错找不到内核头文件(最开始我直接装依赖了&#xff0c;以为高版本兼容低版本&#xff0c;然后装驱动时报错…...

Java开发 - 分页查询初体验

前言在上一篇&#xff0c;我们对es进行了深入讲解&#xff0c;相信看过的小伙伴已经能基本掌握es的使用方法&#xff0c;我们知道&#xff0c;es主要针对的是搜索条件&#xff0c;在这方面es具有无可比拟的优势&#xff0c;但我们也会注意到&#xff0c;有时候搜索条件过于宽泛…...

C语言循环语句do while和嵌套循环语句讲解

C do…while 循环 不像 for 和 while 循环&#xff0c;它们是在循环头部测试循环条件。在 C 语言中&#xff0c;do…while 循环是在循环的尾部检查它的条件。 do…while 循环与 while 循环类似&#xff0c;但是 do…while 循环会确保至少执行一次循环。 语法 C 语言中 do…w…...

【计算机视觉】OpenCV 4高级编程与项目实战(Python版)【7】:拼接图像

我们已经知道,图像是通过数组描述的,那么拼接图像其实就是拼接数组。NumPy提供了2个拼接数组的函数,分别是hstack函数和vstack函数,这两个拼接函数可以将两个数组水平和垂直拼接在一起,也就相当于将两幅图像水平和垂直拼接在一起,本节将详细讲解如何使用这两个函数水平拼…...

王道操作系统课代表 - 考研计算机 第二章 进程与线程 究极精华总结笔记

本篇博客是考研期间学习王道课程 传送门 的笔记&#xff0c;以及一整年里对 操作系统 知识点的理解的总结。希望对新一届的计算机考研人提供帮助&#xff01;&#xff01;&#xff01; 关于对 “进程与线程” 章节知识点总结的十分全面&#xff0c;涵括了《操作系统》课程里的全…...

C++修炼之练气期三层——函数重载

目录 1.引例 2.函数重载的概念 3.C支持函数重载的原理 1.引例 倘若现在要实现一个加法计算器&#xff0c;用C语言实现的话我们会选择这样的方式&#xff1a; int Add_int(int a, int b) {return a b; }double Add_double(double a, double b) {return a b; } 在使用加…...

ksweb wordpress/百度推广外推联系方式

当前的CPU和GPU是分立设计的处理器,不能高效率地协同工作,编写同时运行于CPU和GPU的程序也是相当麻烦。由于CPU和GPU拥有独立的地址空间,应用程序不得不明确地控制数据在CPU和GPU之间的流动。CPU代码通过系统调用向GPU发送任务,此类系统调用一般由GPU驱动程序管理,而驱动程…...

建设项目环境影响备案网站/小红书怎么推广引流

Design for failure 转载于:https://www.cnblogs.com/lavieenrose/archive/2012/05/31/2527194.html...

外国网站签到做任务每月挣钱/深圳最好的外贸seo培训

层叠样式 表和动态HTML层叠样式表(CSS)是指定HTML文档或XML文档的表现的标准。使用CSS和Javascript&#xff0c;可以创建出各种视觉效果&#xff0c;这些效果可以统称为动态HTML(DHTML)CSS样式是一个名称/值的属性列表指定的&#xff0c;属性之间用分号隔开&#xff0c;名字属性…...

广州seo网站推广优化/今日头条新闻在线看

什么是索引覆盖就是select的数据列只用从索引中就能够取得&#xff0c;不必读取数据行&#xff0c;换句话说查询列要被所建的索引覆盖。那么显然select * from ...是一种拙劣的查询&#xff0c;除非你建立了包含所有列的索引&#xff08;这样建索引脑子进水&#xff09;。对 于…...

个人如何做网站/app注册推广拉人

当初学 Python 时&#xff0c;想要弄懂 Python 的错误信息的含义可能有点复杂。这里列出了常见的的一些让你程序 crash 的运行时错误。 1&#xff09;忘记在 if , elif , else , for , while , class ,def 声明末尾添加 &#xff1a;&#xff08;导致 “SyntaxError &#xff1…...

阿里云备案成功怎么建设网站/seo推广优化平台

转载于:https://www.cnblogs.com/ycxyyzw/archive/2012/07/04/2576148.html...