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语言封装数组,动态实现增删改查的更多相关文章

  1. Java对象转JSON时如何动态的增删改查属性

    1. 前言 日常开发中少不了JSON处理,少不了需要在JSON中添加额外字段或者删除特定字段的需求.今天我们就使用Jackson类库来实现这个功能. 2. JSON字符串增加额外字段 假如我们有这样结 ...

  2. (一)Mybatis基本配置,Statement方式,动态代理增删改查

    首先明白Mybatis是干什么的,之前使用jdbc操作数据库时候要写很多语句,获取光标,连接,获取具体对象进行相应操作,代码过于繁琐,所以现在有了Mybatis,它将这个操作整合在了一起,你不需要关心 ...

  3. Javascript模仿C语言的链表实现(增删改查),并且使用控制台输入输出

    Js新手最近在研究Js数据结构,刚好看到链表实现这一块儿,觉得有些资料和自己理解的有冲突,于是借着自己以前一点点C语言的基础,用Javascript模仿了C的链表实现,并且用了process.stdi ...

  4. 小程序实例:用js方法splict()、indexOf()、push()、replace()等操作数组Array的增删改查

    一.增加数组子级 1.Array.push() 定义和用法 向数组的末尾处添加一个或多个子集,并返回新数组的长度 语法 var array=["好","扎在那个" ...

  5. 封装自己通用的 增删改查的方法 By EF

    封装自己的通用CURD By EF using System; using System.Collections.Generic; using System.Data.Entity; using Sy ...

  6. java 简单数组元素的增删改查

    public class Test { static int[] a = new int[20]; static int n; public static void main(String[] arg ...

  7. 自封装node 的简单增删改查

    1 首先引入的上篇node 链接mysql 里面的js var connect = require('./nodemysql.js'); 2 定义常量 const customerSQL = { qu ...

  8. php单例模式封装数据库操作类增删改查

    <?php//三私一公 单例class Db{ //数据库连接对象 private static $instance; private static $table_name; private $ ...

  9. MVC模式:实现数据库中数据的增删改查功能

    *.数据库连接池c3p0,连接mysql数据库: *.Jquery使用,删除时跳出框,确定是否要删除: *.使用EL和JSTL,简化在jsp页面中插入的java语言 1.连接数据库 (1)导入连接数据 ...

随机推荐

  1. python并发之multiprocessing

    由于GIL(全局解释锁)的问题,python多线程并不能充分利用多核处理器.如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程.multiprocessing可以给每个进程赋 ...

  2. Flask之测试与部署

    5.1 蓝图Blueprint 为什么学习蓝图? 我们学习Flask框架,是从写单个文件,执行hello world开始的.我们在这单个文件中可以定义路由.视图函数.定义模型等等.但这显然存在一个问题 ...

  3. nginx反向代理负载均衡初次配置

    反向代理,我个人理解是通过一台反向代理服务器,把客户端的把有请求按照一定的规则分发给后台的服务器.nginx作反向代理服务器的虚拟机配置如下: upstream itest { #正常情况下应该作如下 ...

  4. iOS坑爹的could not find any information for class named xxx

    关掉项目也无法解决,最后把文件delete掉,然后选“Remove Reference”,这样就不会真正删除文件.接着选“File -> Add Files to ...”添加回来就可以了.

  5. ParallaxEffect

    [ParallaxEffect] ParallaxEffect是一种用简单的2D贴图来模拟3D效果的简易方法.譬如一棵树,摄像机俯视时,当树远离摄像机时,树顶偏远,当树靠近,树顶偏近.苹果官方Adve ...

  6. mysql主从延迟

    1. MySQL数据库主从同步延迟原理.要说延时原理,得从mysql的数据库主从复制原理说起,mysql的主从复制都是单线程的操作,主 库对所有DDL和DML产生binlog,binlog是顺序写,所 ...

  7. OpenNebula 深入分析

    -------------------OpenNebula 深入分析------------------- #容量清单 属性 描述 NAME 如果名字是空的,那么默认名字是:one-<VID&g ...

  8. Windows cmd 快捷操作

    复制当前文件夹下符合条件的文件名字到文件 dir /B *-gd.dll > debug /B是只显示文件名,不包含所在路径 复制当前文件夹下文件到另外的地方 xcopy /s/d *-gd.d ...

  9. Django--model模型绑定_数据库操作

    1.创建model类 app01/models.py 1 2 3 4 5 6 7 from django.db import models   # Create your models here. c ...

  10. Smarty3——复合变量修饰器输

    你可以联合使用多个修饰器. 它们会按复合的顺序来作用于变量,从左到右. 它们必须以| (竖线)进行分隔,以‘:’号设置参数 {$articleTitle} {$articleTitle|upper|s ...