目录
一、串概述
串:是由零个或多个字符组成的有限序列;包含字符的个数称串的长度;
空串:长度为零的串称空串; 空白串:由一个或多个空格组成的串称空白串;
子串:串中任意个连续字符组成的子序列称该串的子串; 主串:包含子串的串称主串;
子串的首字符在主串中首次出现的位置定义为子串在主串中的位置;
空串是任意串的子串; 任意串是自身的子串;
串常量在程序中只能引用但不能改变其值; 串变量取值可以改变;
二、串的基本运算
1) int strlen(char *s);求串长。
2) char *strcpy(char * to,char * from);串复制。
3) char *strcat(char * to,char * from);串联接。
4) int strcmp(char *s1,char *s2);串比较。
5) char *strchr(char *s,char c);字符定位。
三、串的存储结构
串的顺序存储:串的顺序存储结构称顺序串。按存储分配不同分为:
3.1 静态存储分配的顺序串
直接用定长的字符数组定义,以“\0”表示串值终结。
#define maxstrsize 256
typedef char seqstring[maxstrsize];
seqstring s;
不设终结符,用串长表示。
Typedef struct{
Char ch[maxstrsize];
Int length;
}seqstring;
以上方式的缺点是:串值空间大小是静态的,难以适应插入、链接等操作。
3.2 动态存储分配的顺序串
简单定义:typedef char * string;
复杂定义:typedef struct{
char *ch;
int length;
}hstring;
3.3 串的链式存储
串的链式存储结构称链串。链串由头指针唯一确定。类型定义:
typedef struct node{
char data;
struct node *next;
}linkstrnode;
typedef linkstrnode *linkstring;
linkstring s;
将结点数据域存放的字符个数定义为结点的大小。结点大小不为1的链串类型定义:
Int naivestrmatch(seqstring t,seqstring p)
{
int i,j,k;
int m=p.length;
int n=t.length;
for(i=0;i<=n-m;i++){
j=0;k=i;
while(j<m&&t.ch[k]==p.ch[j]){
j++;k++;
}
if (j==m) return i;
}
return –1;
}
四、串运算的实现
4.1 顺序串上的子串定位运算
1)子串定位运算又称串的模式匹配或串匹配。主串称目标串;子串称模式串。
2)朴素的串匹配算法。时间复杂度为O(n^2)。比较的字符总次数为(n-m+1)m。
Int naivestrmatch(seqstring t,seqstring p)
{
int i,j,k;
int m=p.length;
int n=t.length;
for(i=0;i<=n-m;i++){
j=0;k=i;
while(j<m&&t.ch[k]==p.ch[j]){
j++;k++;
}
if (j==m) return i;
}
return –1;
}
4.2 链串上的子串定位运算
时间复杂度为O(n^2)。比较的字符总次数为(n-m+1)m。
Linkstrnode * lilnkstrmatch(linkstring T, linkstring P)
{
linkstrnode *shift, *t, *p;
shift=T;
t=shift;p=P;
while(t&&p){
if(t->data==p->data){
t=t->next;
p=p->next;
}
else{
shift=shift->next;
t=shift;
p=P;
}
}
if(p==NULL)
return shift;
else
return NULL;
}