数据结构第四章字符串部分代码c

408《数据结构》——第四章:串 知识点关键内容串定义字符序列,空串 ( n=0 ),子串需连续存储结构顺序(定长/堆分配)、块链(存储密度= (\frac{\text{字符字节数} \times \text{块大小}}{\text{结点总字节数}}))模式匹配- 朴素算法:主串回溯,最坏 (O(n \times m))KMP:主串不回溯,(O(n + m)),核心是数组高频考点1. KMP的计算2. 不同存储结构的优缺点3. 模式匹配过程模拟备考策略反复练习next和nextval数组的手工计算(每日2题)。 阅读详情

串

在c语言中虽然没有明确的string类型,而是用char[]来表征字符串,但是却有字符串相关的一些库函数#include<string.h>可以直接使用。所以这一部分除了KMP没有可看性,但是这里的KMP只有代码无思路,非大佬可以看懂,所以这一文章除非要copy KMP代码,否则没有可看性,慢走不送。

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

/*
1	strcpy(s1, s2);
复制字符串 s2 到字符串 s1。
2	strcat(s1, s2);
连接字符串 s2 到字符串 s1 的末尾。
3	strlen(s1);
返回字符串 s1 的长度。
4	strcmp(s1, s2);
如果 s1 和 s2 是相同的,则返回 0;如果 s1<s2 则返回小于 0;如果 s1>s2 则返回大于 0。
5	strchr(s1, ch);
返回一个指针,指向字符串 s1 中字符 ch 的第一次出现的位置。
6	strstr(s1, s2);
返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置。
7   void *memchr(const void *str, int c, size_t n)
在字符串str中前n个字符中搜索第一个出现字符c的位置
*/
void demo(){
    char str1[14]="hello!";
    char str2[14]="cch";
    char str3[14]="";
    int len=0;
    strcpy(str3,str1);//复制str1到str3
    printf("%s\n",str3);

    strcat(str1,str2);//连接str2到str1
    printf("%s\n",str1);

    len=strlen(str1);//求str1长度
    printf("%d\n",len);

    char *result=" ";
    result=(char*)memchr(str1,'h',0);//找不到,空的,因为n=0
    printf("%s\n",result);
    result=(char*)memchr(str1,'e',4);//找得到,并且输出的是包含e之后的所有字串
    printf("%s\n",result);

}

顺序存储结构

#ifndef HSTRING_H
#define HSTRING_H

#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>
#include<string.h>
/**
 * @brief 串的顺序存储结构
 * 
 */
#define MaxLen 255
// 静态数组实现定长顺序存储
typedef struct{
    char ch[MaxLen];
    int len;
}SString;

// 动态数组实现,堆分配存储,需要手动free
typedef struct{
    char *ch;//按串长分配存储区,ch指向串的基地址
    int length;
}HString;
// HString s;
// s.ch=(char *)malloc(MaxLen*sizeof(char));
// s.length=0;
#endif

链式存储结构

#ifndef LISTRING_H
#define LISTRING_H
#include<stdlib.h>
#include<stdbool.h>
#include<stdio.h>
/**
 * @brief 串的链式存储结构
 * 
 */
typedef struct StringNode2{
    char ch;//每一个结点存储1个字符
    struct StringNode2 *next;//需要4个字符来存储一个指针,存储密度低
}StringNode2,*String2;

typedef struct StringNode{
    char ch[4];//每一个结点可以存储多个字符,提高存储密度
    struct StringNode *next;
}StringNode,*String;

#endif

  • 顺序存储结构的实现
#include "hstring.h"

bool SubString(SString *sub,SString s,int pos,int len){
    // 字串范围越界
    if(pos+len-1>s.len)
        return false;
    // 注意pos表示的是位序,对应于数组元素需要-1
    for(int i=pos-1;i<pos+len-1;i++){
        (*sub).ch[i-pos+1]=s.ch[i];
    }
    (*sub).len=len;
    
    return true;
}
int StrCompare(SString s,SString t){
    for(int i=0;i<s.len&&i<t.len;i++){
        // 对应字符的元素不同
        if(s.ch[i]!=t.ch[i])
            return s.ch[i]-t.ch[i];
    }
    // 扫描所有的字符都相同,长度大的串更大
    return s.len-t.len;
}
// 定位操作,如果主串中存在于串T相同的字串,返回它在主串中第一次出现的位置(数组下标+1),否则返回0
int Index(SString s,SString t){
    int i=0;
    int n=s.len;
    int m=t.len;
    SString sub;
    while(i<(n-m)){
        SubString(&sub,s,i+1,m);
        if(StrCompare(sub,t)!=0)
            i++;
        else
            return i+1;
    }
    return 0;//不存在与t相等的字串

}
void PrintfString(SString s){
    for(int i=0;i<s.len;i++){
        printf("%c",s.ch[i]);
    }
    printf("\n");
}
  • 朴素模式匹配
// ---------------------华丽的分界线-----------------------------
// 后面的操作都采用舍弃第一个空间[0]号的元素,使得位序和数组的存储下标一致
// 朴素模式匹配
int simpleMatch(SString s,SString t){
    int i=1,j=1;
    while(i<=s.len&&j<=t.len){
        if(s.ch[i]==t.ch[j]){
            i++;
            j++;
        }else{
            i=i-j+2;
            j=1;
        }
    }
    if(j>t.len)
        return i-t.len;
    else
        return 0;
}
int simpleMatch1(SString s,SString t){
    int i=1,j=1;
    int n=s.len,m=t.len;
    while(i<n-m+1){
        while(j<=m){
            if(s.ch[i]!=t.ch[j]){
                i=i-j+2;
                j=1;
                break;//恢复i,j的数据,结束本轮循环进行下一轮匹配
            }else{
                i++;
                j++;
            }
        }
        if(j>m){//说明匹配成功,返回字串第一个下标
            return i-j+1;
        }
    }
    return 0;
}
void test1(){
    SString s;
    strcpy(s.ch," Today is Monday!");//不能直接给ch赋值,只能使用c中自带的字符串函数
    s.len=16;

    // SString sub;
    // SubString(&sub,s,10,5);
    // PrintfString(sub);

    // printf("%d\n",StrCompare(s,sub));
    // printf("%d\n",Index(s,sub));
    SString t;
    strcpy(t.ch," today");
    t.len=5;
    printf("%d\n",simpleMatch1(s,t));
    printf("%d\n",simpleMatch(s,t));
}
void main(){
    test1();
}
  • KMP

找个视频看思路吧,看代码看不懂的,单纯一个数学题写成的一个代码


// KMP开始前需要对模式串预处理,先求next数组,再利用next数组进行匹配
// 模式向后滑动的计数仅和模式本身结构有关,和主串无关,说明next是不依赖与主串的数组
// 主串的指针不回溯,时间复杂度为O(n+m)

// 求KMP的next数组
void KMPnext(SString t,int next[]){
    int i=1,j=0;
    next[1]=0;
    while(i<t.len){
        if(j==0||t.ch[i]==t.ch[j]){
            i++;
            j++;
            next[i]=j;
        }else
            j=next[j];
    }

}
// 求KMP的nextVal数组
void LMPnextVal(SString t,int nextVal[]){
    int i=1,j=0;
    nextVal[1]=0;
    while(i<t.len){
        if(j==0||t.ch[i]==t.ch[j]){
            i++;
            j++;
            if(t.ch[i]!=t.ch[j])
                nextVal[i]=j;
            else
                nextVal[i]=nextVal[j];

        }else
            j==nextVal[j];
    }
}
int KMP(SString s,SString t,int next[]){
    int i=1,j=1;
    while(i<s.len&&j<t.len){
        if(j==0||s.ch[i]==t.ch[j]){
            i++;
            j++;
        }else
            j=next[j];

    }
    if(j>t.len)
        return i-t.len;
    else
        return 0;
}
从数据到图片:手把手构建FMCW雷达人体行为识别数据集(行走、跌倒、喝水等6类动作) 本文详细解析了如何利用FMCW雷达构建人体行为识别数据集,涵盖行走、跌倒、喝水等6类动作。通过多普勒特征可视化、图像标准化处理和自动化流水线设计,将原始雷达信号转化为高质量时频图像数据集,为智能家居和健康监护等应用提供可靠数据支持。 阅读详情

相关推荐

从Chimera到ChimeraX:科研绘图升级指南,让你的论文配图更专业

本文详细介绍了从UCSF Chimera升级到ChimeraX的科研绘图指南,帮助研究者提升论文配图质量。ChimeraX在渲染引擎、大分子处理能力和动画功能上具有显著优势,特别适合生命科学和结构生物学领域。文章涵盖材质设置、专业配色、工作流程和期刊适配等核心技巧,助力产出出版级分子可视化图像。

weixin_33670786的博客 940

数据结构第四章数组和字符串--课本代码

1.稀疏矩阵的快速转置法 我们知道简单的稀疏矩阵的转置,可以直接交换矩阵的行和列就可以。这样需要遍历每一个元素,时间复杂度是o(m*n)。 我们通过快速转置法,可以将时间复杂度降到o(n+t).其中m,n,t分别是矩阵的行数,列数,和非零元素的个数。 快速转置法的核心在于利用两个数组num和k,num用来记录原三元组表中a.table[i].col中不同的列的号码j1,j2,j3,j4的数目。

xx_ii 621

从零开始深入理解 AI Agent(完整版)

AI Agent(智能体)是一个能够自主感知环境、做出决策、执行行动并记忆经验的智能系统。特性传统程序AI Agent决策方式固定逻辑(if-else)动态推理(LLM 思考)灵活性需要重新编程自然语言描述即可能力边界明确限定可通过工具扩展学习能力无可通过记忆积累经验│ 感知 │ ───→ │ 推理 │ ───→ │ 行动 │↑ │ ││ ↓ ││ 记忆 │ ←─── │ 反思 │ ←─────────┘感知(Perception)

qq_20096229的博客 760

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

数据结构之串定义串的基本操作KMP算法实现(串的唯一重点) 定义串的基本操作 //这儿的下标默认是1开始 #include<iostream> #include<cstring> #include<stdlib.h> using namespace std; #define MAXLEN 255 typedef struct{ char ch[MAXLEN]; int length; }SString;//定长顺序存储表示 typedef st

起个名字真难的博客 3493

用Multisim仿真AD630锁定放大器:从2012年电赛A题实战到避坑指南

本文详细介绍了如何使用Multisim仿真AD630锁定放大器,从2012年电赛A题实战出发,提供完整的电路搭建、参数优化及避坑指南。重点解析AD630的开关调制架构和双相位检测的工程实现,帮助读者在强噪声背景下有效提取微弱信号,提升电子设计竞赛和工程实践中的信号处理能力。

weixin_42549451的博客 203

CIC-IDS数据集特征介绍

###1、简介 通信安全机构(CSE)与加拿大网络安全研究所(CIC)合作项目,该项目对自1998年以来现有的11个数据集的评估表明,大多数数据集(比如经典的KDDCUP99,NSLKDD等)已经过时且不可靠。其中一些数据集缺乏流量多样性和容量,一些数据集没有涵盖各种已知的攻击,而另一些数据集将数据包有效载荷数据匿名化,这不能反映当前的趋势。有些还缺少特征集和元数据。 CIC-IDS-2017数据集包含良性和最新的常见攻击,类似真实世界数据(PCAPs)。 它的数据采集截至2017...

蓝亚之舟的博客 3万+

数据结构【字符串】相关代码(数据结构笔试、复测、Leecode、牛客)

提示:这些是自己整理 可以借鉴 也可能存在错误 欢迎指正 字符串基础知识题目简单中等1.大数加法最长公共子串 基础知识 题目 简单 中等 1.大数加法 描述 以字符串的形式读入两个数字,编写一个函数计算它们的和,以字符串形式返回。 数据范围:s.length,t.length≤100000,字符串仅由’0’~‘9’构成 要求:时间复杂度 O(n) 思路: 大整数相加,就可以按照整数相加的方式,从个位开始,逐渐往上累加,换到字符串中就是从两个字符串的末尾开始相加。 class Solution { .

weixin_44177594的博客 2195

MIA文献阅读 —— 深度学习在医学图像分析中的最新进展及临床应用【2024】_再现性;深度学习

coderVAEVAEVAE) (Kingma威林,2014)在概率性的工作方式学习观测数据之间的映射空间x∈Rmx∈R^mx∈Rm 和潜在的空间z∈Rnmnz∈Rn(m>>n)。作为一个潜变量模型,VAEVAEVAE制定这个问题作为观察样品的最大化对数似logpxlog∫px∣zpzdzpx∣zp (x | z)p(x∣z)可以很容易地使用神经网络建模,和pzp (z)

2401_84181704的博客 1243

《数据结构教程(李春葆主编 第五版)》第四章源代码—串

顺序串基本运算的算法 #include <stdio.h> #define MaxSize 100 typedef struct { char data[MaxSize]; int length; //串长 } SqString; void StrAssign(SqString &s,char cstr[]) //字符串常量赋给串s { int i; for (i=0;cstr[i]!='\0';i++) s.data[i]=cstr[i]; s.length=i;

Miss Z的博客 994

命名管道和匿名管道

我们知道进程间是可以通信的。可以达到数据传输、资源共享、事件通知、进程控制等目的。进程间通信主要包括管道、系统IPC,套接字等。 管道分为三种: 普通管道:一是单工,只能单向传输 ,二是仅能在父子进程或者兄弟进程中使用。 流管道:去除了第一种限制,为半双工,可以双向传递, 命名管道:去除了第二种限制 ,可以在很多并不相关的进程 中进行通信。 1、普通管道 int pipe(int f...

ffsiwei的博客 1万+

【同等学力】01-逻辑符号表达

F(x): x是确诊者,G(x):x有症状F(x): x是老人,G(x):x是宠物,L(x,y): x喜欢y。

super_mochi1 1881

【数据结构】——【字符串】算法代码实现(C/C++语言实现)(整理不易,请多关注)

目录 1.字符串的顺序表示 2.字符串的链接表示 1.字符串的顺序表示 #include<stdio.h> #include<stdlib.h> #define MAXNUM 80 /* 串允许的最大字符个数。根据需要定义 */ struct SeqString { /* 顺序串的类型 */ int n; /*串的长度n<MAXNUM */ char c[MA...

qq_51795098的博客 647

单细胞转录组数据分析中的基因ID注释转换问题:如何解决才能注释所有的UMIcount数据?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值。

**My Coding Family** 1129

C语言数据结构第四章实验报告

C语言数据结构第四章实验报告 去发现同类优质开源项目:https://gitcode.com/ 简介 本实验报告为C语言数据结构第四章的实践项目,主要包括三个部分的算法设计与实现: 统计输入字符串中各个不同字符出现的频度,并将统计结果存入文件。 实现一个递归算法,以实现字符串的逆序存储,且不另设串存储空间。 设计一个算法,实现将字符串t插入到字符串s中,指定插入位置为pos。 实验内容 字符频...

gitblog_06775的博客 827

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

数据结构 第四章 字符串

数据结构 第四章 字符串

m0_65207522的博客 1097

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

数据结构c语言版第四章题库,严蔚敏《数据结构(c语言版)习题集》答案第四章 串...

严蔚敏《数据结构(c语言版)习题集》答案第四章 串第四章 串4.10void String_Reverse(Stringtype s,Stringtype &r)//求s的逆串r{StrAssign(r,''); //初始化r为空串for(i=Strlen(s);i;i--){StrAssign(c,SubString(s,i,1));StrAssign(r,Concat(r,c)); /...

weixin_32488761的博客 748

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

PTA数据结构与算法-第四章——字符串

文章目录第一章——褚论第二章——线性表第三章——栈与队列第四章——字符串判断题单选题 第一章——褚论 第二章——线性表 第三章——栈与队列 第四章——字符串 判断题 1-10 如果strcmp(s1,s2)返回的结果为0,表示字符串s1和s2不相同。 F 当s1<s2时,返回值<0; 当s1=s2时,返回值=0; 当s1>s2时,返回值>0; 1-4 假设模式串是abababaab,则KMP模式匹配算法中的next[j] = 0 1 1 2 3 4 5 6 2。 next

Eumenides_Suki的博客 6832

C语言数据结构第四章—— KMP算法

真正意义上学的第一个算法

绿豆汤的博客 689

【最详细】数据结构(C语言版 第2版)第四章课后习题答案 严蔚敏 等 编著

第 4 章串、数组和广义表 1.选择题 ( 1)串是一种特殊的线性表,其特殊性体现在() 。 A .可以顺序存储 B .数据元素是一个字符 C.可以链式存储 D .数据元素可以是多个字符若 答案: B ( 2)串下面关于串的的叙述中, ()是不正确的? A.串是字符的有限序列 B.空串是由空格构成的串 C.模式匹配是串的一种重要运算 D .串既可以采用顺序存储,也可以采用链式存储 答案: B 解释:空格常常是串的字符集合中的一个元素,有一个或多个空格组成的串成为空格 串,零个字符的串成为空串,其长度为零。

weixin_43899069的博客 5万+

数据结构,第四章串以及KMP算法

串(string)是由零个或多个字符组成的有限序列。一般记为S′a1a2⋯an′n⩾0S′a1​a2​⋯an′​n⩾0其中,S 是串名,单引号括起来的字符序列是串的值;aia_iai​可以是字母、数字或其他字符;串中字符的个数nnn称为串的长度。n0n=0n0时的串称为空串(用∅∅表示)。串中任意多个连续的字符组成的子序列称为该串的子串,包含子串的串称为主串。某个字符在串中的序号称为该字符在串中的位置。

stardust_521的博客 1491

数据结构学习记录:第四章:串

此文章为作者本人搬运至该网站。

Everybodynow的博客 1079

【C语言笔记】第四章 数组

@第五章 数组和其他数据表示 4.1一维数组 一、定义 1.数组是一组有序数据的集合,数组中和数据的排列是有一定规律的,下标代表数据在数组中的序号。 2.用一个数组名(如s)和下标来唯一地确定数组中的元素,如s15代表第十五个数据。 3.数组中的每一个元素都属于同一个数据类型,不能把不同类型的数据放在同一个数组中。 二、优点:方便访问数组中的第i个元素。 三、定义格式: 类型符 数组名[常量表达式...

z1446731325的博客 621

数据结构/第四章 串/数据结构习题/串的习题/考研/期末复习

A. 除第一个字符外,字符串的所有尾部子串B. 除最后一个字符外,字符串的所有头部子串C. 字符串的第一个字符D. 字符串的最后一个字符A. 不 B. 最长 C. 最短 D. 平均。

qq_45767840的博客 818

【数据结构】数据结构系列学习笔记——导航篇

数据结构的选择通常基于数据的使用模式,包括数据元素之间的关系、数据的存储方式、以及对数据的操作类型(如检索、更新、排序等)。数组(Array)、栈(Stack)、队列(Queue)、链表(Linked List)、树(Tree)、图(Graph)、堆(Heap)、散列表(Hash)等等。是相互之间存在的一种或者多种的特定关系的数据元素的集合,换句话说,数据结构是带结构。就是指数据元素之间的关系。是组成数据元素的,有独立含义的,不可分割的最小单位。是性质相同的数据元素的集合,是数据的一个子集。

铁匠匠匠的博客 1628

第四章 串、数组和广义表——课后习题解练【数据结构(c语言版 第2版)】

答案:BBCAB。

naozibuok的博客 388

【数据结构】第四章 串

【数据结构】第四章 串 1.基本概念 字符串是一种特殊的线性表,其特殊性在于组成线性表的每个元素就是一个单字符。 串(String)是零个或多个字符组成的有限序列。 子串:串中任意个连续的字符组成的子序列称为该串的子串 主串:包含子串的串相应地称为主串。 子串在主串中的位置则以子串的第一个字符在主串中的位置来表示。 只有当两个串的长度相等,并目每个对应位置的字符都相等时才相等。 (1)定长顺序串 ...

sinat_33438008的博客 908
上一篇: 数据结构应用题第三章栈和队列代码c
下一篇: 数据结构第五章树部分代码c
@@老胡
博客等级 码龄7年 291粉丝 184原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值