数据结构之串(完整代码)

定义串的基本操作

//这儿的下标默认是1开始
#include<iostream>
#include<cstring>
#include<stdlib.h>
using namespace std;
 
#define MAXLEN 255
 
typedef struct{
    char ch[MAXLEN];
    int length;
}SString;//定长顺序存储表示
 
typedef struct {
    char *ch;
    int length;
}HString;//堆分配存储表示
 
//初始化串
void InitSting(HString &S);
//赋值操作,把串T复制为chars
bool StrAssign(HString &T,char* chars);
//复制操作,由串S复制到T
bool StrCopy(HString &T,HString S);
//判空,是返回true,否则false
bool StrEmpty(HString S);
//若s>t 返回>0  s=t 返回=0  s<t 返回<0
int StrCompare(HString S,HString T);
//返回串长
int StrLength(HString S);
//求字串,用sub返回串s的第pos个位置开始的长度为len的串
bool SubString(HString &Sub,HString S,HString pos,HString len);
//字符串拼接,用T返回由S1和S2连接的新串
bool Concat(HString &T,HString S1,HString S2);
//返回串T在S中第一次出现的位置,不存在返回0
int Index(HString S,HString T);
//清空操作
bool ClearString(HString &S);
//销毁串
bool DestoryString(HString &S);
 
 
void InitSting(HString &S){
    S.ch = (char *)malloc(MAXLEN*sizeof(char));
    S.length = 0;
}
 
bool StrAssign(HString &T,char* chars){
    T.length = 0;
    for(int i=1;chars[i];i++){
        T.ch[i] = chars[i];
        T.length++;
    }
    return true;
}
 
bool StrCopy(HString &T,HString S){
    T = S;
    return true;
}
 
bool StrEmpty(HString S){
    if(S.length == 0) return true;
    return false;
}
 
int StrCompare(HString S,HString T){
    int i=1;
    while(i<S.length&&i<T.length){
        if(S.ch[i]!=T.ch[i]) return S.ch[i]-T.ch[i];
        i++;
    }
    return S.length-T.length;
}
 
int StrLength(HString S){
    return S.length;
}
 
bool SubString(HString &Sub,HString S,int pos,int len){
    if(pos+len-1>S.length) return false;
    for(int i=1;i<=len;i++){
        Sub.ch[i] = S.ch[pos+i-1];
    }
    Sub.ch[len+1] = '\0';
//    cout<<Sub.ch+1<<endl;
    Sub.length=len;
 
    return true;
}
 
bool Concat(HString &T,HString S1,HString S2){
    for(int i=1;i<=S1.length;i++){
        T.ch[i] = S1.ch[i];
    }
    for(int i=1;i<=S2.length;i++){
        T.ch[i+S1.length] = S2.ch[i];
    }
    T.length = S1.length+S2.length;
    return true;
}
 
int Index(HString S,HString T){
    int i=1,n=StrLength(S),m=StrLength(T);
    HString sub;
    InitSting(sub);
    while(i<n-m+1){
        SubString(sub,S,i,m);
//        cout<<sub.ch+1<<endl;
        if(StrCompare(T,sub)!=0) i++;
        else return i;
    }
    return 0;
}
 
bool ClearString(HString &S){
    S.length = 0;
    return true;
}
//销毁串
bool DestoryString(HString &S){
    free(S.ch);
    S.length = 0;
}
 
void test(){
 
    HString s,t;
    InitSting(s);
    InitSting(t);
    char *sr =" 123456";
    char *tr =" 345";
    StrAssign(s,sr);
    StrAssign(t,tr);
    printf("%d\n",Index(s,t));
}
 
int main(){
 
    HString s,t;
    InitSting(s);
    InitSting(t);
    char *sr =" 123456";
    char *tr =" 345";
    StrAssign(s,sr);
    StrAssign(t,tr);
    printf("%d\n",Index(s,t));

    system("pause");
    return 0;
}

KMP算法实现(串的唯一重点)

//串匹配下标是从1开始的,如果要从0开始,next数组减一即可(同时求next判断条件等于0应该改为等于-1)
#include<iostream>
#include<cstring>
#include<cstdio>
 
const int maxn = 1e3+10;
 
char t[maxn];   //模式串
char s[maxn];   //主串
int next[maxn];
int nextval[maxn];
 
void get_next(char *t,int next[]){
    int i=1,j=0;
    int len = strlen(t+1);
    next[1]=0;
    while(i<=len){
        if(j==0||t[i]==t[j]){
            i++;
            j++;
            next[i] = j;
        }else{
            j = next[j];
        }
    }
}
 
void get_nextval(char *t,int next[]){
    int i=1,j=0;
    int len = strlen(t+1);
    nextval[1]=0;
    while(i<=len){
        if(j==0||t[i]==t[j]){
            i++;
            j++;
            if(t[i]!=t[j]){
                next[i] = j;
            }else{
                next[i] = next[j];
            }
        }else{
            j = next[j];
        }
    }
}
 
int KMP(char *s,char *t,int next[]){
    int lens = strlen(s+1);
    int lent = strlen(t+1);
    int i=1,j=1;
    while(i<=lens&&j<=lent){
        if(j == 0||s[i] == t[j]){
            i++;
            j++;
        }else{
            j = next[j];
        }
    }
    if(j>lent){
        return i - j + 1;
    }else{
        return 0;
    }
}
 
 
int main(){
    char *s=" aaabaaaab";
    char *t=" aaaab";
    get_next(t,next);
    printf("%d\n",KMP(s,t,next));
    get_nextval(t,next);
    printf("%d\n",KMP(s,t,next));
    system("pause");
    return 0;
}
  • 4
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

取个名字真难啊啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值