C语言数据结构顺序存储字符串

#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define TRUE 1
#define FALSE -1
#define M 255
#define ERROR 0
#define OK 1
typedef int Status;
typedef unsigned char SString[M+1];




void createstring(SString &T,char *chars)
{


int i;







if(strlen(chars)>M)
{
printf("存不了,你这太长了!");
}
else
{
T[0]=strlen(chars);
for(i=1;i<=T[0];i++)
T[i]=*(chars+i-1);
}
}


void StrCopy(SString &T,SString &S)
{
int i;
for(i=0;i<=S[0];i++)
T[i]=S[i];
}




int Strlength(SString T)
{
    return T[0];
}


void  print(SString &T)
{
int i;
printf("这个字符串为:\n");
for(i=1;i<=T[0];i++)
printf("%c",T[i]);
printf("\n");
}




 


int StrCompare(SString S,SString T)
{
    int i = 1;
    while(i <= S[0] && i <= T[0]){   //非空前提下


        if(S[i] == T[i]){  //相等
            i++;
        }
        else{    //不相等
            return S[i] - T[i];
        }


    }
    return S[0]-T[0];
}









void  Strclear(SString S)  

S[0]=0;
}  


int  Concat(SString T,SString S1,SString S2) 
{
    int i;  
    if(S1[0]+S2[0]<=M)  
    {   
        for(i=1;i<=S1[0];i++)  
            T[i]=S1[i];  
        for(i=1;i<=S2[0];i++)  
            T[S1[0]+i]=S2[i];  
        T[0]=S1[0]+S2[0];  
        return TRUE;  
    }  
    else  
    { 
        for(i=1;i<=S1[0];i++)  
            T[i]=S1[i];  
        for(i=1;i<=M-S1[0];i++)  
            T[S1[0]+i]=S2[i];  
        T[0]=M;  
        return FALSE;  
    }  
}  
  


Status SubString(SString Sub, SString T,int pos,int len)
{
    if(pos<1 || pos>T[0] || len<0 || len>T[0]-pos+1)
        return ERROR;


    int i,j;
    for(i = 1,j = pos;j <= len+pos-1;i++,j++){
        Sub[i]=T[j];
    }
    Sub[0] = len;
    return OK;
}


int StrEmpty(SString S)
{
if(S[0]==0)
return TRUE;
else
return FALSE;
}


int Strinsert(SString N,int pos,SString T)
{
int i;
if(pos<1||pos>N[0]+1)
printf("输入的位置错误哦!\n");
if(N[0]+T[0]<=M)
{
for(i=N[0];i>=pos;i--)
N[i+T[0]]=N[i];
for(i=pos;i<pos+T[0];i++)
N[i]=T[i-pos+1];
  N[0]=N[0]+T[0];
  return TRUE;
}
else
{
          for(i=M;i>=pos+T[0];i--)
 N[i]=N[i-T[0]];
 for(i=pos;i<pos+T[0]&&i<M;i++)
   N[i]=T[i-pos+1];
 N[0]=M;
 return FALSE;
}
}




void Strdelete(SString N,int pos,int len)
{
int i;
if(pos<1||pos>N[0]-len+1||len<0)
printf("输入数据有误!\n");
for(i=pos+len;i<N[0];i++)
N[i-len]=N[i];
   N[0]=N[0]-len;
}
  
int Index(SString S,SString T,int pos)
{
    SString Sub;


    int i = pos;
    if(pos > 0){
        int n = Strlength(S),m = Strlength(T);


        while( i<= n-m+1){


            SubString(Sub,S,i,m);
            if(StrCompare(Sub,T)==0)
                return i;
            else
                i++;
            }
    }//if
    printf("不存在\n");
    return 0;  //S中不存在与T相等的子串
}//Index








int main()
{


int i,len,pos;
int m,n;
SString t,s,N,sub;
printf("请创建两个字符串t,s:\n");
createstring(t,"ABCDEFGH");
createstring(s,"EFGH");






printf("两个字符串的长度是:\n");
m=Strlength(t);
printf("%d",m);
    n=Strlength(s);
printf("%d",n);




printf("比较两个字符串的大小:\n");

i=StrCompare(s,t);
if(i>0)
{
printf("S>T\n");
}
if(i=0)
{
printf("S=T\n");
}
if(i<0)
{
printf("S<T\n");
}








    printf("将t字符串输出:\n");
print(t);






printf("将两个字符串链接起来\n");
Concat(N,t,s);
print(N);






printf("请输入多少位置,多少长度的子串,然后输出:\n");
scanf("%d %d",&pos,&len);
SubString(sub,N,pos,len);
print(sub);






printf("在N字符串中什么位置插入S:\n");
scanf("%d",&pos);
Strinsert(N,pos,s);
print(N);






printf("需要删除的字串在什么位置长度是:\n");
scanf("%d %d",&pos,&len);
Strdelete(N,pos,len);
print(N);




int j = Index(t,s,1);
    printf("找到子串T在S中的位置 = %d\n",j);
return 0;
}






评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值
>