[简述]数据结构-字符串(C语言实现)

[简述]数据结构-字符串(C语言实现)

second60 20180422

1. 串的定义

串,即字符串,是由零个或多个字符组成的有限序列。

 

空串:没有字符。

串长:字符的个数。

 

2. 串的抽象数类型定义

ADT String

{

数据对象:

D={ai | i<=i <= n,n>=0,ai char类型}

数据关系:

R={<ai, ai+1> | ai,ai+1D}

基本运算:

StrAssign(&s, cstr): 赋值

StrCopy(&s, t): 复制

StrEqual(s,t): 比较

StrLength(s): 串长

Concat(s, t): 串连接

SubStr(s,i,j): 求子串

InsStr(s1,i,s2): 插入

DelStr(s,i,j): 删除

RepStr(s,i,j,t): 替换

DispStr(s): 打印

}ADT String

3. 串的顺序储存结构

typedef struct

{

char data[MAXSIZE];

int len;

}SqString;

 

算法代码如下,C语言实现:

#include "stdio.h"

#define MAXSIZE 1024

typedef int ElemType;

typedef struct

{

    char data[MAXSIZE];

    int      len;

}SqString;

 

void StrAssign(SqString *s,char cstr[])

{

    int i ;

    if(!s) return ;

    for(i = 0; cstr[i] != '\0'; i++)

    {

        if(i <= MAXSIZE-1)

        {

            s->data[i] = cstr[i];

        }

        else

        {

            break;

        }

    }

    s->len  = i;

}

void StrCopy(SqString *s,SqString *t)

{

    int i;

    if(!s || !t) return ;

    for(i=0;i< t->len;i++)

    {

        s->data[i] = t->data[i];

    }

    s->len = t->len;

}

int StrEqual(SqString *s,SqString *t)

{

    int result=1,i;

    if(!s || !t) return 0;

    if(s->len != t->len)

        result = 0;

    else

    {

        for(i=0; i< s->len; i++)

        {

            if(s->data[i] != t->data[i])

            {

                result = 0;

                break;

            }

        }

    }

    return result;

}

int StrLength(SqString *s)

{

    if(!s) return 0;

    return s->len;

}

/*

这里没有判断字符串超过MAXSIZE情况

现实项目中必须判断

 */

SqString Concat(SqString *s,SqString *t)

{

    SqString str ;

    int i;

    if(!s || !t) return str;

    for(i=0; i < s->len;i++)

        str.data[i] = s->data[i];

    for(i=0; i < t->len;i++)

        str.data[s->len +i] = t->data[i];

    str.len = s->len + t->len;

    return str;

}

SqString SubString(SqString *s,int i ,int j)

{

    SqString str;

    int k;    

    str.len = 0;

    if( i<=0 || i> s->len || j<0 || i+j-1 >s->len)

        return str;

    for( k = i-1; k<i+j-1; k++)

        str.data[k-i+1] = s->data[k];

    str.len = j;

    return str;

}

SqString InsStr(SqString *s1, int i, SqString *s2)

{

    int j;

    SqString str;

    str.len = 0;

    if( i<=0 || i>s1->len +1)

        return str;

    for(j=0; j<i-1; j++)

        str.data[j] = s1->data[j];

    for(j=0; j<s2->len; j++)

        str.data[i+j-1] = s2->data[j];

    for(j=i-1;j<s1->len; j++)

        str.data[s2->len +j] = s1->data[j];

    str.len = s1->len + s2->len;

    return str;

}

SqString DelStr(SqString *s,int i,int j)

{

    int k;

    SqString str;

    str.len = 0;

    if(i<=0 || i>s->len || i+j > s->len +1)

        return str;

    for(k = 0; k<i-1; k++)

        str.data[k] = s->data[k];

    for(k=i+j-k; k< s->len; k++)

        str.data[k-j] = s->data[k];

    str.len = s->len -j;

    return str;

}

SqString RepStr(SqString *s,int i,int j, SqString *t)

{

    int k;

    SqString str;

    str.len = 0;

    if( i<=0 || i> s->len || i+j-1 > s->len)

        return str;

    for(k=0; k<i-1;k++)

        str.data[k] = s->data[k];

    for(k=0; k< t->len; k++)

        str.data[i+k-1] = t->data[k];

    for(k=i+j-1; k<s->len; k++)

        str.data[t->len +k -j] = s->data[k];

    str.len = s->len - j + t->len;

    return str;

}

void DispStr(SqString *s)

{

    int i;

    if(s->len >0)

    {

        for(i=0;i< s->len ; i++)

        {

            printf("%c", s->data[i]);

        }

        printf("\n");

    }

}

4. 串的链式储存结构

链串与一般链表类似。主要区别在于,链串的一个结点,可以存储一个或多个字符。

 

以结点大小为1,数据类型定义

typedef struct snode

{

char data;

struct snode *next;

}LiString;


算法实现,C语言:

因为跟链表类型,这里就不在实现代码,原理也就是链表与链表间的操作,参考链表实现

后面有时间再补上代码


5. 串的运用

  字符串,可以说是程序中,最重要的数据结构之一。因为无论什么语言,还是最后的底层逻辑,很多都会转到最后,为字符串的操作。

6. 总结

在学习C++时,很常用的,就是std::string,但不少人只知道字符串,但产不了解字符串的原理,本文的内容,讲的串,其实就是字符串的原理及在顺序和链表中的实现。学习后会对字符串有深刻的了解,而不仅仅停留在使用std:string中。

简单地说,字符串,其实就是一串char类型的数组,或链表。


(注:代码中可能有些少了判断空指针或少了某些条件,时间比较仓促,如果你拿代码去用,记得一定要补上那些条件,见谅)

  

  • 2
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值