【ADT】串_存储_基操

串这里基操相交于创销增删改查空多了:清空、求字串、比较、定位操作,介于此块代码的掌握不够熟练,这块需要多code

以下思维导图为这里的重点概括:

 代码实现C

//
//  main.c
//  串_基操
//
//  Created by 郭宸羽 on 6/8/2022.
//

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

#define MAXLEN 255

//串的顺序存储:
typedef struct
{
    char ch[MAXLEN];//栈区分配空间存储释放
    int length;
}SString;//静态数组实现(定长顺序存储)


typedef struct
{
    char *ch;//ch指向串的基地址
    int length;
}HString;//动态数组实现(堆分配存储)

void Initial(HString *S)
{
    S->ch = (char*)malloc(MAXLEN * sizeof(char));//使用完后需要手动free
    S->length = 0;
}

//串的链式存储
typedef struct StringNode
{
    char ch;//每个节点存储一个字符 ⇔ 占1B
    struct StringNode *next_p;//不存储信息的结构指针 ⇔ 占8B
}StringNode,*String;
//Q:怎么解决串的链式存储这种存储密度低的问题呢?
//AN:每个结点存放多个字符,从而提高存储密度。
//EX:
typedef struct NStringNode
{
    char ch[4];//每个节点存储多个字符
    struct NStringNode *next_p;//不存储信息的结构指针 ⇔ 占8B
}NStringNode,*NString;//关于细节:如果最后一个节点中有些位置存不满,可用特殊的字符填充如‘\0’


//求子串操作:
int SubString(SString *Sub,SString *S,int pos,int len)//Sub用来返回想要找到的子串的内容
{
    if(pos + len -1 > S->length)//判断子串范围是否越界
        return -1;
    for(int i = pos; i < pos + len;i++)//将S中的字符从[pos]开始
        Sub->ch[i - pos + 1] = S->ch[i];
    Sub->length = len;
    return 1;
}

//比较操作,从第一个字符开始比较,直到两者中有不同字符
int StrCompare(SString S,SString T)
{
    for(int i = 1;i <= S.length && i <= T.length;i++)
    {
        if(S.ch[i] != T.ch[i])
            return S.ch[i] - T.ch[i];//若S > T,则返回值 > 0;若S = T,则返回值 = 0;
                                     //若S < T,则返回值 < 0;
    }
    //扫描过的所有字符都相同,则长度长的串更大
    return S.length - T.length;
}

//查询长度操作:
int StrLength(SString S)
{
    return S.length;
}
//定位操作:
int Index(SString S,SString T)
{
    int i = 1, n = StrLength(S), m = StrLength(T);//求出S的长度和T的长度,我们知道了T的长
                                                  //度才能知道我们要求的子串有多长
    SString sub;//用于暂存子串
    while(i < n-m+1)
    {
        SubString(&sub, &S, i, m);
        if(StrCompare(sub, T) != 0)
            ++i;
        else
            return i;
    }
    return 0;
}

int main()
{
    //printf("%d",sizeof(struct StringNode*)); -> 8
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值