目录:
实现方法:
/*--------------------------方法区------------------------*/
Status StringIsEmpty(HString *str);
void InitString(HString *str);
Status StrAssign(HString *str,char *chars); //串赋值操作
void PrintString(HString *str); // 打印字符串
Status StrCopy(HString *str1,HString *str2); //复制 str1 到 str2 中
Status StringCompare(HString *str1,HString *str2); //比较字符串大小
Status StringConcat(HString *str1,HString *str2,HString *contact); //连接两个字符串
Status StringSub(HString *cut,HString *str,int stare,int end); //截取字符串
Status IndexString(HString *father,HString *child,int pos); //返回从pos位置开始的字串在父串中的位置
void DeleteString(HString *str,int stare,int end); //删除一定位置上的字符
void InsertString(HString *str,HString *insert,int pos); //在指定位置插入字符串
void ReplaceString(HString *str,HString myold,HString newstring); //将str中myold字符串替换为newstring
void ClearString(HString *str); //清空字符串
void BFCompare(HString *parent,HString *child,int pos); //BF算法
void Get_Next(HString *child,int *next); //返回next数组(部分匹配表)
int KMPCompare(HString *parent,HString *child,int pos); //KMP算法
.h 文件:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TRUE 1
#define FALSE 0
#define EQ 0
#define GT 1
#define LT -1
#define OVERFLOW -2
#define UNDERFLOW -3
#define MAX_SIZE 1024
#define OK 1
#define ERROR 0
typedef int Status;
typedef struct
{
char *ch;
int length;
}HString;
.c文件:
初始化:
void InitString(HString *str)
{
str->ch = NULL;
str->length = 0;
}
字符串赋值:
Status StrAssign(HString *str,char *chars)
{
int len = strlen(chars);
if(!len)
{
return ERROR;
}
str->ch = (char *)malloc(sizeof(char) * len);
if(!str ->ch)
{
exit(OVERFLOW);
}
for(int i = 0;i < len;i++)
{
str->ch[i] = chars[i];
}
str->length = len;
return OK;
}
打印字符串内容:
void PrintString(HString *str)
{
if(str->length == 0 || !str->ch)
{
printf("字符串为空\n");
return ;
}
printf("-------------------------输入串为:----------------------\n");
for(int i = 0;i < str->length;i++)
{
printf("%c",str->ch[i]);
}
printf("\n");
}
复制str1的内容到str2中:
Status StrCopy(HString *str1,HString *str2)
{
InitString(str2);
if(StringIsEmpty(str1))
{
printf("父串为空 \n");
return FALSE;
}
str2->ch = (char *)malloc(sizeof(char) * str1->length);
if(!str2->ch)
{
exit(OVERFLOW);
}
printf("---------------------复制元素为:-----------------------\n");
for(int i = 0;i< str1->length;i++)
{
str2->ch[i] = str1->ch[i];
printf("%c",str2->ch[i]);
}
printf("\n");
str2->length = str1->length;
return OK;
}
判断字符串是否为空:
Status StringIsEmpty(HString *str)
{
if(str->length == 0 || !str->ch)
{
return TRUE;
}
return FALSE;
}
字符串比较:
Status StringCompare(HString *str1,HString *str2)
{
for(int i = 0;i < str1->length && i < str2->length;i++)
{
if(str1->ch[i] != str2->ch[i])
{
int m = str1->ch[i] - str2->ch[i];
printf("字符串有不同 : %d\n",m);
return 0;
}
}
int n = str1->length - str2->length;
printf("字符串比较结果为 : %d \n",n);
return 1;
}
字符串拼接:
Status StringConcat(HString *str1,HString *str2,HString *contact)
{
InitString(contact);
contact->length = str1->length + str2->length;
contact->ch = (char *)malloc(sizeof(char) * contact->length);
if(!contact->ch)
{
exit(OVERFLOW);
}
for(int i = 0;i < str1->length;i++)
{
contact->ch[i] = str1->ch[i];
}
for(int i = 0;i < str2->length;i++)
{
contact->ch[str1->length + i] = str2->ch[i];
}
printf("---------------------连接后的串为:------------------------------\n");
for(int i = 0;i < contact->length;i++)
{
printf("%c",contact->ch[i]);
}
printf("\n");
return OK;
}
字符串截取:
Status StringSub(HString *cut,HString *str,int stare,int end)
{
InitString(cut);
if(StringIsEmpty(str))
{
printf("为空\n");
return ERROR;
}
if(stare < 0 || stare > str->length || end < 0 || end > str->length || stare > end)
{
return ERROR;
}
cut->ch = (char *)malloc(sizeof(char) * (end - stare));
if(!cut->ch)
{
printf("退出\n");
exit(OVERFLOW);
}
printf("-----------------截取元素为:----------------------\n");
for(int i = stare;i < end;i++)
{
cut->ch[i] = str->ch[i];
printf("%c",cut->ch[i]);
}
cut->length = end - stare;
printf("\n");
return OK;
}
返回从pos位置开始的字串在父串中的位置:
Status IndexString(HString *father,HString *child,int pos)
{
if(pos < 0)
{
return ERROR;
}
HString *Substr = (HString *)malloc(sizeof(HString) * 1024);
InitString(Substr);
int i = pos; //记录起始位置
int j = 0;
while(i <= father->length)
{
StringSub(Substr,father,i,child->length + j);
if(StringCompare(Substr,child) != 1)
{
i++;
j++;
}
else
{
printf("位置为:%d\n",i);
return i;
}
}
free(Substr);
return 0;
}
删除一定位置上的字符:
void DeleteString(HString *str,int stare,int end)
{
if(StringIsEmpty(str))
{
return ;
}
if(stare < 0 || stare > str->length || end < 0 || end >str->length || stare > end)
{
return ;
}
for(int i = stare - 1;i < end ;i++)
{
str->ch[i] = str->ch[i + (end - stare) + 1];
}
str->length = str->length - (end - stare + 1);
printf("删除后的字符串长度为:%d\n",str->length);
for(int i = 0;i < str->length;i++)
{
printf("%c",str->ch[i]);
}
printf("\n");
}
在指定位置插入字符串:
void InsertString(HString *str,HString *insert,int pos)
{
if(pos < 0 || pos > str->length + 1 || StringIsEmpty(str))
{
return;
}
str->ch = (char *)realloc(str->ch,(sizeof(char)) * (str->length + insert->length));
printf("插入后的字符串为:\n");
for(int i = str->length - 1;i > pos - 1;i--)
{
str->ch[i + insert->length] = str->ch[i];
}
for(int i = 0;i < insert->length;i++)
{
str->ch[i + (pos - 1)] = insert->ch[i];
}
str->length = str->length + insert->length;
printf("长度为:%d\n",str->length);
for(int i = 0;i < str->length;i++)
{
printf("%c",str->ch[i]);
}
printf("\n");
}
将str中myold字符串替换为newstring:
void ReplaceString(HString *str,HString myold,HString newstring)
{
if(StringIsEmpty(str) || StringIsEmpty(&myold));
int pos = 2;
DeleteString(str,pos,4);
InsertString(str,&newstring,2);
printf("--------------%d\n",pos);
}
清空字符串:
void ClearString(HString *str)
{
if(str->ch)
{
free(str->ch);
str->ch = NULL;
}
str->length = 0;
}
BF算法:
void BFCompare(HString *parent,HString *child,int pos)
{
int i = pos; //父串起始位置
int j = 1; //子串起始位置
while(i <= parent->length && j <= child->length)
{
if(parent->ch[i - 1] == child->ch[j - 1])
{
i++;
j++;
}
else
{
i = i - j + 2; //回溯到上次匹配的首位的下一位
j = 1;
}
}
if(j > child->length)
{
printf("子串在父串的起始位置为:%d\n",i- child->length);
return ;
}
printf("匹配失败\n");
}
返回next数组(部分匹配表):
void Get_Next(HString *child,int *next)
{
int j = -1;
int i = 0;
next[0] = -1;
while(i < child->length)
{
if(j == -1 || child->ch[i] == child->ch[j])
{
i++;
j++;
next[i] = j;
}
else
{
j = next[j];
}
}
for(int i = 0;i < child->length;i++)
{
printf("%d",next[i]);
printf("\n");
}
}
KMP算法:
int KMPCompare(HString *parent,HString *child,int pos)
{
int next[255];
Get_Next(child,next);
int i = pos - 1;
int j = 0;
while(i < parent->length && j < child->length)
{
if(j == -1 || parent->ch[i] == child->ch[j])
{
i++;
j++;
}
else
{
j = next[j];
}
}
if(j == child->length)
{
printf("子串在父串的起始位置为:%d\n",(i + 1) - j);
return (i + 1) - j;
}
printf("匹配失败\n");
return 0;
}
声明:此文章为学习笔记,如有侵权请联系删除。