声明部分(头文件)动态数组.h
#include <stdio.h>
#include <stdlib.h>
//将此数组lib封装成静态库 lib 将项目属性设置成lib 环境需要在release版本下
typedef struct data
{
int *p;//保存数组的起始点
int length;//保存数组的长度
int stat;//0代表无序(顺序查找) 1代表有序(从小到大)(二分查找) 2 从大到小
int reallength;//实际分配内存的长度
}Data1;
typedef struct findres
{
int **pp;
int n;
}Findres;
void init(Data1 *pdata);
void reinit(Data1 *pdata);
void addData(Data1*pdata, int num);
void addArray(Data1*pdata, int *pnum, int length);
void printAll(Data1*pdata);
void deleteOneData(Data1*pdata, int num);
void deleteAllData(Data1*pdata, int num);
int *findFirstData(Data1*pdata, int num);
Findres findAllData(Data1*pdata,int num);
void change(Data1*pdata, int oldnum, int newnum);
void sort(Data1*pdata, int obj);
void insert(Data1*pdata,int num,int insertnum,int headback);
-------------------------------------------------
定义部分 动态数组.c
#include "动态数组.h"
//初始化
void init(Data1 *pdata)
{
pdata->p = NULL;
pdata->length = 0;
pdata->stat = 0;
pdata->reallength = 0;
}
void reinit(Data1 *pdata)
{
if (NULL==pdata->p)
{
return;
}
else
{
free(pdata->p);//释放内存
pdata->p = NULL;
pdata->length = 0;
pdata->stat = 0;//代表一开始数组无序
pdata->reallength = 0;
}
}
//增加一个数据 开辟缓冲区
void addData(Data1*pdata, int num)
{
if (NULL==pdata->p)
{
pdata->p = (int*)malloc(sizeof(int));//增加一个数据
pdata->length = 1;//数组标识 增加一个元素
pdata->reallength = 1;
//赋值
pdata->p[pdata->length - 1] = num;
}
else
{
if (pdata->length==pdata->reallength)
{
pdata->p = (int*)realloc(pdata->p, (pdata->length + 1)*sizeof(int));//字节来计算
pdata->length += 1;//数组标识 增加一个元素
pdata->reallength += 1;
pdata->p[pdata->length - 1] = num;//赋值
}
else
{
pdata->length += 1;
pdata->p[pdata->length - 1] = num;
}
}
}
//增加一个数组
void addArray(Data1*pdata, int *pnum, int length)//传递数组
{
if (NULL==pdata->p)
{
pdata->p = (int *)malloc(sizeof(int)*length);//增加length个元素
pdata->length = length;
pdata->reallength += length;
for (int i = 0; i < length; i++)
{
pdata->p[i] = pnum[i];
}
}
else
{
if (pdata->length+length<=pdata->reallength)
{
for (int i = 0; i < length; i++)
{
pdata->p[i + pdata->length] = pnum[i];
}
pdata->length += length;//数组标志 增加length个元素
}
else
{
pdata->p = (int*)realloc(pdata->p, (pdata->length + length)*sizeof(int));
for (int i = 0; i < length; i++)
{
pdata->p[i + pdata->length] = pnum[i];
}
pdata->length += length;//数组标志 增加length个元素
pdata->reallength += length;
}
}
}
//显示数组内容
void printAll(Data1*pdata)
{
for (int i = 0; i < pdata->length; i++)
{
printf("%d ", pdata->p[i]);
}
}
//删除
void deleteOneData(Data1*pdata, int num)//删除第一个找到的数据
{
int *p = findFirstData(pdata, num);//查找数据
if (NULL==p)
{
return ;
}
else
{
int curr = p-pdata->p;//要删除元素的下标
for (int i = curr; i < pdata->length-1; i++)
{
pdata->p[i] = pdata->p[i + 1];//后面的前移
}
pdata->length -= 1;//元素个数减1
}
}
void deleteAllData(Data1*pdata, int num)//删除所有能找到的数据
{
for (int*p = findFirstData(pdata, num); p != NULL;p=findFirstData(pdata,num))
{
int curr = p - pdata->p;
for (int i = curr; i < pdata->length - 1;i++)
{
pdata->p[i] = pdata->p[i + 1];
}
pdata->length -= 1;
}
}
//查找 返回查找到的地址
int *findFirstData(Data1*pdata, int num)//返回第一个找到的数据地址
{
if (0==pdata->stat)//代表无序 使用顺序查找
{
for (int i = 0; i < pdata->length;i++)
{
//printf("\n查找第%d次\n", i);
if (num==pdata->p[i])//判断是否相等
{
return &pdata->p[i];//返回一个地址
break;
}
}
return NULL;
}
else if (1 == pdata->stat)//二分查找 从小到大
{
int shang = 0;
int xia = pdata->length - 1;
while (shang<=xia)
{
int zhong = (shang + xia) / 2;
printf("%d %d %d\n", shang, xia, zhong);
if (pdata->p[zhong]==num)
{
return &pdata->p[zhong];
}
else if (pdata->p[zhong]>num)
{
xia = zhong - 1;
}
else
{
shang = zhong +1;
}
}
return NULL;//找不到
}
else
{
int shang = 0;
int xia = pdata->length - 1;
while (shang<=xia)
{
int zhong = (shang + xia) / 2;
printf("%d %d %d\n", shang, xia, zhong);
if (pdata->p[zhong] == num)
{
return &pdata->p[zhong];
}
else if (pdata->p[zhong] > num)
{
shang = zhong + 1;
}
else
{
xia = zhong - 1;
}
}
return NULL;
}
}
int *find(int *p,int num, int n)//从一个地址 n个范围之内找
{
for (int i = 0; i < n; i++)
{
if (p[i]==num)
{
return p + i;//返回找到的地址
break;
}
}
return NULL;//代表没有找到
}
Findres findAllData(Data1*pdata, int num)
{
Findres res;
int i = 0;//统计找到的个数
for (int*p = find(pdata->p, num, pdata->length - 1); p != NULL; p=find(p+1,num, (pdata->length-1) - (p-pdata->p) ) )
{
i++;
}
res.n = i;//保存所查找到的数据个数
//int **pint = (int*)malloc(sizeof(int*)*i);//指向指针数组的二级指针 //warning C4047: “初始化”:“int **”与“int *”的间接级别不同
int **pint = (int**)malloc(sizeof(int*)*i);
res.pp = pint;
for (int*p = find(pdata->p, num, pdata->length - 1),j=0; p != NULL; j++,p = find(p + 1, num, (pdata->length - 1) - (p - pdata->p)))
{
pint[j] = p;//循环赋值
}
return res;//返回结构体
}
//修改
void change(Data1*pdata, int oldnum, int newnum)
{
int*p = findFirstData(pdata, oldnum);
if (NULL==p)
{
printf("不存在要改变的数据\n");
return;
}
else
{
*p = newnum;
}
}
//排序
void sort(Data1*pdata, int obj)//obj=0从小到大 否则从大到小
{
if (0==obj)
{
for (int i = 0; i < pdata->length-1; i++)
{
for (int j = 0; j < pdata->length-i-1; j++)
{
if (pdata->p[j]>pdata->p[j+1])
{
//交换数据
int temp = pdata->p[j];
pdata->p[j] = pdata->p[j + 1];
pdata->p[j + 1] = temp;
}
}
}
pdata->stat = 1;//从小到大
}
else
{
for (int i = 0; i < pdata->length - 1; i++)
{
for (int j = 0; j < pdata->length - i - 1; j++)
{
if (pdata->p[j] < pdata->p[j + 1])
{
//异或交换数据
pdata->p[j] ^= pdata->p[j + 1];
pdata->p[j + 1] ^= pdata->p[j];
pdata->p[j] ^= pdata->p[j + 1];
}
}
}
pdata->stat = 2;//从大到小
}
}
//插入 在所找到的数据后面插入数据
void insert(Data1*pdata, int num, int insertnum, int headback)//headback为1时前插 为0时,后插
{
int *p = findFirstData(pdata, num);
if (NULL==p)
{
printf("目标数据不存在\n");
return ;
}
else
{
if (1==headback)//前插
{
int curr = p - pdata->p;//获取需要插入的下标
if (pdata->length < pdata->reallength)//不需要分配
{
//从后往前移动
for (int i = pdata->length-1; i >=curr ; i--)
{
pdata->p[i + 1] = pdata->p[i];
}
pdata->p[curr] = insertnum;//前面插入
pdata->length++;
}
else
{
pdata->p = (int*)realloc(pdata->p, (pdata->length + 1)*sizeof(int));//增加分配内存
pdata->reallength++;
for (int i = pdata->length-1; i >=curr; i--)
{
pdata->p[i + 1] = pdata->p[i];
}
pdata->p[curr] = insertnum;//前面插入
pdata->length++;
}
}
else if (!headback)//为0时 后插
{
if (pdata->length<pdata->reallength)
{
int curr = p - pdata->p;//获取需要插入的下标
for (int i = pdata->length - 1; i > curr; i--)
{
pdata->p[i + 1] = pdata->p[i];
}
pdata->p[curr+1] = insertnum;//后面插入
pdata->length++;
}
else
{
int curr = p - pdata->p;//获取需要插入的下标
pdata->p = (int*)realloc(pdata->p, (pdata->length + 1)*sizeof(int));//增加分配内存
pdata->reallength++;
for (int i = pdata->length - 1; i > curr; i--)
{
pdata->p[i + 1] = pdata->p[i];
}
pdata->p[curr + 1] = insertnum;//后面插入
pdata->length++;
}
}
}
}
------------------------------------------------------
主函数 测试部分 main.c
#include "动态数组.h"
//插入数据 打印数组元素 插入数组
void main1()
{
int a[10] = { 1, 42, 3, 44, 5, 56, 7, 18, 9, 90 };
Data1 data1;
init(&data1);
addData(&data1, 88);
addData(&data1, 77);
addData(&data1, 7788);
//reinit(&data1);<span style="font-family: Arial, Helvetica, sans-serif;">//重新初始化后 上面插入(之前插入)的数据就会被消除</span>
addData(&data1, 12);
addData(&data1, 56);
addData(&data1, 23);
printf("插入数据:\n");
printAll(&data1);
printf("\n插入数组:\n");
//尾部添加一个数组
addArray(&data1, a, 10);
printAll(&data1);
printf("\n从小到大 排序后的数组:\n");
sort(&data1, 0);
printAll(&data1);
printf("\n从大到小 排序后的数组:\n");
sort(&data1, 1);
printAll(&data1);
getchar();
}
测试显示结果:
<img src="https://img-blog.csdn.net/20150805000432206?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
//测试查找 使用顺序查找以及二分查找
void main2()
{
int a[10] = { 1, 77, 3, 44, 5, 1, 77, 18, 9, 90 };
Data1 data1;
init(&data1);
addData(&data1, 88);
addData(&data1, 77);
addData(&data1, 7788);
addData(&data1, 12);
addData(&data1, 77);
addData(&data1, 1);
addArray(&data1, a, 10);
printf("原始数据:\n");
printAll(&data1);
printf("\n无序状态下的顺序查找:\n");
int *pfind = findFirstData(&data1, 11);
if (pfind!=NULL)
{
printf("\n%p %d\n", pfind, *pfind);
}
else
{
printf("\n不存在要查找的数据\n");
}
printf("\n从小到大排序:\n");
sort(&data1, 0);
printAll(&data1);
printf("\n有序状态下的二分查找:\n");
{
int *pfind = findFirstData(&data1, 88);
if (pfind!=NULL)
{
printf("\n成功找到:%p %d\n", pfind, *pfind);
}
else
{
printf("\n不存在要找到的数据\n");
}
}
printf("\n从大到小排序:\n");
sort(&data1, 1);
printAll(&data1);
printf("\n有序状态下的二分查找:\n");
{
int *pfind = findFirstData(&data1, 88);
if (pfind != NULL)
{
printf("\n成功找到:%p %d\n", pfind, *pfind);
}
else
{
printf("\n不存在要找到的数据\n");
}
}
getchar();
}
<pre name="code" class="cpp">测试显示结果:
//测试删除数据void main3(){int a[10] = { 1, 77, 3, 44, 5, 1, 77, 18, 9, 90 };Data1 data1;init(&data1);addData(&data1, 88);addData(&data1, 77);addData(&data1, 7788);addData(&data1, 12);addData(&data1, 77);addData(&data1, 1);addArray(&data1, a, 10);printf("原始数据:\n");printAll(&data1);//查找所有符合要求的元素Findres resn = findAllData(&data1, 1);printf("\n查找到所有符合条件的数据(1):");for (int i = 0; i < resn.n; i++){printf("\n%d %p",**(resn.pp+i),*(resn.pp+i));//二级指针遍历数组}free(resn.pp);//用完后 释放内存printf("\n\n");deleteOneData(&data1, 1);printf("删除第一个指定元素(1)后:\n");printAll(&data1);printf("\n删除所有相同元素(77)后:\n");deleteAllData(&data1, 77);printAll(&data1);getchar();}
<pre name="code" class="cpp">测试显示结果:
//测试插入数据void main(){int a[4] = { 77, 18, 9, 90 };Data1 data1;init(&data1);addData(&data1, 88);addData(&data1, 77);addData(&data1, 7788);addData(&data1, 12);addData(&data1, 77);addData(&data1, 1);//尾部添加一个数组addArray(&data1, a, 4);printf("原始数据:\n");printAll(&data1);printf("\n插入数据后的数组:\n");insert(&data1, 90, 9999, 1);//1 前插insert(&data1, 90, 9000, 0);//0 后插printAll(&data1);getchar();}
<pre name="code" class="cpp">测试显示结果:
<pre name="code" class="cpp">编译生成静态lib库文件:新建一个工程 引入 动态数组.c以及动态数组.h文件
编译器改为Release版本,设置项目属性为生成lib库文件(步骤:)工程属性—》(配置属性)常规—》(项目默认值)配置类型改为静态库(.lib)即可
编译整个工程,生成对应的 工程名字.lib
在新建的项目中即可以引用该库
引用方式一:
#include "动态数组.h"
#pragma comment(lib,"数组库lib.lib")
引用方式二:
配置项目属性—》链接器—》输入—》在附加依赖项中添加对应的库文件名即可
-----------------------------------------------
测试编译生成的库文件 数组库lib.lib
#include <stdio.h>
#include <stdlib.h>
#include "动态数组.h"
#pragma comment(lib,"数组库lib.lib")//没有lib库可以编译 无法运行 因为调用函数无法呼叫函数实体
//测试使用生成的lib库
void main1()
{
int Array[10] = { 12, 33, 45, 48, 85, 26, 6, 56, 789, 0 };
Data1 data1;
init(&data1);
addData(&data1, 123);
addData(&data1, 678);
addData(&data1, 234);
addArray(&data1, Array,10);
printAll(&data1);
getchar();
}
void main()
{
Data1 *pdata = (Data1 *)malloc(sizeof(Data1 ));
init(pdata);
addData(pdata, 190);
addData(pdata, 123);
addData(pdata, 456);
printAll(pdata);
getchar();
}
<img src="https://img-blog.csdn.net/20150805001756576?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
更多资料 · 微信公众号搜索【CTO Plus】关注后,获取更多,我们一起学习交流。
关于公众号的描述访问如下链接