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;
}






  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在C语言中,字符串是由字符组成的数组。字符串在C语言中以null字符('\0')作为结束标志。C语言中没有内置的字符串类型,但可以使用字符数组来表示字符串。使用字符数组可以进行字符串的操作和处理,比如拷贝、连接、比较等。 在数据结构中,字符串可以使用顺序存储结构(即字符数组)或链式存储结构(即链表)来实现。顺序存储结构是将字符串的字符顺序存储在一维数组中,通过下标来访问和修改字符串的各个字符。链式存储结构是通过链表的方式将每个字符存储在节点中,并通过指针连接各个字符节点。 在字符串的操作中,常用的操作有字符串的复制、拼接、比较、查找子串等。在C语言中,可以使用标准库函数如strcpy、strcat、strcmp、strstr等来实现这些操作。另外,C++中的std::string类也是对字符串操作的封装,可以更方便地进行字符串处理。 总之,对于学习C语言中的字符串数据结构,可以通过学习字符数组的操作和使用标准库函数来实现字符串操作,进一步了解字符串的原理及在顺序和链表中的实现。参考资料中提供了关于字符串的原理及实现的详细内容,可以深入了解字符串的相关知识。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [[简述]数据结构-字符串(C语言实现)](https://blog.csdn.net/second60/article/details/80044985)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [c语言数据结构实现的字符串](https://blog.csdn.net/weixin_45446903/article/details/97607846)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值