①串类型的定义
串的定义相对于栈和队列就简单了许多,在c语言中本身就存在有许多操作字符串的函数,其对应的函数库是string.h。下面给出串的发展背景以加深读者印象。(不是重点,已经有一些了解的可以跳过)
计算机上的非数值处理的对象基本上是字符串数据。在较早的程序设计语言中,字
符串是作为输人和输出的常量出现的。随着语言加工程序的发展,产生了字符串处理。
这样,字符串也就作为一种变量类型出现在越来越多的程序设计语言中,同时也产生了一
系列字符串的操作。字符串一般简称为串。在汇编和语言的编译程序中,源程序和目标.
程序都是字符串数据。在事务处理程序中,顾客的姓名和地址以及货物的名称、产地和规
格等一般也是作为字符串处理的。又如信息检索系统、文字编辑程序、问答系统、自然语
言翻译系统以及音乐分析程序等,都是以字符串数据作为处理对象的。
然而,现今我们使用的计算机的硬件结构主要是反映数值计算的需要的,因此,在处
理字符串数据时比处理整数和浮点数要复杂得多。而且,在不同类型的应用中,所处理的
字符串具有不同的特点,要有效地实现字符串的处理,就必须根据具体情况使用合适的存
储结构。这一章,我们将讨论–些基本的串处理操作和几种不同的存储结构。
对于串的描述,课本上是这样定义的。虽然简单,但读者应仔细阅读。
②串的表示和实现
对于串来说,对于字符数组的操作,大家大部分可以采用c语言函数库中的函数来完成。下面在串的基础下,和结构体结合,不适用string.h函数库的内置函数,笔者对堆分配的操作算法进行了实现,供大家参考学习使用。在下面课本的截图中伪代码已经对函数的实现过程有了很详细的解释,后面就不再赘述。
再对于对于后面关于串的模式匹配算法和优化算法,读者有兴趣的可以自行阅读学习。下面是上述算法的运行截图:
终于到代码啦
#include<stdio.h>
#include<malloc.h>
#define LEN sizeof(struct string)
struct string{
char *ch;
int length;
};
int main()
{
char s1[5]="123",s2[5]="456";
struct string *string1,*string2,*string3,*string4;
struct string *StrAssign(char *chars); // 生成一个其值等于串常量的串str
int StrLength(struct string *str); // 返回str元素的个数,称为串的长度
int StrCompare(struct string *str1,struct string *str2); // 若str1大于str2,返回值>0;若str1大于str2,返回值<0;若相等,返回值=0
void ClearString(struct string *str); // 将str清为空串
struct string *Concat(struct string *str1,struct string *str2); // 将str1和str2合成新串
void SubString(struct string *str,struct string *str2,int pos,int len); // 用sub返回串str中第pos个字符起长度为len的字串
// 测试
string1 = StrAssign(s1); // 初始化string1,string2,并将其ch的值分别赋为s1和s2
string2 = StrAssign(s2);
string4 = StrAssign(s1); // 给string4的ch赋上初值
printf("%s\n",string1->ch); // 输出string1的ch字符串
printf("%d\n",StrCompare(string1,string2)); // 比较string1和string2的ch字符串的大小
string3 = Concat(string1,string2); // 连接string1和string2
printf("%s\n",string3->ch);
SubString(string3,string4,1,2); // 测试SubString函数
printf("%s\n",string4->ch);
ClearString(string1); // 将string1清为空串
return 0;
}
struct string *StrAssign(char *chars)
{
// 生成一个其值等于串常量的串str
struct string *str;
str = (struct string*)malloc(LEN);
int i;
for(i = 0;chars[i] != '\0';i++);
str->length = i;
str->ch = chars;
return str;
}
int StrLength(struct string *str)
{
// 返回str元素的个数,称为串的长度
return str->length;
}
int StrCompare(struct string *str1,struct string *str2)
{
// 若str1大于str2,返回值>0;若str1大于str2,返回值<0;若相等,返回值=0
int i;
for(i = 0;i < StrLength(str1) && i < StrLength(str2);i++){
if(str1->ch[i] != str2->ch[i]){
return str1->ch[i] - str2->ch[i];
}
}
return str1->ch[i] - str2->ch[i];
}
void ClearString(struct string *str)
{
// 将str清为空串
str->ch = "";
str->length = 0;
printf("clear over!\n");
}
struct string *Concat(struct string *str1,struct string *str2)
{
// 将str1和str2合成新串
struct string *str3;
int i,j;
str3 = (struct string*)malloc(LEN);
str3->ch = str1->ch;
str3->length = str1->length + str2->length;
for(i = str1->length,j = 0;j < str2->length;i++,j++){
str3->ch[i] = str2->ch[j];
}
str3->ch[i] = '\0';
return str3;
}
void SubString(struct string *str,struct string *str2,int pos,int len)
{
// 用sub返回串str中第pos个字符起长度为len的字串
int i,j;
for(i = pos,j = 0;i < pos + len;i++,j++){
str2->ch[j] = str->ch[i];
}
str2->ch[j] = '\0';
str2->length = len;
}