王道计算机考研 数据结构C语言复现-第九章-(字符)串操作

这篇文章收录了王道考研课程中涉及的数据结构的所有代码。此外,本博客可能会添加一些额外的代码(不仅限于王道考研),因为408考试中会频繁考察一些冷门的知识点,所以这篇博客会涵盖所有相关的代码。这也是我数据结构的第一轮复习,希望能与大家共同进步。由于博客篇幅的限制,可能无法一次性包含所有内容,欢迎指出代码错误部分!!!

你想要的都在下面!!!

// @FileName  :10Chuan.c
// @Time      :2023/8/15 21:10
// @Author    :YKW
#include 
#include 
#include 
#include 
#define MAXLEN 255
//本文件数组下标从1开始,舍弃0位
//顺序存储
//静态数组实现/定长顺序存储
typedef struct Node{
    int data;
    struct Node* next;
}Node;
typedef struct{
    char ch[MAXLEN];
    int length;
}SString;
//动态数组实现/堆分配存储
typedef struct{
    char *ch;
    int length;
}HString;
/*
HString S;
S.ch=(char*)malloc(MAXLEN*sizeof(char));
S.length=0;
free(S)
*/

//链式存储
typedef struct StringNode{//存储密度低
    char ch;//(如果设置成字符串大小1B->4B)
    struct StringNode* next;//(大小4B)
}StringNode,*String;
int Strlength(SString S){
    return S.length;
}
//用Sub返回串S的第pos个字符起长度为len的字串
bool SubString(SString *Sub,SString S,int pos,int len){
    if(pos+len-1>=S.length)
        return false;
    for (int i=pos;ich[i-pos+1]=S.ch[i];
    Sub->length=len;
    return true;
}
//若S>T,返回>0
int StrCompare(SString S,SString T){
    for (int i;i<=S.length&&i<=T.length;i++)
    {
        if (S.ch[i]!=T.ch[i])
            return S.ch[i]-T.ch[i];
    }
}
//定位操作,若S存在T字串,返回第一次位置,否则为0;
int Index(SString S,SString T){
    int i=1,n=Strlength(S),m=Strlength(T);
    SString sub;
    while(i<=n-m+1){
        SubString(&sub,S,i,m);
        if(StrCompare(sub,T)!=0)
            ++i;
        else
            return i;
    }
}
//朴素模式匹配算法
int Index2(SString S,SString T){
    int i=1,j=1;
    while(i<=S.length&&j<=T.length){
        if(S.ch[i]==T.ch[j]){
            i++;j++;
        }
        else {//匹配失败
            i = i - j + 2;//i后移
            j = 1;//T会到0位置
        }
    }
    if(j>T.length)
        return i-T.length;
    else
        return 0;
}
//KMP算法(i不回溯):先求next数组,优化版nextval数组
/*
前缀:字符串A和B,A=B+S,S非空,则B为A的前缀
后缀:字符串A和B,A=S+B,S非空,则B为A的后缀
PMT值:前缀集合和后缀集合的交集中,最长元素的长度
prefix:每一个下标位置对应一个PMT值,组成的数组
next:prefix向右移一个下标位置,组成的next数组
*/
int Next(SString T,int *next){
    next[0]=-1;
    int i=0,j=-1;//i后缀,j前缀
    while(iT.length)
        return i-T.length;//匹配成功
    return 0;
}
int Index4(SString S,SString T){
    for (int i=1;i<=T.length;i++){//对T每个字符,先找到0号字符所有索引,再在这些里面找到1号字符......
        char c=T.ch[i];
        Node *all=(Node*)malloc(sizeof(Node));
        all->data=0;
        all->next=NULL;
        for (int i=1;idata=i;
            new->next=NULL;
            all->next=new;
            all=new;
        }
        for (int i=0;i

你可能感兴趣的:(王道数据结构课程,考研,数据结构,c语言,算法,leetcode)