字符数组封装实现添加,删除,插入,修改,搜索,打印
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");
}
*文件名:字符数组.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");
}
相关文章推荐
- 封装一个字符数组,实现增加,删除,替换,打印,搜索等功能
- python 实现数组list 添加、修改、删除的方法
- PowerShell中使用ArrayList实现数组插入、删除、添加例子
- JavaScript数组,JSON对象实现动态添加、修改、删除功能示例
- 数组的链表实现:创建(头插/尾插)、打印、删除、插入
- 用Nhibernate怎么实现数据的添加、删除、修改简单程序
- 地磅称量系统之(40) 实现称量管理界面上的添加、修改、删除、保存、取消按钮的代码
- C#写的对系统用户和组操作的类(可以实现用户和组的添加、删除、修改)
- 用Nhibernate怎么实现数据的添加、删除、修改简单程序
- 一个实现添加、修改、删除记录的类
- 一个实现添加、修改、删除记录的类
- .Net/C# 封装磁盘目录文件搜索功能的工具类 (实现了与搜索相关的事件,以便插入客户处理代码)
- 数组 算法没有插入删除,只有存取和修改
- VB数据库编程实现添加、查询、修改、删除
- 稳扎稳打Silverlight(58) - 4.0通信之WCF RIA Services: 通过 Domain Service, 以 MVVM 模式实现数据的添加、删除、修改和查询
- 利用ErlyDB、Mysql来实现表的添加、删除、修改、查询操作
- 用Nhibernate怎么实现数据的添加、删除、修改简单程序
- 这是一个关于XML文档的操作管理器XMLHelper类,类中包括XML文档的创建,文档节点和属性的读取,添加,修改,删除的方法功能的实现
- 地磅称量系统之(53)在封装对象的类库中实现包括IDataErrorInfo接口提供的所有方法和并且扩展对异常具有添加和删除功能的基本业务对象基类
- 用datagrid 的 Footer实现 添加修改和删除功能