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

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语言实现顺序表 顺序表的结构定义&#xff1a; typedef struct vector {int size; // 顺序表的容量int count; // 顺序表现在存储了多少个数据int *data; // 指针指向连续的整型存储空间 } vector;顺序表的结构操作&#xff1a; 1、初始…...

微软为新闻编辑行业推出 AI 辅助项目,记者参加免费课程

2 月 6 日消息&#xff0c;微软当地时间 5 日发布新闻稿宣布与多家新闻机构展开多项基于生成式 AI 的合作。微软表示&#xff0c;其使命是确保新闻编辑室在今年和未来拥有创新。 目前建议企业通过微软官方合作伙伴获取服务&#xff0c;可以合规、稳定地提供企业用户使用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定制开发中&#xff0c;其中在低电量时&#xff0c;系统会自动关机&#xff0c;这个和不同的平台和底层驱动和硬件都有关系&#xff0c;需要结合这些来实际调整这个值&#xff0c;我们可以通过分析源码中电池服务的代码&#xff0c;然后进行修改如何实现…...

【EAI 013】BC-Z: Zero-Shot Task Generalization with Robotic Imitation Learning

论文标题&#xff1a;BC-Z: Zero-Shot Task Generalization with Robotic Imitation Learning 论文作者&#xff1a;Eric Jang, Alex Irpan, Mohi Khansari, Daniel Kappler, Frederik Ebert, Corey Lynch, Sergey Levine, Chelsea Finn 论文原文&#xff1a;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库中&#xff0c;我们经常会遇到需要将字符串转换为相应对象或数据结构的情况。在这种情况下&#…...

微软.NET6开发的C#特性——类、结构体和联合体

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;看到不少初学者在学习编程语言的过程中如此的痛苦&#xff0c;我决定做点什么&#xff0c;下面我就重点讲讲微软.NET6开发人员需要知道的C#特性&#xff0c;然后比较其他各种语言进行认识。 C#经历了多年发展…...

naiveui 上传图片遇到的坑 Upload

我在开发图片上传功能, 需要手动触发上传 但是我调用它内部自定义submit方法, 结果接口一直在报错400 我反反复复的测试了好就, 确定了就是我前端的问题,因为之前一直在做后端的错误排查, 以为是编译问题(因为之前也出现过这个问题) 好 , 我把其中一个参数类型改为String类型, …...

安全之护网(HVV)、红蓝对抗

文章目录 红蓝对抗什么是护网行动&#xff1f;护网分类护网的时间 什么是红蓝对抗红蓝对抗演练的目的什么是企业红蓝对抗红蓝对抗价值参考 红蓝对抗 什么是护网行动&#xff1f; 护网的定义是以国家组织组织事业单位、国企单位、名企单位等开展攻防两方的网络安全演习。进攻方…...

Leetcode 213 打家劫舍 II

题意理解&#xff1a; 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋&#xff0c;每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 &#xff0c;这意味着第一个房屋和最后一个房屋是紧挨着的。同时&#xff0c;相邻的房屋装有相互连通的防盗系统&#xff0c;如果…...

【C语言】三子棋游戏实现代码

目录 1.三子棋代码功能介绍 2.三子棋游戏实现步骤 ①打印菜单栏 ②判断是否进入三子棋游戏 ③三子棋游戏基本函数实现 &#xff08;1&#xff09;清空&#xff08;初始化&#xff09;棋盘函数实现 &#xff08;2&#xff09;打印棋盘函数实现 &#xff08;3&#xff0…...

docker常用10条容器操作命令

Docker 中一些常用的容器操作命令&#xff0c;我们可以根据需要使用这些命令来管理和操作 Docker 容器。我们这次以Hell-world这个镜像为例来说明&#xff1a; 1. docker pull hello-world #拉取hell-world镜像 2. docker images # 查看本地拉取的镜像 或者可以用 docker im…...

《MySQL 简易速速上手小册》第2章:数据库设计最佳实践(2024 最新版)

文章目录 2.1 规划高效的数据库架构2.1.1 基础知识2.1.2 重点案例&#xff1a;在线电商平台2.1.3 拓展案例 1&#xff1a;博客系统2.1.4 拓展案例 2&#xff1a;库存管理系统 2.2 数据类型和表设计2.2.1 基础知识2.2.2 重点案例&#xff1a;个人健康记录应用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&#xff0c;我是贝格前端工场&#xff0c;专注前端开发8年了&#xff0c;前端始终绕不开的一个话题就是如何和后端交换数据&#xff08;通讯&#xff09;&#xff0c;本文先从最基础的通讯方式讲起。 一、什么是前后端通讯 前后端通讯&#xff08;Frontend-Backend Commun…...

Mysql大表添加字段失败解决方案

背景 最近遇到一个问题&#xff0c;需要在user用户表千万级别数据中添加两个字段&#xff0c;发现老是加不上去&#xff0c;一直卡死。表数据量不仅大&#xff0c;而且是一个热点表&#xff0c;访问频率特别高&#xff0c;而且该表的访问是在一个大事务中。加字段的时候一直在…...

(52)只出现一次的数字III

文章目录 每日一言题目解题思路代码结语 每日一言 十年磨一剑&#xff0c;风雨未曾阻挡;愿你乘风破浪&#xff0c;不负韶华时光。 题目 题目链接&#xff1a;只出现一次的数字 给你一个整数数组 nums&#xff0c;其中恰好有两个元素只出现一次&#xff0c;其余所有元素均出现…...

Linux增删ip

Linux手动增删IP by: 铁乐猫 日期&#xff1a;2022.03.17 这里主要是记录手动临时添加和删除ip。 ifconfig方式 例&#xff0c;添加&#xff1a; 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&#xff09; dproc 排队时延&#xff08;queuing delay&#xff09; dqueue 传输时延&#xff08;transmission delay&#xff09; dtrans 路由器将分组推出所需要的时间&#xff0c;是分组长度和链路传输速率的函数 传播时…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...