1、采用书上第73页定义的串的定长顺序存储表示,编程实现串的下列基本操作。
(1)串联接 (2)求子串
2、采用书上第75页定义的串的堆分配存储表示,编程实现串的下列基本操作。
(1)生成串 (2)取串长度 (3)清空串 (4)串联接
(5)求子串 (6)复制串 (7)串插入 (8)串删除
3、采用书上第73页定义的串的定长顺序存储表示,编程实现串的模式匹配算法及其改进算法。
例题一:
#include <stdio.h>
#define MAXSTRLEN 255
typedef unsigned char SString[MAXSTRLEN + 1];
#include <stdarg.h>
#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#define TRUE 1
#define ERROR 0
#define OK 2
#define FALSE 0
typedef int Status;
using namespace std;
Status Concat(SString& T, SString S1, SString S2) {
int uncut; int i;
if (S1[0] + S2[0] <= MAXSTRLEN) {
for (i = 1; i <=S1[0]; i++)
{
T[i] = S1[i];
T[S1[0] + i] = S2[i];
T[0] = S1[0] + S2[0];
uncut = TRUE;
}
//T[1..S1[0]] = S1[1..S1[0]];
//T[S1[0] + 1..S1[0] + S2[0]] = S2[1..S2[0]];
//T[0] = S1[0] + S2[0]; uncut = TRUE;
}
else if (S1[0] < MAXSTRLEN) {
for (i = 1; i <MAXSTRLEN; i++)
{
T[i] = S1[i];
}
for (i = 1; i < MAXSTRLEN - S1[0]; i++)
{
T[S1[0] + i] = S2[i];
}
//T[1..S1[0]] = S1[1..S1[0]];
//T[S1[0] + 1..MAXSTRLEN] = S2[1..MAXSTRLEN - S1[0]];
T[0] = MAXSTRLEN; uncut = FALSE;
}
else {
for (i = 1; i < MAXSTRLEN; i++)
{
T[i] = S1[i];
}
uncut = FALSE;
}
return uncut;
}
Status SubString(SString& Sub, SString S, int pos, int len)
{
int i;
if (pos<1 || pos>S[0] || len<0 || len>S[0] - pos + 1)
return ERROR;
for (i = 1; i <=len; i++)
{
Sub[i]=S[pos+i];
}
//Sub[1..len] = S[pos..pos + len - 1];
Sub[0] = len; return OK;
}
void main()
{
SString T, S1, S2, S, Sub;
int i, pos, len;
printf("输入串S1的长度:");
scanf("%d", &S1[0]);
getchar();
printf("输入串S1的值:");
for (i = 1; i <= S1[0]; i++)
{
scanf("%c",&S1[i]);
}
printf("输出串S1的值:\n");
for (i = 1; i <= S1[0]; i++)
{
printf("%c", S1[i]);
}
printf("\n");
printf("输入串S2的长度");
scanf("%d", &S2[0]);
getchar();
printf("输入串S2的值:\n");
for (i = 1; i <= S2[0]; i++)
{
scanf("%c", &S2[i]);
}
printf("输出串S2的值:\n");
for (i = 1; i <= S2[0]; i++)
{
printf("%c", S2[i]);
}
printf("\n");
Concat(T, S1, S2);
printf("输出串S1和串S2的联结串T的值:\n");
for (i = 1; i <= T[0]; i++)
{
printf("%c", T[i]);
}
printf("\n");
printf("输入串S的长度:");
scanf("%d", &S[0]);
getchar();
printf("输入串S的值:");
for (i = 1; i <= S[0]; i++)
{
scanf("%c", &S[i]);
}
printf("输出串S的值:\n");
for (i = 0; i <= S[0]; i++)
{
printf("%c",S[i]);
}
printf("\n");
printf("输入串S的字串Sub的开始字符位置:");
scanf("%d", &pos);
printf("输入串S的字串Sub的长度:");
scanf("%d", &len);
SubString(Sub, S, pos, len);
printf("输出子串Sub的值:\n");
for (i = 1; i <= Sub[0]; i++)
{
printf("%c", Sub[i]);
}printf("\n");
}
例题二:
#include <stdarg.h>
#include <stdio.h>
#include<iostream>
#include<stdlib.h>
#define TRUE 1
#define ERROR 0
#define OK 2
#define FALSE -1
#define OVERFLOW -3
typedef int Status;
using namespace std;
typedef struct {
char* ch;
int length;
}HString;
Status StrAssign(HString& T, char* chars) {
int i;
T.ch=(char*)malloc(100*sizeof(char));
if(!T.ch) return FALSE;
T.length=0;
for(i=0;chars[i]!='\0';i++)
{T.length++;
T.ch[i]=chars[i];}
return 0;
}//生成串
Status StrCopy(HString& S, HString T)
{ S.ch=(char*)malloc(100*sizeof(char));
if(!S.ch) return FALSE;
S.length=T.length;
int i = 0;
for (i = 0; i < T.length; i++)
S.ch[i] = T.ch[i];
return OK;
}//复制串
Status StrCompare(HString S, HString T)
{
if (S.length > T.length)
return 1;
if (S.length == T.length)
return 2;
if (S.length < T.length)
return 0;
}//比较串长度
Status StrLength(HString S)
{
return S.length;
}//求串长
Status ClearString(HString &S)
{
if (S.ch) { free(S.ch); S.ch = NULL; }
S.length = 0;
return OK;
}//清空串
Status Concat(HString& T, HString S1, HString S2)
{
if (T.ch)free(T.ch);
if (!(T.ch = (char*)malloc(100* sizeof(char))))
exit(OVERFLOW);
for (int i = 0; i < S1.length; i++)
T.ch[i] = S1.ch[i];
T.length = S1.length + S2.length;
for (int i = 0; i < T.length - S1.length; i++)
{
T.ch[S1.length+i] = S2.ch[i];
}
return OK;
}//串联接
Status SubString(HString& Sub, HString S, int pos, int len)
{
int i;
if (pos<1 || pos>S.length || len<0 || len>S.length - pos + 1)
return ERROR;
if (Sub.ch)free(Sub.ch);
if (!len) {
Sub.ch = NULL; Sub.length = 0;
}
else {
Sub.ch = (char*)malloc(len * sizeof(char));
for (i = 0; i < len; i++)
{
Sub.ch[i] = S.ch[pos - 1 + i];
}
Sub.length = len;
}
return OK;
}//求子串
Status StrInsert(HString& S, int pos, HString T)
{
if (pos<1 || pos>S.length + 1)return ERROR;
if (T.length) {
if (!(S.ch = (char*)realloc(S.ch, (S.length + T.length) * sizeof(char))))
exit(OVERFLOW);
for (int i = S.length - 1; i >= pos - 1; --i)
{
S.ch[i + T.length] = S.ch[i];
}
for (int i = 0; i < T.length; i++)
S.ch[pos - 1 + i] = T.ch[i];
S.length += T.length;
}
return OK;
}//串插入
Status StrDelete(HString& S, int pos, int len)
{
int i,j;
if(pos<1||pos+len>S.length||len<0) return FALSE;
for(i=pos-1;i<pos-1+len;i++)
S.ch[i]=' ';
j=pos-1;
for(i=pos-1+len;i<S.length;i++)
{
S.ch[j++]=S.ch[i];
S.ch[i]=' ';}
S.length=S.length-len;
return 0;
}//串删除
Status DispStr(HString S){
int i;
for(i=0;i<S.length;i++)
printf("%c",S.ch[i]);
printf("\n");
}//串输出
int main()
{
HString T, S, S1, S2, Sub;
int pos, len;
char* a, str[100],*chars = "House";
T.ch = NULL;
S.ch = NULL;
S1.ch = NULL;
S2.ch = NULL;
Sub.ch = NULL;
printf("输出字符串常量chars:%s\n", chars);
StrAssign(T, chars);
printf("生成一个其值等于串常量chars的串T:");
DispStr(T);
StrCopy(S, T);
printf("将串T的值复制到串S中,串S的值为:");
DispStr(S);
printf("串S的长度为:%d\n", StrLength(S));
printf("比较串S和串T的大小:%d\n", StrCompare(S, T));
printf("将串S清为空串!\n");
ClearString(S);
printf("串S的值为:");
DispStr(S);
printf("串T的值为:");
DispStr(T);
a = str;
printf("输入串S1:");
scanf("%s", a);
StrAssign(S1, a);
printf("串S1的值为:");
DispStr(S1);
printf("输入串S2:");
scanf("%s", a);
StrAssign(S2, a);
printf("串S2的值为:");
DispStr(S2);
printf("返回由S1和S2联接而成的新串S:");
Concat(S, S1, S2);
DispStr(S);
printf("输出串S的子串的起始字符位置:");
scanf("%d", &pos);
printf("输入串S的子串的长度:");
scanf("%d", &len);
printf("用Sub返回串S的第%d个字符起长度为%d的子串:", pos, len);
SubString(Sub, S, pos, len);
DispStr(Sub);
printf("输入串S的插入位置:");
scanf("%d", &pos);
printf("在串S的第%d个位置插入串T,插入后串S的值为:", pos);
StrInsert(S, pos, T);
DispStr(S);
printf("删除串S删除的子串的起始字符位置:");
scanf("%d", &pos);
printf("输入串S删除的子串的长度:");
scanf("%d", &len);
printf("串S中删除第%d个字符起长度为%d的子串,删除后S的值为:", pos, len);
StrDelete(S, pos, len);
DispStr(S);
}
第三题:
#include <stdio.h>
#define MAXSTRLEN 255
typedef unsigned char SString[MAXSTRLEN + 1];
#include <stdarg.h>
#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#define TRUE 1
#define ERROR 0
#define OK 2
#define FALSE 0
typedef int Status;
using namespace std;
Status Index(SString S,SString T,int pos) {
int i=pos;int j=i;
while(i<=S[0]&&j<=T[0])
{
if(S[i]==T[j]){++i;++j;}
else{i=i-j+2;j=1;}
}
if(j>T[0])return i-T[0];
else return 0;
}
int main()
{
SString T, S1, S2, S, Sub;
int i, pos, len,post;
printf("输入串S1的长度:");
scanf("%d", &S1[0]);
getchar();
printf("输入串S1的值:");
for (i = 1; i <= S1[0]; i++)
{
scanf("%c",&S1[i]);
}
printf("输出串S1的值:\n");
for (i = 1; i <= S1[0]; i++)
{
printf("%c", S1[i]);
}
printf("\n");
printf("输入串S2的长度:");
scanf("%d", &S2[0]);
getchar();
printf("输入串S2的值:\n");
for (i = 1; i <= S2[0]; i++)
{
scanf("%c", &S2[i]);
}
printf("输出串S2的值:\n");
for (i = 1; i <= S2[0]; i++)
{
printf("%c", S2[i]);
}
printf("\n");
printf("输入字符串S2在S1中的待匹配位置:\n");
scanf("%d",&pos);
Index(S1,S2,pos);
post=Index(S1,S2,pos);
printf("匹配结果:");
if(post==0)
printf("二者不匹配") ;
else
printf("二者在S1第%d位置开始匹配",post);
}
改进算法:
#include <stdio.h>
#define MAXSTRLEN 255
typedef unsigned char SString[MAXSTRLEN + 1];
#include <stdarg.h>
#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#define TRUE 1
#define ERROR 0
#define OK 2
#define FALSE 0
typedef int Status;
using namespace std;
void get_next(SString T, int next[])
{
int i = 1, j = 0; next[1] = 0;
while (i<T[0])
{
if (j == 0 || T[i] == T[j]) { i++; j++; next[i] = j; }
else j = next[j];
}
}
Status Index(SString S,SString T,int pos) {
int i=pos;int j=i;int next[255];
get_next(T,next);
while(i<=S[0]&&j<=T[0])
{
if(S[i]==T[j]){++i;++j;}
else{i=i-j+2;j=1;}
}
if(j>T[0])return i-T[0];
else return 0;
}
int main()
{
SString T, S1, S2, S, Sub;
int i, pos, len,post;
printf("输入串S1的长度:");
scanf("%d", &S1[0]);
getchar();
printf("输入串S1的值:");
for (i = 1; i <= S1[0]; i++)
{
scanf("%c",&S1[i]);
}
printf("输出串S1的值:\n");
for (i = 1; i <= S1[0]; i++)
{
printf("%c", S1[i]);
}
printf("\n");
printf("输入串S2的长度:");
scanf("%d", &S2[0]);
getchar();
printf("输入串S2的值:\n");
for (i = 1; i <= S2[0]; i++)
{
scanf("%c", &S2[i]);
}
printf("输出串S2的值:\n");
for (i = 1; i <= S2[0]; i++)
{
printf("%c", S2[i]);
}
printf("\n");
printf("输入字符串S2在S1中的待匹配位置:\n");
scanf("%d",&pos);
Index(S1,S2,pos);
post=Index(S1,S2,pos);
printf("匹配结果:");
if(post==0)
printf("二者不匹配") ;
else
printf("二者在S1第%d位置开始匹配",post);
}