线性表--定长顺序串(十四)
时间: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;
}
- 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 数组属性和方法
- android 功耗(1)---android 功耗分析方法和优化
- 为什么要写 tf.Graph().as_default()
- tf.get_variable_scope().reuse_variables() 的使用
- Tensorflow小技巧整理:
- Tensorflow学习笔记——Summary用法
- 神经网络优化(损失函数:自定义损失函数、交叉熵、softmax())
- C++ STL stack 用法
- 遍历string时 使用for(char& c : s) for(char c : s) 的区别
- vc dll静态函数导出
- 利用GDB调试 MSQL
- 手把手教学-MySQL主从复制架构转换MGR架构(mysq_shell版)
- 手把手教学-MySQL主从复制架构转换MGR架构(手动版)
- 云数据库VS自建数据库,到底该如何抉择?
- 组复制常规操作-事务一致性保证 | 全方位认识 MySQL 8.0 Group Replication
- 面试题-算法:二叉树的前序遍历