线性表--定长顺序串(十四)

时间:2022-07-28
本文章向大家介绍线性表--定长顺序串(十四),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

1.串的基本概念

串,也就是字符串,是由零个字符或多个字符组成的有限序列。记为S=‘a1 a2 a3…an’(n>=0),其中,S是串的名字,用单引号括起来的字符序列是串的值,每一个a都可以是字母,数字或其他字符,n是串中字符的个数,称为串的长度,n=0时的串成为空串。

需要特别指出的是,串值必须使用一对单引号括起来(C语言的串是用双引号括起来的),但引号是界限符,他不属于串,只是作为一个标志,避免和其他变量相互混淆。

子串:串中任意个连续的字符组成的子序列称为该串的子串。 主串:包含子串的串称为主串,可以理解为高中学的集合,子串是主串的子集。

子串在主串中的位置:通常将字符在串中的序号称为该字符串在串中的位置,子串在主串中的位置则以子串的第一个字符在主串中的位置来表示。

例如:串A=‘huagoufdog2506897252’ , 串B=‘huagou’ , 串C=‘fdog’ A的长度是20,B是6,C是4,而B在A的位置是1,C在A的位置是7。

串相等:当且仅当两个串的值相等时,才称这两个串相等,即只有两个的数值相等,且对应位置的字符都相等。

空串和空格串的的区别是空格串由一个或者多个空格,而空串是无任何字符。

2.定长顺序串概念

定长顺序串是将串设计成一种静态结构类型,串的存储分配是在编译时完成的。与前面所讲的线性表顺序存储结构类似,可用一组地址连续存储单元来存储串的字符序列。

3.图示过程

4.代码实现

(1)定长顺序串类型定义

#define MAXSIZE 50
typedef struct
{
   char ch[MAXSIZE];
   int len;
}String

(2)定长顺序串插入

int StrInsert(String * S, int pos, String t)
{
 //在串S中下标为pos的字符之前插入串
 int i;
 if (pos<0 || pos>S->len)return 0;//插入位置不合法
 if (S->len + t.len <= MAXSIZE)  //插入后串长<=MAXSIZE
 {
  for (i = S->len + t.len - 1; i >= t.len + pos; i--)
  {
   S->ch[i] = S->ch[i - t.len];
  }
  for (i = 0; i < t.len; i++)
  {
   S->ch[i + pos] = t.ch[i];
  }
  S->len = S->len + t.len;
 }
 else if (pos + t.len <= MAXSIZE)//插入后串长>MAXSIZE 但串t的字符序列可以全部插入
 {
  for (i = MAXSIZE - 1; i > t.len + pos - 1; i--)
  {
   S->ch[i] = S->ch[i - t.len];
  }
  for (i = 0; i < t.len; i++)
  {
   S->ch[i + pos] = t.ch[i];
  }
  S->len = MAXSIZE;
 }
 else//插入后串长>MAXSIZE,并且串t的部分字符也要舍弃
 {
  for (i = 0; i < MAXSIZE - pos; i++)
  {
  S->ch[i+pos]=t.ch[i];
   S->len = MAXSIZE;
  }
 }
 return 0;
}

(3)定长顺序串删除

int StrDelete(String * S, int pos, int len)
{
//在串S中删除从下标pos起len个字符
 int i;
 if (pos<0 || pos>(S->len - len)) return 0;//删除参数不合法
 for (i = pos + len; i < S->len; i++)
 {
  S->ch[i - len] = S->ch[i];
  //从pos+len开始至串尾依次向前移动,实现删除len个字符
 }
 S->len = S->len - len;//S串长减len
 return 0;
}

(4)定长顺序串比较

int StrCompare(String S, String t)
{
 //若串S和t相等则返回0;若S>t则返回正数,若S<t则返回负数
 int i;
 for (i = 0; i < S.len&&i < t.len; i++)
 {
  if (S.ch[i] != t.ch[i])return(S.ch[i] - t.ch[i]);
 }
  return S.len - t.len;
}