数据结构—顺序串

  学过《C语言程序设计》的都应该知道字符串的定义和相关操作。串跟字符串基本一样,只不过分为顺序存储结构和链式存储结构。这里只讲顺序存储结构,即顺序串。

串的相关定义

  虽然都知道,但还是要提一下,哈哈

  串:字符串的简称,是由零个或多个字符组成的有限序列。零个字符的串叫做空串。     
  子串:一个串中任意个连续的字符组成的序列,叫做该串的子串。空串是任何串的子串!
  串长:串中所含字符个数。  
  串与串的关系:
    串s = 串str:当且仅当两个串的长度相等并且各个对应位置上的字符都相同;
    串s > 串str:设s[n],str[n]是串s,str第一对对应位置上不相等的字符,若s[n]>str[n],则a>b;
    串s < 串str:设s[n],str[n]是串s,str第一对对应位置上不相等的字符,若s[n]<str[n],则s<str;

串类型定义
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 100
typedef struct lei
{
 char data[MaxSize];   //存放串字符
 int length;           //存放串长
}lei;                  //串的类型
基本操作
void StrAssign(lei &s,char str[]);   //生成串        //初始化
void Dwatorystr(lei &s);             //销毁串
void strcpy(lei &s_str,lei s);       //复制串        //c语言字符串复制函数strcpy包含在头文件#include<string.h>内;
int strcmp(lei s,lei s_str);         //比较函数      //c语言字符串比较函数strcpy包含在头文件#include<string.h>内;
int strlen(lei s);                   //求串长度      //c语言字符串求长度函数strlen包含在头文件#include<string.h>内
lei strcat(lei s,lei s_str);         //串链接函数    //c语言字符串连接函数strcat包含在头文件#include<string.h>内
lei substr(lei s,int i,int j);       //求子串        // 从第 i 个元素开始之后的 j 个元素
lei InsStr(lei s,int i,lei s_str);   //子串的插入    //把串s_str插入到 s 的第 i 个元素的位置
lei Delstr(lei s,int i,int j);       //子串的删除    //把串中第 i 个字符开始的长度为 j 的子串删除
lei repstr(lei s,int i,int j,lei s_str);//子串的替换 //把串中第i个元素开始的长度为 j 的子串替换成 s_str
void print(lei s);                   //输出串
基本操作的函数实现
void StrAssign(lei &s,char str[])      //生成串  //初始化
{
    int i;
    for(i=0;str[i]!='\0';i++)
    {
        s.data[i]=str[i];
    }
    s.length=i;//设置串的长度
}
void Dwatorystr(lei &s)                //销毁串        
{}
void strcpy(lei &s_str,lei s)          //复制串  //把串s中的字符复制到空串s_str中
{
    for(int i=0;i<s.length;i++)
    {
        s_str.data[i]=s.data[i];
    }
    s_str.length=i;//设置串的长度
}
int strcmp(lei s,lei s_str)            //比较函数  //返回值:s大于s_str:1;等于:0;小于:-1;  
{
    int m=0;
    for(int i=0;i<=s.length;i++)
    {
        if(s.data[i]>s_str.data[i])//s>s_str
        {
            m=1;
            break;
        }
        if(s.data[i]<s_str.data[i])//s<s_str
        {
            m=-1;
            break;
        }
    }
    return m;
}
int strlen(lei s)                      //求串长度  //返回串长
{
    return(s.length);
}
lei strcat(lei s,lei s_str)            //串连接函数  //将s和s_str链接成一个串
{
    lei ss;
    for(int i=0;i<s.length;i++)
    {
        ss.data[i]=s.data[i];
    }
    for(int j=0;j<s_str.length;j++,i++)
    {
        ss.data[i]=s_str.data[j];
    }
    ss.length=i;
    return ss;
}
lei substr(lei s,int i,int j)          //求子串
{
    lei ss;
    ss.length=0;//设置ss串为空
    if(i<0||i>s.length||j<0||i+j-1>s.length)//参数不正确时返回空串
        return ss;
    for(int k=i-1;k<i+j-1;k++)
    {
        ss.data[k-i+1]=s.data[k];
    }
    ss.length=j;//设置串长度
    return ss;
}
lei InsStr(lei s,int i,lei s_str)      //子串的插入 
{
    lei ss;
    ss.length=0;
    if(i<0||i>s.length)//参数不正确则返回空串
        return ss;
    for(int j=0;j<i-1;j++)
    {
        ss.data[j]=s.data[j];
    }
    for(j=0;j<s_str.length;j++)
    {
        ss.data[i+j-1]=s_str.data[j];
    }
    for(j=i-1;j<s.length;j++)
    {
        ss.data[s_str.length+j]=s.data[j];
    }
    ss.length=s.length+s_str.length;
    return ss;
}
lei Delstr(lei s,int i,int j)          //子串的删除
{
    lei ss;
    ss.length=0;
    if(i<=0||i>s.length||i+j-1>s.length)
        return ss;
    for(int k=0;k<i-1;k++)
    {
        ss.data[k]=s.data[k];
    }
    for(k=i+j-1;k<s.length;k++)//因为要小于s.length,所以可j的值可以超限
    {
         ss.data[k-j]=s.data[k];
    }
    ss.length=s.length-j;
    return ss;
}
lei repstr(lei s,int i,int j,lei s_str)//子串的替换
{
    lei ss;
    int k;
    ss.length=0;
    if(i<0||i>s.length||i+j-1>s.length)
        return ss;
    for(k=0;k<i-1;k++)
    {
        ss.data[k]=s.data[k];
    }
    for(k=0;k<s_str.length;k++)
    {
        ss.data[i-1+k]=s_str.data[k];
    }
    for(k=i+j-1;k<s.length;k++)
    {
        ss.data[s_str.length+k-j]=s.data[k];
    }
    ss.length=s.length+s_str.length-j;
    return ss;
}
void print(lei s)                      //输出串
{
    if(s.length>0)
    {
        for(int i=0;i<s.length;i++)
        {
            printf("%c",s.data[i]);
        }
        printf("\n");
    }
}
代码示例
int main()
{
    lei s,s_str;
    char str[]="123456789";
    StrAssign(s,str);
    printf("初始化串:\n");
    print(s);
    strcpy(s_str,s);
    printf("\n将串s复制给串s_str:\ns_str=");
    print(s_str);
    printf("\n求串s的长度:\n%d\n",strlen(s));
    printf("比较串s、s_str的大小:\n%d\n\n",strcmp(s,s_str));
    printf("链接串s、s_str:\n");
    print(strcat(s,s_str));
    printf("\n求串s第三个字符开始长度为四的子串:\n");
    print(substr(s,3,4));
    printf("\n将串s_str插入到s的第三个字符的位置:\n");
    print(InsStr(s,3,s_str));
    printf("\n删除串s第三个字符开始长度为四的子串:\n");
    print(Delstr(s,3,4));
    printf("\n将s第二个字符开始长度为5的子串替换成s_str:\n\n");
    print(repstr(s,2,5,s_str));
    Dwatorystr(s);
    printf("串已销毁\n");
    return 0;
}
输出如下

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值