数据结构--串--定长顺序存储的基本操作

:即字符串,是由零个或多个字符组成的有限序列,是数据元素为单个字符的特殊线性表。
若干术语

  • 串长:串中字符个数(n>=0),n=0时为空串;
  • 空白串:由一个或多个空格符组成的串;
  • 字符位置:字符在串中的序号;
  • 串相等:串的长度和对应位置上的字符都相等;
  • 子串:串中任意个连续的字符组成的子序列;
  • 主串:包含子串的串;
  • 子串的位置:子串的第一个字符在主串中的序号。
    串的最小操作子集
  • 串赋值:Str_Assign
  • 串比较:Str_Compare
  • 求串长:Str_Length
  • 串连接:Str_Concat
  • 求子串:Str_Substring
    具体实现代码:
//C++头文件与宏定义
#include<iostream>
#include<cstdlib>
#include<cstring>
using namespace std;
#define MAXSIZE 255
//为串赋值
void Str_Assign(SString &S,char chars[]){
	int Slength = 0;  //用int型变量Slength记录串的长度 
	int i = 0,j = 1,k = 0;
	while (chars[i] != '\0')  //计算待赋值串的长度
	{
		Slength++;     
		i++;
	}
	if(Slength == 0){
		S[0] = 0;  //待赋值串的长度为0,串的长度也为0 
	}
	else{
		if(Slength > MAXSIZE){  //待赋值串的长度大于最大定长,发生截断 
			while(j <= MAXSIZE){
				S[j++] = chars[k++];  //串元素下标从1开始计 
			}
			S[0] = MAXSIZE;
			cout<<"为串赋值成功!" << endl; 
			cout << "待赋值串的长度" << Slength <<"大于定长顺序串的最大长度" << MAXSIZE <<"发生截断!" << endl;
		}
		else{
			while(j <= Slength){  //待赋值串的长度小于等于最大定长,不会发生截断 
				S[j++] = chars[k++];
			}
			S[0] = Slength;
			cout << "为串赋值成功!" << endl;
			
		}
	} 
}
//清空串
void Str_Clear(SString &S){
	if(Str_Length(S) == 0){
		cout << "当前串为空,无需清空!" << endl; 
	}
	else{
		S[0] = 0;
		cout << "串清空完成!" << endl;
	}
}
//得到顺序串的长度
int Str_Length(SString &S){
	return S[0];
} 
//两个顺序串的大小比较
int Str_Compare(SString &S, SString &T){
	for(int i = 1;(i <= S[0]) && (i <= T[0]);i++){
		if(S[i] != T[i]){
			return S[i] - T[i];
		}
		else
			return S[0] - T[0];
	}
} 
//连接两个顺序串                 
void Str_Concat(SString &T, SString &S1, SString &S2){
	T[0] = 0;  //T为空串,用于记录两个串的连接结果 
	if(S1[0] + S1[0] <= MAXSIZE){
		//两个串总元素个数和不超过最大定长,不发生截断,此时T长度为两个串的总长度 
		for(int i = 1;i <= S1[0];i++){
			T[i] = S1[i];
		}
		for(int i = S1[0] + 1,j = 1;j <= S2[0];i++,j++){
			T[i] = S2[j];
		}
		T[0] = S1[0] + S2[0];
		cout << "未发生截断,连接成功!" << endl;
	}
	else if((S1[0] < MAXSIZE) && (S1[0] + S2[0] > MAXSIZE)){
		//S1长度小于最大定长,但S1和S2总长度大于最大定长,连接时会发生截断,此时T长度为最大定长 
		for(int i = 1;i <= S1[0];i++){
			T[i] = S1[i];
		}
		for(int i = S1[0],j = 0;i <= MAXSIZE;i++,j++){
			T[i] = S2[j];
		}
		T[0] = MAXSIZE;
		cout << "S2发生截断,未连接成功!" << endl;
	}
	else if(S1[0] == MAXSIZE){
		//S1的长度就是最大定长,S2连接不上,此时T长度同S1为最大定长 
		for(int i = 1;i <= MAXSIZE;i++){
			T[i] = S1[i];
		}
		T[0] = S1[0] = MAXSIZE;
		cout << "S2未连接上,未连接成功!" << endl;
	}
}
//得到子串
/*用Sub返回串s中第pos个字符起长度为len的子串*/
void Str_Substring(SString &Sub, SString &S, int pos, int len){
	if ((pos < 1) || (pos > S[0]) || (len < 0) || (len > (S[0] - pos + 1)))
		cout << "参数输入错误,请再次输入!";
	for (int i = 1; i <= len; i++){
		Sub[i] = S[pos + i - 1];
	}
	Sub[0] = len;
} 
//插入,在串S的第pos个字符之前插入串T
void Str_Insert(SString &S, SString &T, int pos){
	if ((S[0] + T[0]) <= MAXSIZE)
	{
		int j = 0;
		for (int i = (S[0]+T[0]); i >= pos; i--) //将主串从后往前移动,腾出子串的位置
		{   
			S[i] = S[S[0] - j];
			j++;
		}
		j = 1;
		for (int i = pos; i < (pos + T[0]); i++)  //将子串插入到pos位置起的部分
		{
			S[i] = T[j];
			j++;
		}
		S[0] = S[0] + T[0];
		cout << "在串S的第" << pos << "个字符之前插入串T成功!" ;
	}

}
//删除,从串S中删除第pos个字符起长度为len的子串
void Str_Delete(SString &S, int pos,int len){
	for (int i = pos; i < (S[0] - pos + 1); i++){
		S[i] = S[i+len];
	}
	S[0] = S[0] - len;
} 
//串的输出
void Str_Output(SString &S){
	int i = 1;
	while(i <= S[0]){  //通过下标依次输出串中的元素 
		cout << S[i] <<"  ";
		i++;
	}
} 

运行截图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 5
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值