串的定长顺序存储表示是一种类似于线性表的顺序存储结构,用一组地址连续的存储单元存储串值的字符序列。
在实现时主要实现以下功能:
int Length(SString s); //串长
bool StringConcat(SString T, SString s1, SString s2);//用T返回s1和s2连接的串
void PrintString(char T[]); //输出
bool StringAssign(SString T,const char str[]); //生成值为str的串
bool StrCopy(SString T, SString s); //将s拷贝到T
bool StrEmpty(SString T); //判空
int StrCompare(SString T,SString T1); //比较
void ClearString(SString T); //清除
bool SubString(SString T,SString S,int pos,int len); //返回子串
bool StrInsert(SString S,int pos,SString T); //插入
bool StrDelete(SString S,int pos,int len); //删除
但是对于Replace()函数和Index()函数我仍有不懂得地方,故这里不进行编写。
具体的代码如下:
头文件:
#pragma once
#include<iostream>
using namespace std;
#define MAX_STRING_SIZE 8
typedef char SString[MAX_STRING_SIZE+1];
int Length(SString s); //串长
bool StringConcat(SString T, SString s1, SString s2);//用T返回s1和s2连接的串
void PrintString(char T[]); //输出
bool StringAssign(SString T,const char str[]); //生成值为str的串
bool StrCopy(SString T, SString s); //将s拷贝到T
bool StrEmpty(SString T); //判空
int StrCompare(SString T,SString T1); //比较
void ClearString(SString T); //清除
bool SubString(SString T,SString S,int pos,int len); //返回子串
bool StrInsert(SString S,int pos,SString T); //插入
bool StrDelete(SString S,int pos,int len); //删除
函数声明:
#include "String.h"
int Length(SString s)
{
return strlen(s);
}
bool StringConcat(SString T, SString s1, SString s2)
{
int t_length = MAX_STRING_SIZE;
int s1_length = Length(s1);
int s2_length = Length(s2);
if(t_length >= s1_length+s2_length)
{
for(int i=0; i<s1_length; ++i)
{
T[i] = s1[i];
}
for(int j=0; j<s2_length; ++j)
{
T[i+j] = s2[j];
}
T[i+j] = '\0';
return true;
}
else if(t_length>s1_length && t_length<s1_length+s2_length)
{
for(int i=0; i<s1_length; ++i)
{
T[i] = s1[i];
}
for(int j=0; j<t_length-s1_length; ++j)
{
T[i+j] = s2[j];
}
T[i+j] = '\0';
return false;
}
else if(t_length < s1_length)
{
for(int i=0;i<t_length;++i)
{
T[i] = s1[i];
}
T[i] = '\0';
}
return true;
}
void PrintString(char T[])
{
cout<<T<<endl;
}
bool StringAssign(SString T,const char str[])
{
for(int i=0;str[i] != '\0';++i)
{
T[i] = str[i];
}
T[i] = '\0';
return true;
}
bool StrCopy(SString T, SString s)
{
int t_length = MAX_STRING_SIZE;
int s_length = Length(s);
if(s_length <= t_length)
{
for(int i = 0;i < s_length;++i)
{
T[i] = s[i];
}
T[i] = '\0';
}
else
{
for(int i = 0;i < t_length;++i)
{
T[i] = s[i];
}
T[i] = '\0';
}
return true;
}
bool StrEmpty(SString T)
{
if(Length(T) == 0)
{
cout<<"串为空"<<endl;
return true;
}
else
{
cout<<"串不为空"<<endl;
return false;
}
}
int StrCompare(SString T,SString T1)
{
for(int i=0,j=0;i<Length(T),j<Length(T1);++i,++j)
{
if(T[i]-'0' > T1[j]-'0')
{
return 1;
}
else if(T[i]-'0' == T1[j]-'0')
{
return 0;
}
else
{
return -1;
}
}
exit(-1);
}
void ClearString(SString T)
{
T[0] = '\0';
}
bool SubString(SString T,SString S,int pos,int len)
{
if(pos > Length(S) || pos < 1 || len < 0 )
{
return false;
}
else if(len > Length(S)-pos+1)
{
cout<<"无法返回,返回原始字符串:";
for(int i=pos-1;i<Length(S);++i)
{
T[i] = S[i];
}
T[i]='\0';
}
else
{
for(int i=pos-1;i<pos+len-1;++i)
{
T[i] = S[i];
}
T[i]='\0';
}
return true;
}
bool StrInsert(SString S,int pos,SString T)
{
if(pos < 1 || pos > Length(S)+1)
{
return false;
}
else
{
for(int i = Length(S);i>=pos-1;--i)
{
S[i+Length(T)] = S[i];
}
for(i = 0;i < Length(T);++i)
{
S[pos+i-1] = T[i];
}
}
return true;
}
bool StrDelete(SString S,int pos,int len)
{
if(pos < 0 || pos > Length(S)|| len < 0)
{
return false;
}
else if(pos > Length(S)-len+1)
{
S[pos-1] = '\0';
}
else
{
for(int i = pos+len;i <= Length(S)-1;++i)
{
S[i-len] = S[i];
}
S[Length(S)-len] = '\0';
}
return true;
}
测试文件:
#include"String.h"
void main()
{
SString T;
char str[] = "bit";
SString s1 = "hello";
SString s2 = "world";
StrInsert(s1,2,s2);
PrintString(s1);
SubString(T,s1,1,6);
PrintString(T);
StringConcat(T,s1,s2);
PrintString(T);
StrCopy(T,s1);
PrintString(T);
StringAssign(T,str);
PrintString(T);
StrDelete(s2,1,1);
PrintString(s2);
StrEmpty(T);
if(StringAssign(s1,s2)==1)
{
cout<<"前串大于后串"<<endl;
}
else if(StringAssign(s1,s2)==0)
{
cout<<"前串等于后串"<<endl;
}
else
{
cout<<"前串小于后串"<<endl;
}
ClearString(T);
StrEmpty(T);
}
源码来自 算法:
http://www.eyesourcecode.com/forum-algorithm-1.html
希望大家能够指出我的不足,谢谢~我会努力改进的。
分享到:
相关推荐
串的基本操作定长顺序存储表示:初始化串、复制串、判断串是否为空、比较两个字符串、计算字符串长度、清空串、连接串、找子串、模式匹配、替换子串、插入和删除子串
掌握串的基本处理操作和几种不同的存储结构(定长顺序存储表示、堆分配存储表示和块链存储表示)。 二、 实验要求 1、 实现串赋值、串比较、求串长、串联接以及求子串这5种基本操作。 2、 能利用上述实现的基本操作...
数据结构-基本算法-串定长顺序存储(学生时代源码,调试可运行)
熟练掌握串的定长顺序存储表示方法。 2. 利用串的基本操作实现相关算法。 二、实践内容: 1. 实现串的定长顺序存储表示的基本操作。并用主程序进行多次验证。 2. 设s='abcdefghijk'、t='cde'为两个字符串,利用定长...
用定长顺序存储结构表示串: (1) 建立两个文本文件,分别存储串str1“hellohisgoodl”和串str“hellogdygoodl” (2) 输出两个串的最长公共子串“hello”和“goodl”; (3) 分析算法时间复杂度。
数据结构课本上的关于串的那一章,有时写作业用的啊
1、 实现串赋值、串比较、求串长、串联接以及求子串这5种基本操作。 2、 能利用上述实现的基本操作完成置换Replace (&S, T, V)以及从串中删除一段子串StrDelete(&S,pos,len)的操作。 3、 以上要求实现的操作不能直接...
串的基本操作堆存储表示:初始化串、复制串、判断串是否为空、比较两个字符串、计算字符串长度、清空串、连接串、找子串、模式匹配、替换子串、插入和删除子串
熟悉串的七种基本操作的定义,并能利用这些基本操作实现串的其他各种操作的方法;熟悉掌握在串的定长顺序存储结构上实现串操作的方法 本程序可以在98/2000/XP下运行,可以用VC++6.0执行
串采用定长顺序存储结构(由c4-1.h定义)的基本操作(13个),包括算法4.2,4.3,4.5 实现效果图: #include #include #include // SString是数组,故不需引用类型 #define OK 1 #define TRUE 1 #define FALSE 0 ...
Delphi源码实例演示堆分配与栈分配的不同..rar
串及其基本运算 串的定长顺序存储及操作 串的堆存储结构
通过串的堆分配存储结构来实现串的以下功能: //生成一个值等于串常量chars的串string int StrAssign(HString *str,char *chars); //返回串string的长度 int StrLength(HString str); //比较两个串的大小,如果str...
实验三 串基本操作的实现 定长顺序串的存储结构及基本操作的定义; 定长顺序串的基本操作; 设计实验数据验证程序。
C语言线性表顺序存储结构实例详解 1、 什么是顺序存储结构? 用一段地址连续的存储单元依次存储线性表的数据元素。 2、线性表的顺序存储结构 #include #include #define Max 80 //存储空间初始分配量 #define ...
采用定长顺序存储结构的串,编写算法计算一个子串在一个字符串中出现的次数,如果该子串不出现则为0。
基于定长顺序存储结构实现对串的赋值、串比较、求子串的位置、串替换等操作。要求所有操作均以函数的形式实现,在主函数中调用各个函数实现整体功能。 注意:每一个字符串的第一个元素存放的是该字符串的长度(不...
4.10③ 编写对串求逆的递推算法。 4.12③ 编写一个实现串的置换操作Replace(&S,T,V)的算法。 4.13③ 编写算法,从串s中删除所有和串t...要求采用教科书4.2.1节中所定义的定长顺序存储表示, 但不允许调用串的基本操作。
1. 一棵二叉树的顺序存储情况如下: 树中,度为2的结点数为( )。 A.1 B.2 C.3 D.4 2. 一棵“完全二叉树”结点数为25,高度为( )。 A.4 B.5 C.6 D.不确定 3.下列说法中,( )是正确的。 A. 二叉树就是...
1、采用堆分配存储建立一个串,并实现串的赋值、比较、联结、求子串、求串的长度、串复制等基本操作。 2、串的模式匹配