线性表--堆串(十五)
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;
}
- 为自己定价:做个自由职业者
- CTF| SQL注入之获取数据类
- 200行,写个2048游戏
- 您有一份CTF代码审计文件等待查收
- 颠覆者的游戏:程序语言
- CTF| SQL注入之login界面
- 懒惰的力量
- 让AI自动修复程序中的bug:微软亚洲研究院新研究 | 附论文
- OpenDaylight与Mininet应用实战之OpenFlow1.0协议分析二
- Javascript: 世纪机器语言?
- OpenDaylight与Mininet应用实战之基本环境搭建一
- 永恒不变的魅力
- MobileNet教程(2):用TensorFlow搭建安卓手机上的图像分类App
- OpenDaylight与Mininet应用实战之流表操作三
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- SpringMVC中用于绑定请求数据的注解以及配置视图解析器
- @RequestMapping与@RequestParam注解
- SpringMVC简介与工程配置
- KVM管理虚拟机
- fpga实现YCbCr444转RGB
- UML类图自动生成,太爽了
- Python爬虫之mongodb介绍和安装
- 一句话说清楚 CountDownLatch 和 CyclicBarrier 的区别
- Android 功耗(8)---如何找到阻止进入deep idle SODI的元凶
- 【技术创作101训练营】三种不同场景下 vue 组件动态加载的方法及实现
- leetcode链表之回文链表
- 如何理解 Go 中的反射
- Synchronized深入分析
- Spring的一些零碎知识点整理
- CentOS7上安装并配置KVM,以及通过KVM安装CentOS系统