十、串

串是由零个或多个字符组成的有限序列(即把线性表中的元素限制为字符型),两个串相等当且仅当这两个串的长度相等并且各对应位置上的字符都相同,一个串中任意个连续字符组成的序列称为该串的子串

串采用顺序存储结构存储时称为顺序串(SqString)。顺序串的存储方式有两种:一种是每个字只存一个字符,称为非紧缩格式(其存储密度小);另一种是每个字存放多个字符,称为紧缩格式

串采用链式存储结构存储时称为链串(LinkStrNode),通常将链串中每个结点所存储的字符个数称为结点大小

  • 定长存储结构

数据结构(知识点碎片八)_字符变量

maxSize为已经定义的常量,表示串的最大长度;str数组长度定义为maxSize+1,是因为多出一个'\0’作为结束标记。


  • 变长存储结构(更常用)

数据结构(知识点碎片八)_字符变量_02

Str s;
s.length = L;
S.ch =(char*)malloc((L+1)*sizeof(char)); 
s.ch[length范围内的位置]= 某字符变量;
某字符变量 = s.ch[length范围内的位置];
free(S.ch);

 (一)、串的基本操作

  • 赋值操作
int strAssign(Str& str, char* ch)
{
if(str.ch)
free(str.ch); 
int len=0; 
char *c=ch; 
while(*c)
{
++len;
++c;
}
if(len==0)
{
str.ch=NULL; 
str.length=0; 
return 1;
}
else
{
str.ch=(char*) malloc(sizeof(char) * (len+1));//这里加1是为结束标记多申请一个存储空间
if(str.ch==NULL)
return 0; 
else
{
c=ch;
for(int i=0;i<=len;++i,++c)
str.ch[i]=*c;  //c每来到一个新的字符,就取它所指字符的值,然后赋值给当前i所指的位置上
str.length=len; 
return l;
}
}
}

数据结构(知识点碎片八)_串_03

  • 取串长度
int strLength(Str str)
{
    return str.length;
}

数据结构(知识点碎片八)_存储结构_04

  • 串比较(可用于英语单词排序)

设两串C1和C2中的待比较字符分别为a和b:

  1. 如果a的ASCII码小于b的ASCII码,则返回C1小于C2标记(一个负数);
  2. 如果a的ASCII码大于b的ASCII码,则返回C1大于C2标记(一个正数);
  3. 如果a的ASCII码等于b的ASCII码,则按照之前的规则继续比较两串中下一对字符;
  4. 经过上述步骤没有比较出C1和C2大小的情况下,先结束的串为较小串,两串同时结束则返回两串相等标记(0)
int strCompare(Str s1,Str s2)
{
    for(int i=0;i<s1.length && i<s2.length;++i)
        if (sl.ch[i]!=s2.ch[i])
            return sl.ch[i] - s2.ch[i]; //用ASCII码做的减法
    return s1.length - s2.length;
}

数据结构(知识点碎片八)_存储结构_05

  • 求子串
int subString(Str& substr, Str str, int pos, int len)
{
if(pos<0||pos>=str.length||len<0||len>str.length-pos)
return 0; 
if(substr.ch)
{
free(substr.ch); 
substr.ch=NULL;
}
if(len==0)
{
substr.ch=NULL; 
substr.length=0; 
return l;
}
else
{
substr.ch=(char*) malloc(sizeof(char)*(len+1)); 
int i=pos; 
int j=0;
while(i<pos+len)
{
substr.ch[j]=str.ch[i];
++i;
++j;
}
substr.ch[j]= '\0'; 
substr.length=len; 
return 1;
}
}

数据结构(知识点碎片八)_赋值_06

  • 串清空
int clearString(Str& str)
{
if(str.ch)
{
free(str.ch); 
str.ch=NULL;
}
str.length=0; 
return 1;
}

数据结构(知识点碎片八)_串_07

  • 串连接
int concat(Str& str, str strl,str str2)	
{
if(str.ch)
{
free(str.ch); 
str.ch=NULL;
}
str.ch=(char* )malloc (sizeof (char)* (str1.length+str2.length+1)); 
if(!str.ch) //存储空间分配失败返回0
return 0; 
int i=0;
while(i<str1.length)
{
str.ch[i]=str1.ch[i];
++i;
}
int j=0;
while(j<=str2.length)
{
str.ch[i+j]=str2.ch[j];
++j;
}
str.length=str1.length+str2.length; 
return 1;
}

数据结构(知识点碎片八)_字符变量_08