您的位置:首页 > 理论基础 > 数据结构算法

数据结构 串的定长顺序存储

2016-10-22 17:31 567 查看
#include<stdio.h>
#include<stdlib.h>
#include<string>
#include<iostream>
using namespace std;

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2

typedef int Status;

#define MAXSTRLEN 255
typedef unsigned char SString[MAXSTRLEN + 1];  //0号单元存放串的长度

Status StrAssign(SString T,char chars[])
{ //赋值
//生成一个其值等于chars的串T。
int i;
if(strlen(chars)>MAXSTRLEN)
return ERROR;
T[0]=strlen(chars);
for(i=0;i<=T[0];i++)
{
T[i+1]=chars[i];
}
return OK;
}

Status StrCopy(SString T,SString S)
{//复制
//由串S复制得串T
int i;
for(i=1;i<=S[0];i++)
{
T[i]=S[i];
}
T[0]=S[0];
return OK;
}

Status StrEmpty(SString S)
{//判空
if(S[0]==0)
return TRUE;
else
return FALSE;
}

Status Strcompare(SString S,SString T)
{//比较
//若S>T,则返回值>0,若S=T,则返回值=0;若S<T,则返回值<0
int i;
for(i=1;i<=S[0]&&i<=T[0];i++)
{
if(S[i]!=T[i])
return S[i]-T[i];
}
return S[0]-T[0];
}

Status StrLength(SString S)
{//长度
return S[0];
}

Status Concat(SString T,SString S1,SString S2)
{ //连接
//用串T返回由S1和S2连接而成的新串。
int i,j;
Status uncut;
if(S1[0]+S2[0]<=MAXSTRLEN)//未截断
{
T[0]=S1[0]+S2[0];
for(i=1;i<=S1[0];i++)
{
T[i]=S1[i];
}
for(j=1;j<=S2[0];j++)
{
T[S1[0]+j]=S2[j];
}
uncut=TRUE;
}
else if(S1[0]<MAXSTRLEN)//截断
{
T[0]=MAXSTRLEN;
for(i=1;i<S1[0];i++)
{
T[i]=S1[i];
}
for(j=1;j<=MAXSTRLEN-S1[0];j++)
{
T[S1[0]+j]=S2[j];
}
uncut=FALSE;
}
else// S1[0]>MAXSTRLEN
{
T[0]=MAXSTRLEN;
for(i=1;i<=MAXSTRLEN;i++)
{
T[i]=S1[i];
}
uncut=FALSE;
}
return uncut;
}
Status SubString(SString Sub,SString S,int pos,int len)
{   //求子串
//用Sub返回串S的第pos个字符起长度为len的子串
int i,j;
if(pos<1||pos>S[0]||len<0||len>S[0]-pos+1)
return ERROR;
if(!len)
{
Sub=NULL;
Sub[0]=0;
}
else
{
for(i=1,j=pos;i<=len-1,j<=pos+len-1;i++,j++)
Sub[i]=S[j];
Sub[0]=len;
}
return OK;
}

Status Index(SString S,SString T,int pos)
{ //模式匹配
//若主串S中存在和串T相同的子串,则返回它在主串S的第pos个
//字符之后第一次出现的位置,否则函数值为0
int n, m,i;
SString Sub;
if(pos>0)
{
n=StrLength(S);
m=StrLength(T);
i=pos;
while(i<=n-m+1)
{
SubString(Sub, S, i, m);
if (Strcompare(Sub, T) != 0)
++i;
else
return i;
}
}
return 0;
}

Status StrInsert(SString S,int pos,SString T)
{  //插入函数
//在串S的第pos个字符之前插入串T。
int i;
if (pos<1 || pos>S[0])
return ERROR;
if (S[0] + T[0] < MAXSTRLEN)//完全插入
{
for (i = S[0]; i >= pos; i--)
{
S[i + T[0]] = S[i];
}
for (i = 1; i <=T[0]; i++)
{
S[pos-1+i] = T[i];
}
S[0] = S[0] + T[0];
return TRUE;
}
else
{
for (i = S[0]; i >= MAXSTRLEN-S[0];i--)
{
S[MAXSTRLEN-S[0]+1] = S[i];
}
for (i = 1; i <= MAXSTRLEN - S[0];i++)
{
S[pos - 1 + i] = T[i];
}
return FALSE;
}
}

Status StrDelete(SString S,int pos,int len)
{  //删除
//从串S中删除第pos个字符起长度为len的子串
int i;
if (pos<1 || pos>S[0])
return ERROR;
else
for (i = pos + len ; i<=S[0]; i++)
{
S[i-len] = S[i];
}
S[0] -= len;
return  OK;
}

Status StrPrint(SString S)
{//输出函数
int i;
for (i = 1; i <= S[0]; i++)
{
cout << S[i];
}
cout << endl;
return 0;
}

int main()
{
int pos,len;
SString S1,S2,T1,T2,Sub;
char a[100], b[100];
cout << "请输入两个串,分别赋值给串s1和串s2" << endl;
cin >> a >> b;
StrAssign(S1, a);
StrAssign(S2, b);
cout << "把串S1拷贝给T1,输出T1:";
StrCopy(T1, S1);
StrPrint(T1);

if (StrEmpty(T1) == 1)
cout << "串T1为空!" << endl;
else
cout << "串T1非空!" << endl;

if (Strcompare(S1, S2) > 0)
cout << "S1>S2" << endl;
else if (Strcompare(S1, S2) < 0)
cout << "S1<S2" << endl;
else
cout << "S1=S2" << endl;

cout << "连接S1,S2为T2,输出T2:";
if (Concat(T2, S1, S2) == 1)
StrPrint(T2);
else
cout << "串连接失败" << endl;

cout << "串T2的长度为:";
cout <<StrLength(T2)<< endl;

cout << "请输入求子串的pos和len的值"<<endl;
cin >> pos>> len;
if (SubString(Sub, S1, pos, len) == 1)
{
cout << "输出子串Sub:";
StrPrint(Sub);
}
else
cout << "求子串失败!" << endl;

if (Index(T2, S2, pos))
{
cout << "pos的值为:";
cout << pos << endl;
}
else
cout << "pos的值不合法" << endl;

cout << "在串S1的第pos位置插入串S2" << endl;
cout << "输入pos的值:";
cin >> pos;
if (StrInsert(S1, pos, S2) == 1)
{
cout << "输出串S1:";
StrPrint(S1);
}
else
cout << "插入失败" << endl;

cout << "从串S1中删除第pos位置起长度为len的字符" << endl;
cout << "输入pos,len的值:";
cin >> pos >> len;
if (StrDelete(S1, pos, len) == 1)
{
cout << "输出删除后的串S1:";
StrPrint(S1);
}
else
cout << "删除失败" << endl;
return 0;
}


</pre><pre><pre name="code" class="cpp">


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息