字符串数组库 声明部分
#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="" />