c实现顺序表
目录
c语言实现顺序表
完整代码实现
c语言实现顺序表
顺序表的结构定义:
typedef struct vector {int size; // 顺序表的容量int count; // 顺序表现在存储了多少个数据int *data; // 指针指向连续的整型存储空间 } vector;顺序表的结构操作:
1、初始化顺序表
vector *getNewVector(int n) // 获取一个存储上限为n的顺序表 {vector *p = (vector *)malloc(sizeof(vector)); // 为顺序表结构体动态开辟空间p->size = n; // 上限p->count = 0; // 存储个数初始化为0p->data = (int *)malloc(sizeof(int *) * n); // 指针指向连续的存出区return p; }2、销毁顺序表
void clear(vector *v) {if (v == NULL)return; // 如果没有顺序表则返回free(v->data); // 先销毁连续的存储区free(v); // 再销毁顺序表本身的存储空间return; }3、插入数据
int insert(vector *v, int pos, int value) // 在pos位置插入 {if (pos < 0 || pos > v->count)return 0; // 插入位置合不合法// if (v->size == v->count)// return 0; if(v->size == v->count && !expand(v)) return 0; // 判断表是否满了for (int i = v->count - 1; i >= pos; i--) // 逆序遍历,后移{v->data[i + 1] = v->data[i];}v->data[pos] = value; // 插入v->count += 1; // 维护数据return 1; }4、删除数据
int erase(vector *v, int pos) // 在pos位置删除数据 {if (pos < 0 || pos >= v->count)return 0; // 删除位置合法不if (v->count == 0)return 0; // 无数据for (int i = pos + 1; i < v->size; i++) // 前序遍历,前移{v->data[i - 1] = v->data[i];}v->count -= 1; // 维护数据return 1; }5、输出数据
// 5、输出数据 void output_vector(vector *v) {int len = 0;for (int i = 0; i < v->size; i++){len += printf("%3d", i);}printf("\n");for (int i = 0; i < len; i++)printf("-");printf("\n");for (int i = 0; i < v->count; i++){printf("%3d", v->data[i]);}printf("\n");printf("\n");return; }6、扩容数据
注意:
realloc的三种工作方式
1、试着在原内存的基础上向后延展内存空间
2、当后面的内存不够用了,会重新找一块内存将原来的复制过来然后向后延展
3、若重新找的内存没有足够大的,就返回NULL。
int expand(vector* v) {if(v == NULL) return 0;int * p = (int *)realloc(v->data,sizeof(int) * 2 * v->size); //为了避免realloc工作原理产生的bug,先定义一个指针,先给这个指针赋予reallocif( p == NULL) return 0; //若p返回NULL,则扩容空间失败 返回就可以了v->data = p;v->size *= 2;return 1; }
完整代码实现
#include <stdio.h>
#include <stdlib.h>
#include <time.h>// 顺序表 结构定义
typedef struct vector
{int size; // 顺序表的容量int count; // 顺序表现在存储了多少个数据int *data; // 指针指向连续的整型存储空间
} vector;// 顺序表 结构操作
// 1、初始化顺序表
vector *getNewVector(int n) // 获取一个存储上限为n的顺序表
{vector *p = (vector *)malloc(sizeof(vector)); // 为顺序表结构体动态开辟空间p->size = n; // 上限p->count = 0; // 存储个数初始化为0p->data = (int *)malloc(sizeof(int *) * n); // 指针指向连续的存出区return p;
}
// 2、销毁顺序表
void clear(vector *v)
{if (v == NULL)return; // 如果没有顺序表则返回free(v->data); // 先销毁连续的存储区free(v); // 再销毁顺序表本身的存储空间return;
}
//6、扩容
int expand(vector* v)
{if(v == NULL) return 0;int * p = (int *)realloc(v->data,sizeof(int) * 2 * v->size); if( p == NULL) return 0;v->data = p;v->size *= 2;return 1;
}
// 3、插入
int insert(vector *v, int pos, int value) // 在pos位置插入
{if (pos < 0 || pos > v->count)return 0; // 插入位置合不合法// if (v->size == v->count)// return 0; if(v->size == v->count && !expand(v)) return 0; // 判断表是否满了for (int i = v->count - 1; i >= pos; i--) // 逆序遍历,后移{v->data[i + 1] = v->data[i];}v->data[pos] = value; // 插入v->count += 1; // 维护数据return 1;
}
// 4、删除
int erase(vector *v, int pos) // 在pos位置删除数据
{if (pos < 0 || pos >= v->count)return 0; // 删除位置合法不if (v->count == 0)return 0; // 无数据for (int i = pos + 1; i < v->size; i++) // 前序遍历,前移{v->data[i - 1] = v->data[i];}v->count -= 1; // 维护数据return 1;
}
// 5、输出数据
void output_vector(vector *v)
{int len = 0;for (int i = 0; i < v->size; i++){len += printf("%3d", i);}printf("\n");for (int i = 0; i < len; i++)printf("-");printf("\n");for (int i = 0; i < v->count; i++){printf("%3d", v->data[i]);}printf("\n");printf("\n");return;
}int main(void)
{srand(time(0)); //实现随机数
#define MAX_OP 10vector *v = getNewVector(2);for (int i = 0; i < MAX_OP; i++){int op = rand() % 4, pos, val, ret;switch (op){//75% 插入case 0:case 1:case 2:pos = rand() % (v->count + 2); //随机位置val = rand() % 100; //随机值ret = insert(v, pos, val); //插入 为 1 ; 删除 为 0printf("insert %d at %d to vector = %d\n",val, pos, ret);break;//25% 删除case 3:pos = rand() % (v->count + 2);ret = erase(v, pos);printf("erase item at %d in vector = %d\n",pos, ret);break;}output_vector(v);}clear(v); //销毁表return 0;
}
相关文章:
c实现顺序表
目录 c语言实现顺序表 完整代码实现 c语言实现顺序表 顺序表的结构定义: typedef struct vector {int size; // 顺序表的容量int count; // 顺序表现在存储了多少个数据int *data; // 指针指向连续的整型存储空间 } vector;顺序表的结构操作: 1、初始…...
微软为新闻编辑行业推出 AI 辅助项目,记者参加免费课程
2 月 6 日消息,微软当地时间 5 日发布新闻稿宣布与多家新闻机构展开多项基于生成式 AI 的合作。微软表示,其使命是确保新闻编辑室在今年和未来拥有创新。 目前建议企业通过微软官方合作伙伴获取服务,可以合规、稳定地提供企业用户使用ChatGP…...
openssl3.2 - exp - buffer to BIO
文章目录 openssl3.2 - exp - buffer to BIO概述笔记END openssl3.2 - exp - buffer to BIO 概述 openssl的资料看的差不多了, 准备将工程中用到的知识点整理一下. openssl中很多API是以操作文件作为输入的, 也有很多API是以BIO作为输入的. 不管文件是不是受保护的, 如果有可…...
Android 13.0 系统framework修改低电量关机值为3%
1、讲在最前面 系统rom定制开发中,其中在低电量时,系统会自动关机,这个和不同的平台和底层驱动和硬件都有关系,需要结合这些来实际调整这个值,我们可以通过分析源码中电池服务的代码,然后进行修改如何实现…...
【EAI 013】BC-Z: Zero-Shot Task Generalization with Robotic Imitation Learning
论文标题:BC-Z: Zero-Shot Task Generalization with Robotic Imitation Learning 论文作者:Eric Jang, Alex Irpan, Mohi Khansari, Daniel Kappler, Frederik Ebert, Corey Lynch, Sergey Levine, Chelsea Finn 论文原文:https://arxiv.org…...
一文讲透ast.literal_eval() eval() json.loads()
文章目录 一文讲透ast.literal_eval() eval() json.loads()1. ast.literal_eval()2. eval()3. json.loads()4. 总结 一文讲透ast.literal_eval() eval() json.loads() 在Python库中,我们经常会遇到需要将字符串转换为相应对象或数据结构的情况。在这种情况下&#…...
微软.NET6开发的C#特性——类、结构体和联合体
我是荔园微风,作为一名在IT界整整25年的老兵,看到不少初学者在学习编程语言的过程中如此的痛苦,我决定做点什么,下面我就重点讲讲微软.NET6开发人员需要知道的C#特性,然后比较其他各种语言进行认识。 C#经历了多年发展…...
naiveui 上传图片遇到的坑 Upload
我在开发图片上传功能, 需要手动触发上传 但是我调用它内部自定义submit方法, 结果接口一直在报错400 我反反复复的测试了好就, 确定了就是我前端的问题,因为之前一直在做后端的错误排查, 以为是编译问题(因为之前也出现过这个问题) 好 , 我把其中一个参数类型改为String类型, …...
安全之护网(HVV)、红蓝对抗
文章目录 红蓝对抗什么是护网行动?护网分类护网的时间 什么是红蓝对抗红蓝对抗演练的目的什么是企业红蓝对抗红蓝对抗价值参考 红蓝对抗 什么是护网行动? 护网的定义是以国家组织组织事业单位、国企单位、名企单位等开展攻防两方的网络安全演习。进攻方…...
Leetcode 213 打家劫舍 II
题意理解: 你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果…...
【C语言】三子棋游戏实现代码
目录 1.三子棋代码功能介绍 2.三子棋游戏实现步骤 ①打印菜单栏 ②判断是否进入三子棋游戏 ③三子棋游戏基本函数实现 (1)清空(初始化)棋盘函数实现 (2)打印棋盘函数实现 (3࿰…...
docker常用10条容器操作命令
Docker 中一些常用的容器操作命令,我们可以根据需要使用这些命令来管理和操作 Docker 容器。我们这次以Hell-world这个镜像为例来说明: 1. docker pull hello-world #拉取hell-world镜像 2. docker images # 查看本地拉取的镜像 或者可以用 docker im…...
《MySQL 简易速速上手小册》第2章:数据库设计最佳实践(2024 最新版)
文章目录 2.1 规划高效的数据库架构2.1.1 基础知识2.1.2 重点案例:在线电商平台2.1.3 拓展案例 1:博客系统2.1.4 拓展案例 2:库存管理系统 2.2 数据类型和表设计2.2.1 基础知识2.2.2 重点案例:个人健康记录应用2.2.3 拓展案例 1&a…...
利用YOLOv8 pose estimation 进行 人的 头部等马赛克
文章大纲 马赛克几种OpenCV 实现马赛克的方法高斯模糊pose estimation 定位并模糊:三角形的外接圆与膨胀系数实现实现代码实现效果参考文献与学习路径之前写过一个文章记录,怎么对人进行目标检测后打码,但是人脸识别有个问题是,很多人的背影,或者侧面无法识别出来人脸,那…...
【Python 千题 —— 基础篇】查找年龄
Python 千题持续更新中 …… 脑图地址 👉:⭐https://twilight-fanyi.gitee.io/mind-map/Python千题.html⭐ 题目描述 题目描述 班级中有 Tom、Alan、Bob、Candy、Sandy 五个人,他们组成字典 {Tom: 23, Alan: 24, Bob: 21, Candy: 22, Sandy: 21},字典的键是姓名,字典的…...
前后端通讯:前端调用后端接口的五种方式,优劣势和场景
Hi,我是贝格前端工场,专注前端开发8年了,前端始终绕不开的一个话题就是如何和后端交换数据(通讯),本文先从最基础的通讯方式讲起。 一、什么是前后端通讯 前后端通讯(Frontend-Backend Commun…...
Mysql大表添加字段失败解决方案
背景 最近遇到一个问题,需要在user用户表千万级别数据中添加两个字段,发现老是加不上去,一直卡死。表数据量不仅大,而且是一个热点表,访问频率特别高,而且该表的访问是在一个大事务中。加字段的时候一直在…...
(52)只出现一次的数字III
文章目录 每日一言题目解题思路代码结语 每日一言 十年磨一剑,风雨未曾阻挡;愿你乘风破浪,不负韶华时光。 题目 题目链接:只出现一次的数字 给你一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现…...
Linux增删ip
Linux手动增删IP by: 铁乐猫 日期:2022.03.17 这里主要是记录手动临时添加和删除ip。 ifconfig方式 例,添加: ifconfig eth0:1 192.168.0.101/24移除 ifconfig eth0:1 downip addr方式 添加 ip addr add 192.168.0.102/24 dev eth0 …...
【计算机网络】时延,丢包,吞吐量(分组交换网络
时延 结点处理时延(nodal processing delay) dproc 排队时延(queuing delay) dqueue 传输时延(transmission delay) dtrans 路由器将分组推出所需要的时间,是分组长度和链路传输速率的函数 传播时…...
RH850 F1的FLASH自编程实战:如何在程序运行时安全更新数据闪存?
RH850 F1 FLASH自编程实战:如何在运行时安全更新数据闪存? 当车载ECU以120km/h行驶时,突然需要更新发动机标定参数——这个看似矛盾的场景,正是汽车电子工程师每天面对的挑战。RH850 F1系列微控制器独有的**后台操作(BGO)**功能&a…...
仿真流程专题——基于Workbench的随机振动工程实践与3σ准则应用
1. 随机振动分析入门:从理论到工程实践 第一次接触随机振动分析时,我和大多数工程师一样感到困惑——这种"不确定"的载荷到底该怎么分析?经过多个项目的实战,我发现用生活中的例子最容易理解:想象你在颠簸的…...
UDP,TCP协议的格式与机制
目录 一:UDP 1.UDP协议端格式 2.UDP的特点 二:TCP 1.TCP协议段格式 2.确认应答机制 1.确认应答的原理 2.为什么有两个序号?——捎带应答 3.超时重传 4.快速重传 3.连接管理机制 1.三次握手 2.四次挥手 shutdown函数 COLSE_WAI…...
百度网盘直链解析终极指南:3分钟实现高速下载的完整教程
百度网盘直链解析终极指南:3分钟实现高速下载的完整教程 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 还在为百度网盘下载速度慢而烦恼吗?每次下载大…...
Vue3 表单深度解析
Vue3 表单深度解析 引言 随着前端技术的发展,Vue.js 已经成为最受欢迎的前端框架之一。Vue3 作为 Vue.js 的最新版本,带来了许多改进和新特性。其中,表单处理是 Vue3 中一个非常重要的部分。本文将深入解析 Vue3 表单的用法、特点以及最佳实践。 Vue3 表单概述 在 Vue3 …...
Linux 系统编程 文件篇 (二)
[TOC] Linux 系统编程 文件篇 (二) 1 open 函数介绍 1.1 标记位 上一篇的结尾,我们讲到了我们用的打开文件的库函数其实是封装了,这个 open 的系统调用,然后解释了这个 open 函数的 这个标记位,flags 是一个…...
西南交通大学【数电实验之Modelsim仿真全流程实战】
1. 从零开始搭建Modelsim仿真环境 第一次接触数字电路仿真的同学可能会觉得Modelsim界面复杂,其实只要跟着步骤一步步操作,半小时就能跑通第一个仿真案例。我当年在西南交大做数电实验时,也经历过从一脸懵到熟练操作的过程,这里把…...
Grok 4.3与未来展望——智能体时代的Grok与AI安全新范式
目录1 Grok 4.3 Beta:最新版本的技术跃迁1.1 2026年4月:Grok 4.3的发布1.2 Computer Use:AI操作计算机的新范式2 reasoning_effort参数的深度解析2.1 推理资源的动态分配2.2 推理深度与质量的实证关系3 Grok的AI安全框架3.1 "最大真实性…...
细胞的“近距离对话大师”——Notch信号通路
在我们身体里,细胞并非孤立存在,它们通过信号通路精准沟通,其中Notch信号通路堪称细胞间的“近距离对话大师”,从果蝇到人类都高度保守,不靠远距离信号扩散,仅靠相邻细胞“面对面接触”,就能掌控…...
从B类到连续类:一篇讲透功放效率与带宽的“鱼与熊掌”兼得史
射频功率放大器的进化论:从B类到连续类的带宽革命 在无线通信技术狂飙突进的三十年里,有个看似矛盾的命题始终困扰着工程师:如何让功率放大器同时"吃得少"(高效率)和"干得多"(宽带宽&…...
