字符数组封装实现添加,删除,插入,修改,搜索,打印

来源:互联网 发布:自动化设备控制软件 编辑:程序博客网 时间:2024/05/16 17:01

/*********************************************************
*文件名:字符数组.h
*创建者:ycj
*创建时间:2015-3-11
*文件说明:实现 添加,删除,插入,修改,搜索,打印
**********************************************************/

//实现 添加,删除,插入,修改,搜索,打印

#include <stdio.h>
#include <stdlib.h>


//动态数组的属性
struct CharArry
{
char *p;//指针保存数组的起始点
int length;//保存数组的长度
int reallength;//实际分配的内存长度
};


//保存findalldata中数据的个数和地址
struct findres
{
char **pp;//指针保存找到的元素的地址(指针数组)
int n;//保存找到数值的个数
};


void init(struct CharArry *pdata);//初始化


void reinit(struct CharArry *pdata);//使用之后初始化


void addobject(struct CharArry *pdata, char num);//添加数据


void insert(struct CharArry *pdata, char num, char insertnum, int headback);//插入
//headback:1代表前面插入,0代表后面插入,num表示插入数据位置


void deletone(struct CharArry *pdata, char num);//删除找到的第一个数据


void deletall(struct CharArry *pdata, char num);//删除所有相同的数据


char *finddata(struct CharArry *pdata, char num);//找出出现的第一个数据


struct findres findalldata(struct CharArry *pdata, char num);//找出所有相同的数据
//返回一个结构体,包含找到元素的个数和地址


void printfall(struct CharArry *pdata);//打印







/*********************************************************
*文件名: 字符数组.c
*创建者:ycj
*创建时间:2015-3-11
*文件说明:实现 添加,删除,插入,修改,搜索,打印
**********************************************************/

#include "字符数组.h"


//初始化
void init(struct CharArry *pdata)
{
pdata->p = NULL;//意味着还没有初始化
pdata->length = 0;//长度为0
pdata->reallength = 0;//实际长度
}


//使用之后初始化
void reinit(struct CharArry *pdata)
{
if (pdata->p == NULL)
{
return;
}
else
{
free(pdata->p);//释放内存
pdata->p = NULL;//意味着还没有初始化
pdata->length = 0;//长度为0
pdata->reallength = 0; //实际长度
}
}


//添加数据
void addobject(struct CharArry *pdata, char num)
{
if (pdata->p == NULL)
{
pdata->p = (char *)malloc(sizeof(char));
pdata->p[pdata->length] = num;
pdata->length += 1;
pdata->reallength += 1;
}
else
{
if (pdata->length == pdata->reallength)
{
pdata->p = (char *)realloc(pdata->p, pdata->length + 1);
pdata->p[pdata->length] = num;
pdata->length += 1;
pdata->reallength += 1;
}
else
{
pdata->p[pdata->length] = num;
pdata->length += 1;
}
}
}


//插入
void insert(struct CharArry *pdata, char num, char insertnum, int headback)
{
char *p = finddata(pdata, num);
if (p == NULL)
{
printf("插入失败,没有找到\n");
return;//没有找到
}
else
{
//找到,1前面插入,否则后面插入
if (headback == 1)
{
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] = insertnum;
pdata->length += 1;
}
else
{
int curr = p - pdata->p; //获取要插入位置的下标
pdata->p = (char *)realloc(pdata->p, pdata->length + 1);
for (int i = pdata->length - 1; i >= curr; i--)
{
pdata->p[i + 1] = pdata->p[i];
}
pdata->p[curr] = insertnum;
pdata->length += 1;
pdata->reallength += 1;
}
}
else
{
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 += 1;
}
else
{
int curr = p - pdata->p; //获取要插入位置的下标
pdata->p = (char *)realloc(pdata->p, pdata->length + 1);
for (int i = pdata->length - 1; i > curr; i--)
{
pdata->p[i + 1] = pdata->p[i];
}
pdata->p[curr + 1] = insertnum;
pdata->length += 1;
pdata->reallength += 1;
}
}
}
}


//删除首次搜到的字符
void deletone(struct CharArry *pdata, char num)
{
if (pdata->p == NULL)
{
printf("没有数据,无法删除\n");
}
else
{
char *p = finddata(pdata, num);
if (p == NULL)
{
printf("没有找到,无法删除\n");
}
else
{
int curr = p - pdata->p;
//printf("%c,%p\n", *p, p);
//printf("%c,%p\n", pdata->p[curr], &pdata->p[curr]);
for (int i = curr; i < pdata->length - 1; i++)
{
pdata->p[i] = pdata->p[i + 1];
}
pdata->length -= 1;
}
}
}


//删除所有相同的数据
void deletall(struct CharArry *pdata, char num)
{
if (pdata->p == NULL)
{
printf("没有数据,无法删除\n");
}
else
{
for (char *p = finddata(pdata, num); p != NULL; p = finddata(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;
}
}
}


//首次搜到的字符
char *finddata(struct CharArry *pdata, char num)
{
//if (pdata->p == NULL)
//{
// //printf("没有数据,查找失败\n");
// return NULL;
//}


for (int i = 0; i < pdata->length; i++)
{
if (pdata->p[i] == num)
{
//printf("%p,%c", &pdata->p[i], pdata->p[i]);
return &pdata->p[i];
}
}


return NULL;//没有此数据
}


char *find(char *p, int n, char num)
{
for (int i = 0; i < n; i++)
{
if (p[i] == num)
{
return p + i;
}
}
return NULL;//代表没有找到
}


//找出所有相同的数据
struct findres findalldata(struct CharArry *pdata, char num)
{
struct findres res1;
int i = 0;
for (char *p = find(pdata->p, pdata->length, num); p != NULL; p = find(p + 1, pdata->length - (p - pdata->p + 1), num))
{
i++;
}
res1.n = i;


char **pp = (char **)malloc(sizeof(char *) * i);//指针数组
res1.pp = pp;
int j = 0;
for (char *p = find(pdata->p, pdata->length, num); p != NULL; j++, p = find(p + 1, pdata->length - (p - pdata->p + 1), num))
{
pp[j] = p;//循环赋值
}
return res1;
}


//打印
void printfall(struct CharArry *pdata)
{
if (pdata->p == NULL)
{
printf("error,not find\n");
}
else
{
for (char *px = pdata->p; px - pdata->p < pdata->length; px++)
{
printf("%c", *px);
}
printf("\n");
}
}



/*********************************************************
*文件名: test.c
*创建者:ycj
*创建时间:2015-3-11
*文件说明:测试各个模块
**********************************************************/

#include "字符数组.h"
#pragma comment(lib, "字符数组lib.lib")//引用静态库


void main()
{
struct CharArry data1;


init(&data1);//初始化


addobject(&data1, 'a');//添加数据
reinit(&data1);//使用之后初始化


addobject(&data1, 'a');//添加数据
addobject(&data1, 'a');//添加数据
addobject(&data1, 'z');//添加数据
addobject(&data1, 'z');//添加数据


printfall(&data1);//打印


char *p = finddata(&data1, 'a');//首次搜到的字符
printf("%p,%c\n", p, *p);
insert(&data1, 'a', 'b', 0);
insert(&data1, 'a', 'c', 1);


deletone(&data1, 'a');


char *px = finddata(&data1, 'b');
printf("%p,%c\n", px, *px);




struct findres res1 = findalldata(&data1, 'z');//找出所有相同的数据
for (int i = 0; i < res1.n; i++)
{
printf("res1 %p,%c\n", *(res1.pp + i), **(res1.pp + i));
}
free(res1.pp);


printfall(&data1);//打印


deletall(&data1, 'z');//删除所有相同的数据
printfall(&data1);//打印


system("pause");
}






0 0
原创粉丝点击