数据结构串的实现

本文详细介绍使用C语言实现串的两种数据结构:堆分配存储和定长顺序存储。通过具体代码示例,展示了字符串的初始化、赋值、打印、长度获取、拼接、删除指定字符、子串定位及子串提取等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据结构中串的C语言

1.串的堆分配存储(实际就是动态数组方式)

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<assert.h>

#define SIZE 20
#define true 1
#define false 0
typedef struct
{
    char *ch;
    int length;
}Str;

//初始化字符串
int InitString(Str *s)
{
    s->ch=NULL;
    s->length=0;
    return 1;
}

//字符串赋值
int AssignString(Str *s,char *ch)
{
    int i,len=strlen(ch);
    //如果字符串不为空,就志为空
    if(s->ch)
    {
        free(s->ch);
    }
    // 这里判断是否是空字符串
    if(!len)
    {
        s->ch=NULL;
        s->length=0;
        return 0;
    }
    else
    {
        s->ch=(char*)malloc(sizeof(char)*len);
        if(!s->ch)
        {
            printf("分配空间失败");
            exit(-1);
        }
        for(i=0;i<len;i++)
        {
            s->ch[i]=ch[i];
        }
        s->length=len;
        return 1;

    }
}
//打印字符串
void printString(Str s)
{
    int i;
    for(i=0;i<s.length;i++)
    {
        printf("%c",s.ch[i]);
    }
    printf("\n");
}

//字符串的长度
int LengthString(Str s)
{
    return s.length;
}
//判读字符串是否为空
int isEmptyString(Str s)
{
    if(s.length==0)
    {
        printf("字符串为空");
        return 1;
    }
    else
    {
        printf("字符串不为空");
        return 0;
    }
}

int ConcatString(Str *s, Str str1,Str str2)
{
    int i;
    if(s->ch)
        free(s->ch);
    s->ch=(char *)malloc(sizeof(char)*(str1.length+str2.length));
    if(!s->ch)
    {
        printf("分配内存失败");
        exit(-1);
    }

    for(i=0;i<str1.length;i++)
        s->ch[i]=str1.ch[i];
    for(i=0;i<str2.length;i++)
        s->ch[str1.length+i]=str2.ch[i];

    s->length=str1.length+str2.length;
    return 1;
}

//删除字符串指定pos位置的len长的字符
void DeleteString(Str *s,int pos,int len)
{
    int i;
    if(pos>s->length)
    {
        printf("pos大于整体字符串的长度");
        exit(-1);

    }
    else if(pos+len>s->length)
    {
        len=s->length-pos+1;//指定的长度超过了,所以直接删除pos到字符串最末尾的元素
    }
    for(i=pos;i<s->length;i++)
        s->ch[i]=s->ch[i+len];
    s->length-=len;
}

//BF算法,就是对某子串的定位,返回的k表示从k开始sub子串就和主串相匹配
int BFString(Str str,Str subStr)
{
    int i=1,j=1,k=i;
    while(i<str.length&&j<subStr.length)
    {
        if(str.ch[i]==subStr.ch[j])
        {
            ++i;
            ++j;
        }
        else
        {
            j=1;
            i=++k;//匹配失败,,i从主串下一个位置开始,k记录着上一次的位置
        }
    }
    if(j>subStr.length)
        return k;
    else
        return 0;

}

//求子串的方法,从字符串str规定的位置pos开始1取出len长度的字符串返回给sub,sub就是str的子串
void subString(Str *sub ,Str str,int pos, int len)
{
    int i;
    if(pos<1||len>str.length||len<0||len>str.length-pos+1)
    {
        printf("pos小于1||截取长度大于主串长度||截取长度小于0||截取长度大于主串从pos开始到结束的长度");
        exit(-1);
    }
    if(sub->ch)
        free(sub->ch);

    //子串返回空字符串
    if(len==0)
    {
        sub->ch=NULL;
        sub->length=0;
    }
    else
    {
        sub->ch=(char*)malloc(sizeof(char)*len);
        for(i=0;i<len;i++)
            sub->ch[i]=str.ch[pos+i-1];

        sub->length=len;
    }
}
int main()
{
   Str s,str1,str2,sub;
   char a[20]="abcdefg";
   char b[20]="_";
   char c[20]="qaq";
   InitString(&s);
   InitString(&str1);
   InitString(&str2);
   InitString(&sub);
   AssignString(&s,a);
   AssignString(&str1,b);
   AssignString(&str2,c);

   printString(s);
   printString(str1);
   printString(str2);
   ConcatString(&s,str1,str2);
   printString(s);
   DeleteString(&s,0,1);
   printString(s);
   subString(&sub,s,1,3);
   printString(sub);



    return 0;
}

2.串的定长顺序存储(就是字符串数组):这个方法比较简单所以和上面的逻辑其实都是相似的所以列举下结构体就是了哈哈


typedef struct Str
{
    char elem[SIZE];//elem数组用来存放串的元素
    int length;//定义一个串长度
}Str;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值