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. ndnarry元素处理

    元素计算函数 ceil(): 向上最接近的整数,参数是 number 或 array floor(): 向下最接近的整数,参数是 number 或 array rint(): 四舍五入,参数是 num ...

  2. Flask之自定义模型类

    4.3自定义模型类 定义模型 模型表示程序使用的数据实体,在Flask-SQLAlchemy中,模型一般是Python类,继承自db.Model,db是SQLAlchemy类的实例,代表程序使用的数据 ...

  3. 「小程序JAVA实战」 小程序私有页面的生命周期以及导航(10)

    转自:https://idig8.com/2018/08/09/xiaochengxu-chuji-10/ 之前讲了小程序全局的生命周期,今天咱们说说单个页面的生命周期!源码:https://gith ...

  4. python使用multiprocessing进行多进程编程(1)

    multiprocessing模块实现了对多进程编程的封装,让我们可以非常方便的使用多进程进行编程.它的使用方法非常类似threading模块. 1.创建一个进程 import multiproces ...

  5. 17-EasyNetQ:非泛型的发布&订阅扩展方法

    自从EasyNetQ第一个版本开始,它就可以发布/订阅特定类型的消息. bus.Subscribe<MyMessage>("subscriptionId", x =&g ...

  6. 详解Django的 select_related 和 prefetch_related 函数对 QuerySet 查询的优化

    在数据库有外键的时候,使用 select_related() 和 prefetch_related() 可以很好的减少数据库请求的次数,从而提高性能.本文通过一个简单的例子详解这两个函数的作用. 1. ...

  7. Unity3D自带Demo AngryBots路径

    [Unity3D自带Demo AngryBots路径] 1.Windows: C:\Users\Public\Documents\Unity Porjects 2.MacOSX: /Users/Sha ...

  8. Spring总结六:AOP(面向切面编程)

    概述: AOP(Aspect-Oriented Programming,面向切面的编程),它是可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术.它是一种新的 ...

  9. instanceof php

    instdnceof php5  的一个新成员 功能: 使用这个关键字可以确定一个对象是否是类的实例,是否是累的子类 ,还是实现了某个特定的接口. <?php class A{} class B ...

  10. c++ 多态问题(在虚函数里调用虚函数)

    最近在看cocos2d-x的源码,非常感激cocos2d作者的开源精神.在看代码的过程中感觉两个方向让我受益,1.把之前从书中看到的c++知识,明白了怎么运用.2.学习作者驾驭代码的巧妙方法. 看co ...