封装 动态数组库 生成企业级lib实际应用库

声明部分(头文件)动态数组.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】关注后,获取更多,我们一起学习交流。

关于公众号的描述访问如下链接


关于Articulate“做一个知识和技术的搬运工。做一个终身学习的爱好者。做一个有深度和广度的技术圈。”一直以来都想把专业领域的技https://mp.weixin.qq.com/s/0yqGBPbOI6QxHqK17WxU8Q

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SteveRocket

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值