题目
实验6 串的应用
一、【实验目的】
1.掌握串的动态数组存储结构
2.掌握串的模式匹配算法
二、实验内容
- 根据教材中串的动态数组存储方式定义串的数据类型,并实现以下基本操作,并编写测试程序测试以下操作的正确性:
(1)串的初始化
void Initiate(DString *S, int max, char *str)
(2)插入子串
int Insert(DString *S, int pos , DString T)
(3)删除子串
int Delete(DString *S, int pos, int len)
(4)取子串
int SubString(DString *S, int pos, int len, DString *T)
(5)销毁串
void Destroy(DString *S)
(6)串的比较
int CmpString(DString *S, DString *T)
(7)串的模式匹配
int Index(DString *S, DString *T)
测试程序包括如下:
从键盘初始化两个字符串:China
I love !
测试插入子串函数:将China插入之后得到I love China!
测试取子串函数:取出子串love
测试删除子串: 删除子串!
从键盘接收两个子串:用CmpString函数测试两个字符串是否相等,相等和不相等的情况都测试一次。
串的模式匹配:两个字符串This is a beautiful girl和girl进行模式匹配。
substring.h
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct
{
char *str;
int maxLength;
int len;
}DString;
void Initiate(DString *S, int max, char*str) //串的初始化
{
int i;
S->len = strlen(str);
S->maxLength = max;
S->str = (char*)malloc(sizeof(char)*max);
for(i = 0;i < S->len;i++)
{
S->str[i] = str[i];
}
}
int Insert(DString *S, int pos , DString T) //插入子串
{
int i;
char *p;
if(pos < 0)
{
printf("参数pos出错!");
return 0;
}
else
{
if(S->len + T.len > S->maxLength)
p = (char *)realloc(S->str, (S->len+T.len)*sizeof(char));
for(i = S->len-1; i >= pos; i--)
S->str[i+T.len] = S->str[i];
for(i = 0; i < T.len; i++)
S->str[pos+i] = T.str[i];
S->len = S->len + T.len;
return 1;
}
}
int Delete(DString *S, int pos, int len) //删除子串
{
int i;
if(S->len <= 0)
{
printf("数组中未存放字符无元素可删! \n");
return 0;
}
else if(pos < 0 || len < 0 || pos+len > S->len)
{
printf("参数pos和len不合法");
return 0;
}
else
{
for(i = pos+len; i <= S->len-1; i++)
S->str[i-len] = S->str[i];
S->len = S->len - len;
return 1;
}
}
int SubString(DString *S, int pos, int len, DString *T) //取子串
{
int i;
if(pos < 0 || len < 0 || pos+len > S->len)
{
printf("参数pos和len出错!");
return 0;
}
else
{
for(i = 0; i < len; i++)
T->str[i] = S->str[pos+i];
T->len = len;
return 1;
}
}
void Destroy(DString *S) //销毁子串
{
free(S->str);
S->maxLength = 0;
S->len = 0;
}
int CmpString(DString *S, DString *T) //子串的比较
{
if(strcmp(S->str,T->str) == 0)
{
return 0;
}
else
{
return 1;
}
}
int Index(DString *S, DString *T) //串的模式匹配
{
int c_strlen = strlen(S->str);
int d_strlen = strlen(T->str);
int c=0,d=0;
while(c<c_strlen && d<d_strlen){
if(S->str[c]==T->str[d]){
c++;
d++;
}
else{
c = c - d + 1; //这里要回到开始处,然后下一个字符继续开始匹配所以+1;
d = 0;
}
}
return d<d_strlen?-1:c-d;
}
substring.c
#include <stdio.h>
#include <stdlib.h>
#include "substring.h"
int main()
{
int i,j;
printf("初始化:\n");
DString String1;
DString String2;
char ch1Init[100] = "";
char ch2Init[100] = "";
scanf("%s",&ch1Init);
getchar();
scanf("%[^\n]",&ch2Init);
printf("%s\n",ch1Init);
printf("%s\n",ch2Init);
Initiate(&String1,255,ch1Init);
Initiate(&String2,255,ch2Init);
printf("插入:\n");
Insert(&String2, 7, String1);
for(i = 0; i < String2.len; i++)
printf("%c", String2.str[i]);
printf("\n");
printf("取出子串:\n");
SubString(&String2, 2, 4,&String1);
for(i = 0; i < String1.len; i++)
printf("%c", String1.str[i]);
printf("\n");
printf("删除子串: \n");
Destroy(&String1);
Destroy(&String2);
printf("删除成功!\n");
printf("对比匹配:\n");
DString String3;
DString String4;
char ch3Init[100] = "";
char ch4Init[100] = "";
scanf("%s",&ch3Init);
scanf("%s",&ch4Init);
Initiate(&String3,255,ch3Init);
Initiate(&String4,255,ch4Init);
if(CmpString(&String3,&String4) == 0)
{
printf("匹配成功!");
}
else
{
printf("匹配失败!");
}
Destroy(&String3);
Destroy(&String4);
printf("\n");
DString String7;
DString String8;
char ch7Init[100] = "";
char ch8Init[100] = "";
scanf("%s",&ch7Init);
scanf("%s",&ch8Init);
Initiate(&String7,255,ch7Init);
Initiate(&String8,255,ch8Init);
if(CmpString(&String7,&String8) == 0)
{
printf("匹配成功!");
}
else
{
printf("匹配失败!");
}
Destroy(&String7);
Destroy(&String8);
printf("\n");
printf("匹配\"This is a beautiful girl\"和\"girl\": \n");
printf("模式匹配:\n");
DString String5;
DString String6;
String5.str = "This is a beautiful girl";
String6.str = "girl";
if(Index(&String5,&String6))
{
printf("匹配成功!");
}
else
{
printf("匹配失败!");
}
}