线性表--堆串(十五)

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

1.串的概念

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.代码实现

(1)定义堆串

typedef struct
{
 char * ch;
 int len;
}HString;

(2)插入函数

int StrInsert(HString * s, int pos, HString * t)
{
 int i;
 char * temp;
 if (pos<0 || pos>s->len || s->len == 0)return 0;
 temp = (char *)malloc(sizeof(s->len + t->len));
 if (temp == NULL)return 0;
 for (i = 0; i < pos; i++)temp[i] = s->ch[i];
 for (i = 0; i < t->len; i++)temp[i + pos] = t->ch[i];
 for (i = pos; i < s->len; i++)temp[i + t->len] = s->ch[i];
 s->len += t->len;
 free(s->ch);
 s->ch = temp;
 return 0;
}

(3)赋值函数

int StrAssign(HString * s, char * tval)
{
 //将字符串常量tval的值赋给堆串
 int len, i = 0;
 if (s->ch != NULL)free(s->ch);
 while (tval[i] != '')i++;
 len = i;
 if (len)
 {
  s->ch = (char *)malloc(sizeof(len));
  if (s->ch == NULL)return 0;
  for (i = 0; i < len; i++)
  {
   s->ch[i] = tval[i];
  }
 }
 else
 {
  s->ch = NULL;
  s->len = len;
 }
 return 0;
}