使用C语言封装数组,动态实现增删改查
myArray.h :
#pragma once //包含的时候只包含一次
#include <stdio.h>
#include <stdlib.h>
#include <string.h> #define datatype int struct array
{
datatype *pstart; //数组首地址
int length; //长度
int sortstat; //有序或者无序,0无序,1有序
}; void init(struct array *parr); //初始化
void initWithData(struct array *parr, datatype data); //初始化并插入数据
void initWithArr(struct array *parr, datatype *pdata, int datalength); //初始化并插入数组 void show(struct array *parr); //显示 datatype *findfirst(struct array *parr, datatype data); //查找元素,找到返回地址,没找到返回NULL void addobject(struct array *parr, datatype data); //尾部插入一个数据
void addobjects(struct array *parr, datatype *pdata,int datalength); //尾部插入一个数组
void insertobject(struct array *parr, datatype data, datatype insertdata); //任意位置插入一个数据
void insertobjects(struct array *parr, datatype data, datatype *pdata, int datalength); //任意位置插入一个数组
myArray.c :
#include "myArray.h" //初始化
void init(struct array *parr)
{
if (parr != NULL)
{
parr->pstart = NULL;
parr->length = ;
parr->sortstat = ;
}
else
printf("init Error!\n");
} //初始化并插入数据
void initWithData(struct array *parr, datatype data)
{
if (parr != NULL)
{
parr->pstart = malloc(sizeof(datatype));
*(parr->pstart) = data; //初始化
parr->length = ;
parr->sortstat = ;
}
else
printf("initWithData Error!\n");
} //初始化并插入数组
void initWithArr(struct array *parr, datatype *pdata, int datalength)
{
if (parr != NULL)
{
parr->pstart = malloc(sizeof(datatype)*datalength); //分配数组长度的内存
memcpy(parr->pstart, pdata, sizeof(datatype)*datalength); //内存拷贝
parr->length = datalength;
parr->sortstat = ;
}
else
printf("initWithArr Error!\n");
} //显示
void show(struct array *parr)
{
if (parr == NULL || parr->pstart == NULL || parr->length == )
{
printf("没有数据,无法打印\n");
return;
}
else
{
printf("\n数组此时状态:\n");
for (int i = ; i < parr->length; i++)
{
printf("%4d", parr->pstart[i]); //打印数据
}
}
} //尾部插入一个数据
void addobject(struct array *parr, datatype data)
{
if (parr != NULL)
{
if (parr->pstart == NULL || parr->length == )
initWithData(parr, data);
else
{
parr->pstart = realloc(parr->pstart, (parr->length + ) * sizeof(datatype));//拓展内存
parr->length += ; //长度加一
parr->pstart[parr->length] = data; //插入
}
}
else
printf("addobject Error!\n");
} //尾部插入一个数组
void addobjects(struct array *parr, datatype *pdata, int datalength)
{
if (parr != NULL)
{
if (parr->pstart == NULL || parr->length == )
initWithArr(parr, pdata, datalength);
else
{
parr->pstart = realloc(parr->pstart, (parr->length + datalength)*sizeof(datatype));//拓展内存 memcpy(parr->pstart + parr->length, pdata, datalength * sizeof(datatype)); parr->length += datalength; //插入 }
}
else
printf("addobjects Error!\n");
} //查找元素,找到返回地址,没找到返回NULL
datatype *findfirst(struct array *parr, datatype data)
{
if (parr == NULL || parr->pstart == NULL || parr->length == )
{
printf("没有数据,无法查找\n");
return NULL;
}
else
{
int *pfind = NULL;
for (int i = ; i < parr->length; i++)
{
if (parr->pstart[i] == data)
{
pfind = &parr->pstart[i];
break;
}
} return pfind;
}
} //任意位置插入一个数据
void insertobject(struct array *parr, datatype data, datatype insertdata)
{
if (parr != NULL)
{
datatype *pfind = findfirst(parr, data); if(pfind==NULL)
printf("can not insertobject Error!\n");
else
{
int cur = pfind - parr->pstart; //指针相减确定下标
parr->pstart = realloc(parr->pstart, (parr->length +) * sizeof(datatype)); for (int i = parr->length - ; i >= cur; i--)
{
parr->pstart[i + ] = parr->pstart[i]; //往后移动
} parr->pstart[cur] = insertdata; //插入数据
parr->length += ; //长度增加
} }
else
printf("insertobject Error!\n"); } //任意位置插入一个数组
void insertobjects(struct array *parr, datatype data, datatype *pdata, int datalength)
{
if (parr != NULL)
{
datatype *pfind = findfirst(parr, data); if (pfind == NULL)
printf("can not insertobject Error!\n");
else
{
int cur = pfind - parr->pstart; //指针相减确定下标
parr->pstart = realloc(parr->pstart, (parr->length + datalength) * sizeof(datatype)); for (int i = parr->length - ; i >= cur; i--)
{
parr->pstart[i + datalength] = parr->pstart[i]; //往后移动
} memcpy(parr->pstart + cur, pdata, datalength * sizeof(datatype));//插入数据 parr->length += datalength; //长度增加
} }
else
printf("insertobjects Error!\n");
}
main.c :
#include "myArray.h" void main()
{
struct array mydata;
int a[] = { ,,,,,,,,, };
int b[] = { ,,,, };
int c[] = { ,, }; initWithArr(&mydata, a, ); //初始化数组
show(&mydata); addobjects(&mydata, b, ); //尾部插入数组b
show(&mydata); addobjects(&mydata, c, ); //尾部插入数组c
show(&mydata); insertobject(&mydata, , );
show(&mydata); insertobjects(&mydata, , c, );
show(&mydata); system("pause");
}
使用C语言封装数组,动态实现增删改查的更多相关文章
- Java对象转JSON时如何动态的增删改查属性
1. 前言 日常开发中少不了JSON处理,少不了需要在JSON中添加额外字段或者删除特定字段的需求.今天我们就使用Jackson类库来实现这个功能. 2. JSON字符串增加额外字段 假如我们有这样结 ...
- (一)Mybatis基本配置,Statement方式,动态代理增删改查
首先明白Mybatis是干什么的,之前使用jdbc操作数据库时候要写很多语句,获取光标,连接,获取具体对象进行相应操作,代码过于繁琐,所以现在有了Mybatis,它将这个操作整合在了一起,你不需要关心 ...
- Javascript模仿C语言的链表实现(增删改查),并且使用控制台输入输出
Js新手最近在研究Js数据结构,刚好看到链表实现这一块儿,觉得有些资料和自己理解的有冲突,于是借着自己以前一点点C语言的基础,用Javascript模仿了C的链表实现,并且用了process.stdi ...
- 小程序实例:用js方法splict()、indexOf()、push()、replace()等操作数组Array的增删改查
一.增加数组子级 1.Array.push() 定义和用法 向数组的末尾处添加一个或多个子集,并返回新数组的长度 语法 var array=["好","扎在那个" ...
- 封装自己通用的 增删改查的方法 By EF
封装自己的通用CURD By EF using System; using System.Collections.Generic; using System.Data.Entity; using Sy ...
- java 简单数组元素的增删改查
public class Test { static int[] a = new int[20]; static int n; public static void main(String[] arg ...
- 自封装node 的简单增删改查
1 首先引入的上篇node 链接mysql 里面的js var connect = require('./nodemysql.js'); 2 定义常量 const customerSQL = { qu ...
- php单例模式封装数据库操作类增删改查
<?php//三私一公 单例class Db{ //数据库连接对象 private static $instance; private static $table_name; private $ ...
- MVC模式:实现数据库中数据的增删改查功能
*.数据库连接池c3p0,连接mysql数据库: *.Jquery使用,删除时跳出框,确定是否要删除: *.使用EL和JSTL,简化在jsp页面中插入的java语言 1.连接数据库 (1)导入连接数据 ...
随机推荐
- cmd命令删除文件及文件夹
rmdir /s/q wenjianming 其中: /s 是代表删除所有子目录跟其中的档案. /q 是不要它在删除档案或目录时,不再问我 Yes or No 的动作.
- IP地址分类和子网划分
IP地址: 地址范围 网络地址规律 子网掩码 私有地址 保留地址 A类地址:从1.0.0.0 到1 ...
- JDK的安装和环境配置
安装环境:网上下载的JDK一般都包含JRE在里面,安装JDK完成后会提示接着装JRE,如果没提示再去下载另装如:jdk_8u101_windows_x64_8.0.1010.13 配置环境:新建系统变 ...
- SQL Server误区30日谈 第26天 SQL Server中存在真正的“事务嵌套”
误区 #26: SQL Server中存在真正的“事务嵌套”错误 嵌套事务可不会像其语法表现的那样看起来允许事务嵌套.我真不知道为什么有人会这样写代码,我唯一能够想到的就是某个哥们对SQL Serve ...
- Docker学习笔记_删除某个镜像
实验:删除某个镜像 sudo docker rmi [Image ID] 1.查看镜像的ID sudo docker images 2.删除镜像 ...
- Hyperledger Fabric Ordering Service过程
排序服务在超级账本 Fabric 网络中起到十分核心的作用.所有交易在发送给 Committer 进行验证接受之前,需要先经过排序服务进行全局排序. 在目前架构中,排序服务的功能被抽取出来,作为单独的 ...
- R list frame, matrix
list是个筐,什么都可以往里装,包括它自身.数据框是个二维数组,同列必须同类型,行随意.
- HDU 6055 Regular polygon (暴力)
题意,二维平面上给N个整数点,问能构成多少个不同的正多边形. 析:容易得知只有正四边形可以使得所有的顶点为整数点.所以只要枚举两个点,然后去查找另外两个点就好. 代码如下: #pragma comme ...
- 在IE11(Win8)中检查up6.2配置
1.按F12,打开调试模式 2.打开调试程序选项卡 说明:在调试程序选项卡中可看到IE加载的脚本信息是否正确.因为IE有缓存,导致脚本有时不是最新的. 3.打开脚本,up6.js ...
- 编写高质量代码改善C#程序的157个建议——建议22:确保集合的线程安全
建议22:确保集合的线程安全 集合线程安全是指多个线程上添加或删除元素时,线程键必须保持同步. 下面代码模拟了一个线程在迭代过程中,另一个线程对元素进行了删除. class Program { sta ...