C语言数据结构之模式匹配字符串定位问题

C语言数据结构之模式匹配字符串定位问题

主要实现了三种字符串的模式匹配,主要包括字符串子操作的集合,字符串指针回溯,和KMP算法

头文件 

#ifndef INDEXHEAD_H_INCLUDED
#define INDEXHEAD_H_INCLUDED
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXLEN 255
typedef char Sstring[MAXLEN + 1] ;
int StrAssign( Sstring str , char* ps ) ;
int StrLength( Sstring str ) ;
int StrPrint( Sstring str ) ;
int StrCompare( Sstring str1 , Sstring str2 ) ;
int StrSub( Sstring sub , Sstring str , int pos , int length ) ;
int StrIndex1( Sstring str , Sstring sub , int pos ) ;
int StrIndex2( Sstring str , Sstring sub , int pos ) ;
int StrIndex3( Sstring str , Sstring sub , int pos ) ;
int GetNext( Sstring str , int next[] ) ;
#endif // INDEXHEAD_H_INCLUDED

函数实现

#include "indexhead.h"
int StrAssign( Sstring str , char* ps )
{
  int i = 0 ;
  if( strlen( ps ) > MAXLEN )
  {
    printf( "ERROR!\n" ) ;
    exit( 1 ) ;
  }
  str[i++] = strlen( ps ) ;
  while( i <= strlen( ps ) )
  {
    str[i] = *( ps + i - 1 ) ;
    i++ ;
  }
  return 0 ;
}
int StrPrint( Sstring str )
{
  int i = 1 ;
  while( i <= str[0] )
  {
    printf( "%c" , str[i++] ) ;
  }
  printf( "\n" ) ;
  return 0 ;
}
int StrLength( Sstring str )
{
  return str[0] ;
}
int StrCompare( Sstring str1 , Sstring str2 )
{
  int i = 1 ;
  int ret = 0 ;
  while( i <= str1[0] && i <= str2[0] )
  {
    ret = ( unsigned char )str1[i] - ( unsigned char )str2[i] ;
    if( ret < 0 )
    {
      return -1 ;
    }
    else if( ret > 0 )
    {
      return 1 ;
    }
    else
    {
      i++ ;
    }
  }
  if( i <= str1[0] )
  {
    return -1 ;
  }
  else if( i <= str2[0] )
  {
    return 1 ;
  }
  else
  {
    return 0 ;
  }
}
int StrSub( Sstring sub , Sstring str , int pos , int length )
{
  if( pos < 1 || pos > str[0] || length < 0 || length > str[0] - pos + 1 )
  {
    printf( "ERROR!\n" ) ;
    exit( 1 ) ;
  }
  int i = 1 ;
  sub[0] = length ;
  while( i <= length )
  {
    sub[i] = str[pos + i - 1] ;
    i++ ;
  }
  return 0 ;
}
int StrIndex1( Sstring str , Sstring sub , int pos )
{
  pos = 1 ;
  Sstring stemp ;
  while( pos <= str[0] - sub[0] + 1 )
  {
    StrSub( stemp , str , pos , sub[0] ) ;
    if( !StrCompare( stemp , sub ) )
    {
      return pos ;
    }
    pos++ ;
  }
  return 0 ;
}
int StrIndex2( Sstring str , Sstring sub , int pos )
{
  if( pos < 1 || pos > str[0] - sub[0] + 1 )
  {
    printf( "ERROR!\n" ) ;
    exit( 1 ) ;
  }
  int i = pos ;
  int j = 1 ;
  while( ( i <= str[0] - sub[0] + 1 ) && ( j <= sub[0] ) )
  {
    if( str[i] == sub[j] )
    {
      i++ ;
      j++ ;
    }
    else
    {
      i = i - j + 2 ;
      j = 1 ;
    }
  }
  if( j > sub[0] )
  {
    return i - sub[0] ;
  }
  return 0 ;
}
int GetNext( Sstring str , int next[] )
{
  int i = 1 ;
  next[1] = 0 ;
  int j = 0 ;
  while( i < str[0] )
  {
    if( j== 0 || str[i] == str[j] )
    {
      ++i ;
      ++j ;
      next[i] = j ;
    }
    else
    {
      j = next[j] ;
    }
  }
  return 0 ;
}
int StrIndex3( Sstring str , Sstring sub , int pos )
{
  int i = pos ;
  int j = 1 ;
  int next[ sub[0] ] ;
  GetNext( sub , next ) ;
  while( i <= str[0] && j <= sub[0] )
  {
    if( j == 0 || str[i] == sub[j] )
    {
      ++i ;
      ++j ;
    }
    else
    {
      j = next[j] ;
    }
  }
  if( j > sub[0] )
  {
    return i - sub[0] ;
  }
  return 0 ;
}

 测试匹配函数

#include "indexhead.h"
int main()
{
  /*Sstring str ;
  Sstring str1 ;
  char* p = "hello" ;
  StrAssign( str , p ) ;
  StrAssign( str1 , "ahello" ) ;
  StrPrint( str ) ;
  int i = StrLength( str ) ;
  printf( "%d\n" , i ) ;
  int j = StrCompare( str , str1 ) ;
  printf( "%d\n" , j ) ;
  StrSub( str , str1 , 3 , 4 ) ;
  StrPrint( str ) ;*/
  /*Sstring str1 ;//验证StrIndex1()
  Sstring sub ;
  StrAssign( str1 , "shfiodshfdghafhs" ) ;
  StrAssign( sub , "dgh" ) ;
  int i = StrIndex1( str1 , sub , 1 ) ;
  printf( "%d\n" , i ) ;*/
  /*Sstring str1 ;//验证StrIndex2()
  Sstring sub ;
  StrAssign( str1 , "shfiodshfdghafhs" ) ;
  StrAssign( sub , "dgh" ) ;
  int i = StrIndex2( str1 , sub , 1 ) ;
  printf( "%d\n" , i ) ;*/
  Sstring str1 ;//验证StrIndex3()
  Sstring sub ;
  StrAssign( str1 , "shfiodshfdghafhs" ) ;
  StrAssign( sub , "dgh" ) ;
  int i = StrIndex3( str1 , sub , 1 ) ;
  printf( "%d\n" , i ) ;
  return 0;
}

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • C语言实现数据结构串(堆分配存储表示法)实例详解

    堆分配存储表示法 存储结构: 构建堆来存储字符串,本质上是顺序表 实现代码: #include <stdio.h> #include <stdlib.h> #include <string.h> #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define OVERFLOW -2 #define STR_INIT_SIZE 100 #define STRINCREMENT 10 typedef i

  • C数据结构中串简单实例

    C数据结构中串简单实例 运行截图: 实例代码: #include "stdio.h" #include "string.h" #include "stdlib.h" #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define MAXSIZE 40 /* 存储空间初始分配量 */ typedef int Status; /* Status是函数的类型,其值是函数结果状态代码

  • C++语言数据结构 串的基本操作实例代码

    C语言数据结构 串的基本操作实例代码 输出结果: 实现代码: #include<iostream> using namespace std; typedef int Status; #define Max 20 #define OK 1 #define ERROR 0 #define OVERLOE -2 typedef struct//堆分配表示串 { char *ch; int length; }HString; //====================================

  • C语言数据结构实现字符串分割的实例

    C语言数据结构实现字符串分割的实例 以下为"字符串分割"的简单示例: 1. 用c语言实现的版本 #include<stdio.h> /* 根据空格分隔字符串 */ int partition(char *src, char *par, int pos) { int i,j; i = pos; //取到第一个非空格字符 while(src[i] == ' ') { ++i; } if(src[i] != '\0') { j = 0; while((src[i] != '\0'

  • C语言数据结构中串的模式匹配

    C语言数据结构中串的模式匹配 串的模式匹配问题:朴素算法与KMP算法 #include<stdio.h> #include<string.h> int Index(char *S,char *T,int pos){ //返回字串T在主串S中第pos个字符之后的位置.若不存在,则函数值为0. //其中,T非空,1<=pos<=StrLength(s). int i=pos; int j=1; while(i<=S[0]&&j<=T[0]){ i

  • 数据结构基本概念和术语之位字节、字、位串、元素等

    数据结构基本概念和术语:位.字节.字.位串.元素.数据域.物理结构.逻辑结构 位(Bit):"位(bit)"是电子计算机中最小的数据单位.每一位的状态只能是0或1. 字节(Byte):8个二进制位构成1个"字节(Byte)",它是存储空间的基本计量单位.1个字节可以储存1个英文字母或者半个汉字,换句话说,1个汉字占据2个字节的存储空间. 字:"字"由若干个字节构成,字的位数叫做字长,不同档次的机器有不同的字长.例如一台8位机,它的1个字就等于1个

  • JavaScript数据结构中串的表示与应用实例

    本文实例讲述了JavaScript数据结构中串的表示与应用.分享给大家供大家参考,具体如下: 类似于线性表的顺序存储结构,用一组地址连续的存储单元存储串值的字符序列.下面我们以串联接为例,讲解一下这种存储结构时串的操作.JavaScript自带有concat方法,该方法返回字符串值,该值包含了两个或多个提供的字符串的连接. 其实思路很简单,就是将第二个串拼接在第一个串后面,代码如下 <!DOCTYPE html> <html> <head> <meta chars

  • C语言数据结构之动态分配实现串

    C语言数据结构之动态分配实现串 说明:堆分配存储实现串时,串并不是以'\0', 而是用数据项int length来表示的,所以和传统的c语言操作字符串有所不同. 头文件 #ifndef PILEHEAD_H_INCLUDED #define PILEHEAD_H_INCLUDED #include <stdio.h> #include <stdlib.h> typedef struct { char* ch ; int len ; }HString ; int StrAssign(

  • C语言数据结构之模式匹配字符串定位问题

    C语言数据结构之模式匹配字符串定位问题 主要实现了三种字符串的模式匹配,主要包括字符串子操作的集合,字符串指针回溯,和KMP算法 头文件  #ifndef INDEXHEAD_H_INCLUDED #define INDEXHEAD_H_INCLUDED #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXLEN 255 typedef char Sstring[MAXLEN + 1

  • c语言 数据结构实现之字符串

    c语言 数据结构实现之字符串 串采用定长顺序存储结构(由c4-1.h定义)的基本操作(13个),包括算法4.2,4.3,4.5   实现效果图: #include <stdio.h> #include <string.h> #include <malloc.h> // SString是数组,故不需引用类型 #define OK 1 #define TRUE 1 #define FALSE 0 #define ERROR 0 #define INFEASIBLE -1 #

  • C语言 数据结构与算法之字符串详解

    目录 串的定义 串的比较 串的抽象数据类型 串的初始化 相关定义初始化 定长类初始化 串的堆式顺序存储结构(Heap) 初始化堆字符串 赋值操作 比较两个堆字符串的大小 串的定义 零个或多个字符组成的有限序列 串的比较 串的比较实际上是在比较串中字符的编码 存在某个k < min(n,m),使得ai = bi (i = 1,2,3,4..k) 如果 ak < bk  -->  那么srt1 < srt2 (反之也成立) 除去相等的字符,在第一个不相等的字符位置以Ascii码进行比较

  • C语言数据结构之中缀树转后缀树的实例

    C语言数据结构之中缀树转后缀树的实例 对于一个中缀表达式 a+b*c*(d-e/f) 转换成后缀是这样的形式 abc*def/-+ 后缀表达式是相当有用处的,转换成后缀表达式后求值会简单很多.那么该如何转换呢? 网上关于这方面的资料一搜一大把,每本数据结构的书中都会提及这个算法,在这个算法中,用到 栈 这个数据结构. 1,关键是比较运算符的优先级,谁的优先级高,谁就出现在前面上面的表达式中,有括号的时候括号优先级最高,*/次之,+-最后. 在上面的表达式中+的优先级不如*的高,因此,在后缀表达式

  • Golang语言如何高效拼接字符串详解

    目录 01.介绍 02.操作符 + 03.strings.Join 方法 04.fmt.Sprint 方法 05.bytes.Buffer 类型 06.strings.Builder 类型 07.总结 01.介绍 在编程语言中,字符串是一种重要的数据结构.在 Golang 语言中,因为字符串只能被访问,不能被修改,所以,如果我们在 Golang 语言中进行字符串拼接操作,Golang 需要进行内存拷贝. 如果读者朋友们了解过 Golang 语言内存管理的相关知识,就会知道内存拷贝会带来性能消耗.

  • C语言 数据结构之数组模拟实现顺序表流程详解

    目录 线性表和顺序表 线性表 顺序表 静态顺序表 动态顺序表 代码已经放在Gitee上,需要可以小伙伴可以去看看 用C语言数组模拟实现顺序表 Gitee 线性表和顺序表 线性表 线性表(linear list)是n个具有相同特性的数据元素的有限序列,这是我们广泛使用的数据结构. 线性表在逻辑上是线性结构,也就说是连续的一条直线.但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储. 常见的线性表:顺序表.链表.栈.队列.字符串- 顺序表 顺序表是用一段物理地址连

  • C语言数据结构线性表教程示例详解

    目录 线性表 顺序表 线性表 数据结构里我们时常看到什么什么表,线性表是最基本.最简单.也是最常用的一种数据结构,其他各种表的万恶之源就是这个线性表,他是个啥其实顾名思义: 一个线性表是n个具有相同特性的数据元素的有限序列.数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的(注意,这句话只适用大部分线性表,而不是全部.比如,循环链表逻辑层次上也是一种线性表(存储层次上属于链式存储,但是把最后一个数据元素的尾指针指向了首位结点). 说的这么复杂其实就是

随机推荐