串的操作(KMP算法实现)

本文介绍了一组使用C语言实现的基本串处理函数,包括串赋值、串连接、子串提取等操作,并展示了KMP算法的具体实现。这些函数能够帮助理解和掌握串的基本操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以下代码由C编写,VS调试:

#include <stdio.h>
#include <malloc.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -2
typedef int Status;

//串的定义
typedef struct
{
 char *ch;
 int length;
}HString;

//生成一个其值等于串常量chars的串T
Status StrAssign(HString * T,char * chars)
{
 int i;char *c;
 for(i=0,c=chars;*c!='\0';++i){++c;} //求出字符串chars的长度
 if(!i){T->ch=NULL;T->length =0; }
 else{
  if(!(T->ch=(char*)malloc(i*sizeof(char)))) //分配字符串长度的单元
  exit(OVERFLOW);
  T->length =i;
  for(;i>=0;i--) 
  {T->ch [i-1]=*(--c);} 
 }
 return OK;
} //StrAssign

//返回S的元素个数,称为串的长度
int StrLength(HString S)
{
 return S.length ;
} //StrLength

//若S>T返回值>0;等于就是0;
int StrCompare(HString S,HString T)
{
 int i;
 for(i=0;i<S.length &&i<T.length ;++i)
  if(S.ch [i]!=T.ch [i]) return S.ch [i]-T.ch [i];
 return S.length -T.length ;
} //StrCompare

//将S清为空串.
Status ClearString(HString S)
{
 if(S.ch ) {free(S.ch );S.ch =NULL;}
 S.length =0;
 return OK;
} //ClearString

//用T返回由S1和S2链接而成的新串
Status Concat(HString *T,HString S1,HString S2)
{
 char *p,*p1,*p2;int i; char s;
if(!(T->ch=(char*)malloc(S1.length +S2.length *sizeof(char)))) //分配字符串长度的单元
   exit(OVERFLOW);
 p=T->ch ;
 p1=S1.ch ;
 p2=S2.ch ;
 for(i=0;i<S1.length ;i++){
  *p++=*p1++;}
 for(i=0;i<S2.length;i++,p++ ){
  *p=*p2++;  
 }
 T->length =S1.length +S2.length ;
 return OK;
} //Concat

//用Sub返回串S的第pos个字符起长度为 len的字符串,其中,1<=pos<=StrLength(s)且0<=len<=StrLength(S)-pos+1.
Status SubString(HString *Sub,HString S,int pos,int len)
{
 char *p;int i;
 if(pos<1||pos>S.length ||len<0||len>S.length -pos+1)
  return ERROR; 
 if(!len){Sub->ch =NULL;Sub->length =0;}
 else{
  Sub->ch =(char *)malloc(len * sizeof(char));
  p=&S.ch[pos-1];
  for(i=0;i<len;i++)
  {Sub->ch [i]=*p++;}
  Sub->length =len;
 }
 return OK;
} //SubString

//求模式串T的next函数值并存入数组next.
void Get_next(HString T,int *p)
{
 int i=1,j=0;*(p+1)=0;
 while(i<T.length){
  if(j==0||T.ch [i-1]==T.ch [j-1]){++i;++j;*(p+i)=j;}
  else j=*(p+j);
 }
}//Get_next

//利用模式串T的next函数求T在主串S中第pos个字符之后的位置的KMP算法。其中,T非空
int Index_KMP(HString S,HString T,int pos)
{
 int next[15];   
 int i=pos;int j=1;
 Get_next(T,&next);
 while(i<=S.length&&j<=T.length){
  if(j==0||S.ch[i]==T.ch[j]){++i;++j;}
  else j=next[j];
 }
 if(j>T.length) return i-T.length ;
 else return 0;
} //Index_KMP


运行结果如下:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值