封装一个字符数组,实现增加,删除,替换,打印,搜索等功能

来源:互联网 发布:电梯编程视频教程 编辑:程序博客网 时间:2024/05/17 07:44

字符数组.h


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


struct CharArry
{
char *p;
int len;
int reallen;
int SortState;//0无序  1从a到z   2从z到a


};


void InitArry(struct CharArry *data);//初始化数组
void AddItem(struct CharArry *data, char item);//添加数据
void PrintArry(struct CharArry *data);//打印数组
char *SearchItem(struct CharArry *data, char item);//搜索
void DeleteItem(struct CharArry *data, char item);//删除一个元素
void ExchangeItem(struct CharArry *data, char olditem, char newitem);//替换数据
void DeleteSameItem(struct CharArry *data, char item);//删除所有相同的item
char* FindItem(struct CharArry *data, char item);//查询数组里的第一个item


字符数组库.c


#include "字符数组.h"
void InitArry(struct CharArry *data)
{
data->p =NULL;
data->len = 0;
data->reallen = 0;
data->SortState = 0;//无序
}


void AddItem(struct CharArry *data, char item)
{
if (data->p == NULL)
{
data->p = (char *)malloc(1);
data->len += 1;
data->reallen += 1;
data->p[data->len - 1] = item;
return;
}


if (data->len == data->reallen)
{
data->p = (char *)realloc(data->p, (data->len + 1)*sizeof(char));
data->len += 1;
data->reallen += 1;
data->p[data->len - 1] = item;


}


else
{
data->len += 1;
data->p[data->len - 1] = item;
}


}


void PrintArry(struct CharArry *data)
{
if (data->p == NULL)
{
printf("空数组,无需打印");
return;
}


for (int i = 0; i < data->len; i++)
{
printf("%c\t", data->p[i]);
}


}


char* FindItem(struct CharArry *data, char item)
{


if (data->p == NULL)
{
printf("没有数据,无需搜索");
return NULL;
}




for (int i = 0; i < data->len; i++)
{
if (data->p[i] == item)
{
return data->p + i;
}
}
return NULL;


}
char *SearchItem(struct CharArry *data, char item)
{
if (data->p == NULL)
{
printf("没有数据,无需搜索");
return NULL;
}


if (data->SortState == 0)
{
for (int i = 0; i < data->len; i++)
{
if (data->p[i] == item)
{
return data->p + i;
}
}
}


if (data->SortState == 1)
{
int low, high;
low = 0;
high = data->len - 1;
while (low <= high)
{
int mid;
if (data->p[low] ==data->p[high])
mid = low;
else
{
mid = (low + high) / 2;
}
if (data->p[mid] == item)
return data->p + mid;
else if (data->p[mid] > item)
{
high = mid - 1;
}


else if (data->p[mid] > item)
{
low = mid + 1;
}
}
return NULL;


}


if (data->SortState == 2)
{
int low, high;
low = 0;
high = data->len - 1;
while (low <= high)
{
int mid;
if (data->p[low] == data->p[high])
{
mid = low;
if (data->p[mid] == item)
return data->p + mid;
}

else
{
mid = (low + high) / 2;
}
if (data->p[mid] == item)
return data->p + mid;
else if (data->p[mid] > item)
{
low = mid + 1;
}


else if (data->p[mid] > item)
{
high = mid - 1;


}
}
return NULL;


}







}


void DeleteItem(struct CharArry *data, char item)
{
if (data->p == NULL)
{
printf("没有数据,无需删除");
return;
}


char *pt = SearchItem(data, item);
if (pt == NULL)
{
printf("没有找到,无需删除");
}


else
{
int curr = pt - data->p;
for (int i = curr; i < data->len - 1; i++)
{
data->p[i] = data->p[i + 1];
}
data->len -= 1;

}

}


void ExchangeItem(struct CharArry *data, char olditem, char newitem)
{
char *pt = SearchItem(data, olditem);


if (pt == NULL)
{
printf("没有找到要替换的数据");
return;
}


*pt = newitem;


}




void DeleteSameItem(struct CharArry *data, char item)
{
char *pt = FindItem(data, item);


if (pt == NULL)
{
printf("没有找到要替换的数据");
return;
}


for (pt = FindItem(data, item); pt != NULL; pt = FindItem(data, item))
{
int curr = pt - data->p;
for (int i = curr; i < data->len - 1; i++)
{
data->p[i] = data->p[i + 1];
}
data->len -= 1;


}

}




main.c


#include<stdio.h>
#include<stdlib.h>
#include "字符数组.h"
void main()
{
struct CharArry mydata;
InitArry(&mydata);
char ch;
for (ch = 'a'; ch <= 'z'; ch++)
{
AddItem(&mydata, ch);
}
PrintArry(&mydata);
DeleteItem(&mydata, 'f');
printf("\n删除之后\n");
PrintArry(&mydata);
ExchangeItem(&mydata, 'a', 'k');
printf("\n替换之后\n");
PrintArry(&mydata);
ExchangeItem(&mydata, 'd', 'k');
ExchangeItem(&mydata, 'o', 'k');
printf("\n\n");
PrintArry(&mydata);
printf("\n删掉k之后\n");
DeleteSameItem(&mydata, 'k');
printf("\n\n");
PrintArry(&mydata);



getchar();
}

0 0