封装 数组库二次实现字符串数组

本文介绍了一个字符串数组库的设计与实现,包括数组初始化、添加、查找、插入、删除等功能,并通过示例展示了如何使用该库进行字符串数组的操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

字符串数组库 声明部分
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <string.h>
#define  datatype  char *
struct array
{
	datatype *pstart;//数组首地址
	int length;//长度
	int sortstat;
};
void init(struct array *parr);
void initwithdata(struct array *parr, datatype data);
void initwitharray(struct array *parr, datatype *pdata,int datalength);
void show(struct array *parr, void (*pfun)(datatype *pdata));
void addobject(struct array *parr, datatype data);
void addobjects(struct array *parr, datatype *pdata, int datalength);
datatype * findfirst(struct array *parr, datatype data, int  (*pfun)(datatype *pdata1, datatype *pdata2));//查找
struct Res  findall(struct array *parr, datatype data);//查找全部
void showdata(datatype *pdata );
//判断是否相等
int  isequal(datatype *pdata1, datatype *pdata2);//相等返回0,不等返回非0
void insertobject(struct array *parr, datatype data,datatype insertdata);//根据位置插入
void insertobjects(struct array *parr, datatype data, datatype *pdata, int datalength);
void deletefirstobject(struct array *parr, datatype data);
void deleteallobject(struct array *parr, datatype data);
void changefirstobject(struct array *parr, datatype data, datatype newdata);
void changeallobject(struct array *parr, datatype data, datatype newdata);
--------------------------------------------------
定义部分
<pre name="code" class="cpp">#include "myarray.h"
void init(struct array *parr)
{
	if (parr!=NULL)
	{
		parr->pstart = NULL;
		parr->length = 0;
		parr->sortstat = 0;
	}
	else
	{
		printf("init error");
	}
}
void initwithdata(struct array *parr, datatype data)
{
	if (parr != NULL)
	{
		parr->pstart = malloc(sizeof(datatype));
		*(parr->pstart) = data;//初始化
		parr->length = 1;
		parr->sortstat = 0;
	}
	else
	{
		printf("initwithdata error");
	}
}
void initwitharray(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 = 0;
	}
	else
	{
		printf("initwitharray error");
	}
}
void showdata(datatype *pdata)
{
	printf("%s  ", *pdata);
}
void show(struct array *parr, void(*pfun)(datatype *pdata))
{
   if (parr ==NULL  || parr->pstart==NULL || parr->length==0)
   {
	   printf("数组为空,无法显示!\n");
	   return;
   } 
   else
   {
	   printf("\n数组此时状态\n");
	   for (int i = 0; i < parr->length;i++)
	   {
		   pfun( parr->pstart + i);//传递地址
	   }
   }
}
void addobject(struct array *parr, datatype data)
{
	if (parr!=NULL)
	{
		if (parr->pstart==NULL || parr->length==0)
		{
			initwithdata(parr, data);
		} 
		else
		{
			parr->pstart = realloc(parr->pstart, (parr->length +1)*sizeof(datatype));
			parr->pstart[parr->length] = data;
			parr->length += 1;
		}
	} 
	else
	{
		printf("addobject error");
	}
}
void addobjects(struct array *parr, datatype *pdata, int datalength)
{
	if (parr != NULL)
	{
		if (parr->pstart == NULL || parr->length == 0)
		{
			initwitharray(parr, pdata,datalength);//调用初始化
		}
		else
		{
			//12345 a[4] &a[5]
			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");
	}
}
int  isequal(datatype *pdata1, datatype *pdata2)
{
	return strcmp(*pdata1, *pdata2);//传递的是地址
}
datatype * findfirst(struct array *parr, datatype data, int  (*pfun)(datatype *pdata1, datatype *pdata2))
{
	if (parr == NULL || parr->pstart == NULL || parr->length == 0)
	{
		printf("没有数据咋查找");
		return NULL;
	}
	else
	{
		datatype *pfind = NULL;
		for (int i = 0; i < parr->length; i++)
		{
			if (pfun(parr->pstart+i, &data) == 0)
			{
				pfind = &parr->pstart[i]; //parr->pstart+i
				break;
			}
		}
		return pfind;
	}
}
void insertobject(struct array *parr, datatype data, datatype insertdata)//根据位置插入
{
	if (parr != NULL)
	{
		datatype *pfind = findfirst(parr, data, isequal);;
		if (pfind==NULL)
		{
			printf("can not  insertobject error");
		} 
		else
		{
			int curr = pfind - parr->pstart;
			printf("\n curr=%d", curr);
			parr->pstart = realloc(parr->pstart,( parr->length +1)* sizeof(datatype));
			
			for (int i = parr->length - 1; i >= curr;i--)
			{
				parr->pstart[i + 1] = parr->pstart[i];
			}
			parr->pstart[curr] = insertdata;
			parr->length += 1;
		}
	}
	else
	{
		printf("insertobject error");
	}
}
void insertobjects(struct array *parr, datatype data, datatype *pdata, int datalength)
{
	if (parr != NULL)
	{
		datatype *pfind = findfirst(parr, data,isequal);
		if (pfind == NULL)
		{
			printf("can not  insertobject error");
		}
		else
		{
			int curr = pfind - parr->pstart;
			printf("\n curr=%d", curr);
			parr->pstart = realloc(parr->pstart, (parr->length + datalength)* sizeof(datatype));//拓展内存

			for (int i = parr->length - 1; i >= curr; i--)
			{
				parr->pstart[i + datalength] = parr->pstart[i];//往后移动
			}
			//parr->pstart[curr] = insertdata;//插入数据
			memcpy(parr->pstart + curr, pdata, datalength* sizeof(datatype));//拷贝数组
			parr->length += datalength;//长度自增
		}
	}
	else
	{
		printf("insertobject error");
	}
}
void deletefirstobject(struct array *parr, datatype data)
{
	if (parr != NULL)
	{
		datatype *pfind = findfirst(parr, data,isequal);
		if (pfind == NULL)
		{
			printf("can not  find  deleteterror");
		}
		else
		{
			int curr = pfind - parr->pstart;//指针相减确定下标,当前数据的下标
			for (int i = curr; i < parr->length - 1;i++)
			{
				parr->pstart[i] = parr->pstart[i + 1];//删除,从后向前移动
			}
			parr->length -= 1;//长度自增
			parr->pstart = realloc(parr->pstart, (parr->length )* sizeof(datatype));//压缩
		}
	}
	else
	{
		printf(" deleteobject error");
	}
}
void deleteallobject(struct array *parr, datatype data)
{
	if (parr != NULL)
	{
		for (int*pcurr = findfirst(parr, data, isequal); pcurr != NULL; pcurr = findfirst(parr, data, isequal))
		{
			deletefirstobject(parr, data);
		}
	}
	else
	{
		printf(" deleteobject error");
	}
}
void changefirstobject(struct array *parr, datatype data, datatype newdata)
{
	if (parr != NULL)
	{
		datatype *pfind = findfirst(parr, data, isequal);
		if (pfind == NULL)
		{
			printf("can not  find  deleteterror");
		}
		else
		{
			*pfind = newdata;
		}
	}
	else
	{
		printf(" deleteobject error");
	}
}
void changeallobject(struct array *parr, datatype data, datatype newdata)
{
	if (parr != NULL)
	{
		for (int*pcurr = findfirst(parr, data, isequal); pcurr != NULL; pcurr = findfirst(parr, data, isequal))
		{
			changefirstobject(parr, data,newdata);
		}
	}
	else
	{
		printf(" deleteobject error");
	}
}

------------------------------------------------------


主函数  测试部分
<pre name="code" class="cpp">#include "myarray.h"
//数组库的二次封装 实现字符串数组库
void main()
{
	struct array  mydata;
	char *str[5] = { "周瑞富", "zhouruifu", "rocket", "----", "zrf-rocket" };
	char *str1[4] = { "ABC", "zrf", "周瑞富","\nhttp://blog.youkuaiyun.com/zhouruifu2015\n"};
	initwitharray(&mydata, str, 5);
	show(&mydata, showdata);

	printf("\n添加数组:");
	addobjects(&mydata, str1, 4);
	show(&mydata, showdata);

	 printf("\n插入数据:");
     insertobjects(&mydata, "----", str1, 4);
 	 show(&mydata, showdata);

	 printf("\n删除所有指定数据:");
 	 deleteallobject(&mydata, "周瑞富");
 	 show(&mydata, showdata);
	system("pause");
}
<img src="https://img-blog.youkuaiyun.com/20150803010102743?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

SteveRocket

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

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

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

打赏作者

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

抵扣说明:

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

余额充值