给个程序过来!!谢谢了
[此贴子已经被作者于2007-1-6 22:25:50编辑过]
#include "stdafx.h"
#include "iostream.h"
#include "stdio.h"
#define Null 0
//定义串的链存储结构
typedef struct Chuck{
char ch;
struct Chuck *next;
}Chuck;
typedef struct {
Chuck *head,*tail;
int length;
}Hstring;
void init_Hstring(Hstring &T);
//删除pos结点后面length长度的字符串
void delete_pos(Hstring &S,Chuck *pos,int length);
//pos结点后面插入length长度的字符串
void insert_pos(Hstring &S,Chuck *pos,int length);
//模式匹配
int Index_KMP(Hstring &S,Hstring &T,int pos);
void get_next(Hstring &T,int next[]);
void init_Hstring(Hstring &T){
T.head=T.tail =new Chuck;
T.head->next =Null;
T.length =0;
}
void delete_pos(Hstring &S,Chuck *pos,int length){
Chuck *p,*q;
p=S.head ;
while(p->next !=pos)
p=p->next;
q=p;
for(int i=0;i<length;i++)
p=p->next ;
S.length-=length;
}
int Index_KMP(Hstring &S,Hstring &T,int pos){
int i=pos,j=1;
int next[51];
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;
}
void get_next(Hstring &T,int next[]){
int i=1,j=0;
next[1]=0;
while(i<T.length){
if(j==0||T.ch[i]==T.ch[j]){
++i;++j;next[i]=j;
}
else
j=next[j];
}
}
int main(int argc, char* argv[])
{
Hstring S,T;
char *p="Please Input ";
char *q="Error: S.length<T.length";
int pos=1,tag;
init_Hstring(S);
init_Hstring(T);
cout<<p<<"S:"<<endl; //endl,强制输出
for(int k=1;(S.ch[k]=getchar())!='\n';k++);
S.ch[k]='\0';
S.length=k-1;
cout<<p<<"T:"<<endl;
for(k=1;(T.ch[k]=getchar())!='\n';k++);
T.ch[k]='\0';
T.length=k-1;
if(S.length>=T.length)
while(pos<=S.length-T.length+1){
tag=Index_KMP(S,T,pos);
if(!tag)
break;
else
{delete_pos(S,tag,T.length);
pos=1;}
}
else
{cout<<q<<endl;return 0;}
//输出结果
for(k=1;S.ch[k]!='\0';k++)
cout<<S.ch[k]<<" ";
cout<<endl;
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#define MAX_LEN_OF_STR 30 // 字符串的最大长度
typedef struct String // 这里需要的字符串数组,存放字符串及其长度
{
char str[MAX_LEN_OF_STR]; // 字符数组
int length; // 字符串的实际长度
}String, *PString;
// 得到字符串的next数组
void GetNextArray(PString pstr, int next[])
{
assert(NULL != pstr);
assert(NULL != next);
assert(pstr->length > 0);
// 第一个字符的next值是-1,因为C中的数组是从0开始的
next[0] = -1;
for (int i = 0, j = -1; i < pstr->length - 1; )
{
// i是主串的游标,j是模式串的游标
// 这里的主串和模式串都是同一个字符串
if (-1 == j || // 如果模式串游标已经回退到第一个字符
pstr->str[i] == pstr->str[j]) // 如果匹配成功
{
// 两个游标都向前走一步
++i;
++j;
// 存放当前的next值为此时模式串的游标值
next[i] = j;
}
else // 匹配不成功j就回退到上一个next值
{
j = next[j];
}
}
}
// KMP字符串模式匹配算法
// 输入: S是主串,T是模式串,pos是S中的起始位置
// 输出: 如果匹配成功返回起始位置,否则返回-1
int KMP(PString S, PString T, int pos)
{
assert(NULL != S);
assert(NULL != T);
assert(pos >= 0);
assert(pos < S->length);
if (S->length < T->length)
return -1;
printf("主串\t = %s\n", S->str);
printf("模式串\t = %s\n", T->str);
int *next = (int *)malloc(T->length * sizeof(int));
// 得到模式串的next数组
GetNextArray(T, next);
int i, j;
for (i = pos, j = 0; i < S->length && j < T->length; )
{
// i是主串游标,j是模式串游标
if (-1 == j || // 模式串游标已经回退到第一个位置
S->str[i] == T->str[j]) // 当前字符匹配成功
{
// 满足以上两种情况时两个游标都要向前进一步
++i;
++j;
}
else // 匹配不成功,模式串游标回退到当前字符的next值
{
j = next[j];
}
}
free(next);
if (j >= T->length)
{
// 匹配成功
return i - T->length;
}
else
{
// 匹配不成功
return -1;
}
}