您的位置:首页 > 其它

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

2015-03-11 21:54 567 查看
/*********************************************************

*文件名:字符数组.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");

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐