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

来源:互联网 发布:java set集合获取元素 编辑:程序博客网 时间:2024/06/05 19:34
#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 -2typedef int Status;#define MAXSTRLEN 255typedef 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个  //字符之后第一次出现的位置,否则函数值为0int 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;elsefor (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;elsecout << "串T1非空!" << endl;if (Strcompare(S1, S2) > 0)cout << "S1>S2" << endl;else if (Strcompare(S1, S2) < 0)cout << "S1<S2" << endl;elsecout << "S1=S2" << endl;cout << "连接S1,S2为T2,输出T2:";if (Concat(T2, S1, S2) == 1)StrPrint(T2);elsecout << "串连接失败" << 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);}elsecout << "求子串失败!" << endl;if (Index(T2, S2, pos)){cout << "pos的值为:";cout << pos << endl;}elsecout << "pos的值不合法" << endl;cout << "在串S1的第pos位置插入串S2" << endl;cout << "输入pos的值:";cin >> pos;if (StrInsert(S1, pos, S2) == 1){cout << "输出串S1:";StrPrint(S1);}elsecout << "插入失败" << endl; cout << "从串S1中删除第pos位置起长度为len的字符" << endl;cout << "输入pos,len的值:";cin >> pos >> len;if (StrDelete(S1, pos, len) == 1){cout << "输出删除后的串S1:";StrPrint(S1);}elsecout << "删除失败" << endl;return 0;}

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