串(string)的基本用法

2018/3/22

数据结构

1.串(string)

1.概念:由n个字符所组成的有限数列

2.串是一种特殊的线性表,但是也有着不同之处,串的操作对象只能是字符,而且线性表一次只能操作一个数,但是串一次可以操作多个字符

2.动态数组的应用

注:这里是采用动态数组的方法来分配空间,即:在空间不够的时候,继续动态分配空间(realloc(size,number))

 
#include<malloc.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
typedef struct
{
char *str;//字符串内容
int length;//字符串长度
int maxlength;//最长长度
}DString;
//1.新建字符串
void initString(DString *S,int max, char *string)//参数表列:主字符串,字符串长度,字符串内容
{
int i;
S->str = (char*)malloc(sizeof(char)*max);//申请动态空间
S->maxlength = max;//申请最大值(可变)
S->length =strlen(string);//使用标准函数来计算键入字符串的长度
for (i = 0; i < S->length; i++)//循环输入
{
S->str[i] = string[i];
}
}
//2.插入子串(含动态分配空间)
int insert_string(DString *S, int pos, DString T)//在pos的地方插入子串T
{
int i;
char *p;
//判断特殊情况
if (pos<0 || pos>S->length)
{
printf("插入位置错误\n");
return 0;
}
//!!!动态分配
else
{
if (S->length + T.length > S->maxlength)//如果数组的长度超出了默认长度
{
p =(char *)realloc(S->str, (S->length + T.length)*sizeof(char));
//realloc(p,size),表示重新给p分配一个size大小的空间
if (p == NULL)
{
printf("空间不足\n");
return 0;
}
}
//循环给值
for (i = S->length - 1; i >= pos; i--)
{
S->str[i + T.length] = S->str[i];//数据移位
}
for (i = 0; i < T.length; i++)
{
S->str[pos + i] = T.str[i];//赋子串值入源串
}
S->length = S->length + T.length;
return 1;
}
}
//3.删除指定位置子串
int delete_string(DString *S, int pos,int len)//参数表列:所删除的串,删除的位置,删除的位数
{
int i;
//判断特殊情况
if (S->length <= 0)
{
printf("无数可删除\n");
return 0;
}
else if (pos < 0 || len<0 || pos + len>S->length)//pos+length为总长度
{
printf("参数选择错误\n");
return 0;
}
else
{
for (i = pos + len; i <= S->length - 1; i++)
{
S->str[i - len] = S->str[i];
S->length = S->length - len;
return 1;
}
}
}
//4.取子串
int catch_string(DString *S, int pos, int len, DString *T)//参数表列:主字符串,所取字符串的头,所取字符串的尾,返回子串
{
int i;
if (pos < 0 || len<0 || pos + len>S->length)//pos+length为总长度
{
printf("参数选择错误\n");
return 0;
}
else
{
for (i = 0; i < len; i++)
{
T->str[i] = S->str[pos + i];//取得子串
T->length = len;
return 1;
}
printf("\n取得子串为\n");
for (i = 0; i < T->length; i++)
{
printf("%2c", T->str[i]);
}
}
}
//5.撤销字符串
void destroy(DString *S)//释放指针,将长度置为0
{
free(S->str);//释放指针
S->maxlength = 0;
S->length = 0;
printf("\n撤销完成\n");
}
//6.BF算法
int BFindex(DString S,int start,DString T)//参数表列:查找从start开始的子串在S中的位置
{
    int i,j,v;
    i=start;
    j=0;
    while(i<S.length&&j<T.length)
    {
        if(S.str[i]==T.str[j])
        {
            i++;
            j++;
        }
        else
        {
            i=i-j+1;//如果S和j不匹配,所以i的位置跳到下一位
            j=0;
        }


    }
    if(j==T.length)//已经走完
    {
        v=i-T.length;//现在v已经到了子串的尾部
        printf("\n字符串已经找到了,在第%2d个位置\n",v);
    }
    else
    {
        v=-1;
        printf("\n没有找到该字符串\n");
        return v;
    }



}

//源文件
void main()
{
DString string1, string2, string3;
int i;
int max1 = 10, max2 = 20, max3 = 10;
//init
initString(&string1, max1, "Data Structure");
initString(&string2, max2, "Structure");
initString(&string3, max3, "");
//insert_string
BFindex( string1,0,string2);
insert_string(&string2, 0, string1);
for (i = 0; i < string2.length; i++)
printf("%c", string2.str[i]);
printf("\n");
//delete_string
delete_string(&string2, 0, 5);
for (i = 0; i < string2.length; i++)
printf("%c", string2.str[i]);
printf("\n");
//catch_string
catch_string(&string2, 0, 3,&string3);

//destroy
destroy(&string1);
destroy(&string2);
destroy(&string3);
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值