一、实验目的 串的应用,结合应用实例,深入理解和掌握串的基本操作及模式匹配算法。 二、实验软硬件要求 1、VC++ 6.0 三、实验预习 串基本操作、串模式匹配算法 四、实验内容(实验步骤、测试数据等)
Status StrAssign(HString &T, char * chars)//生成一个其值等于串常量chars的串T int StrLength(HString S)//返回S的元素个数,称为串的长度 int StrCompare(HString S, HString T)//若S>T,则返回值>0;若S=T,则返回值=0;若S<T则返回值<0 Status ClearString(HString &S)//将S清空 Status Concat(HString &T, HString S1, HString S2)//用T返回由S1和S2联接而成的新串 Status SubString(HString &Sub, HString S, int pos, int len) //用Sub返回串S的第pos个字符起长度为len的子串。 int Index_BF(HString S, HString T, int pos){//朴素模式匹配算法 // 返回子串T在主串S中第pos个字符之后的位置,若不存在,则函数值为0。 Status StrInsert(HString &S,int pos,HString T)//在串S的第pos个字符之前插入串T。 Status StrDelete(HString &S,int pos,int len)//从串S中删除第pos个字符起长度为len的子串 以下题目选做:
a b c d e f g h i j k l m n o p q r s t u v w x y z n g z q t c o b m u h e l k p d a w x f y i v r s j 测试数据:encrypt 加密后tkzwsdf 将输入的文本串进行加密后输出,然后进行解密并输出。 运行结果:
(可以记录C语言中薄弱的部分,便于课后复习巩固,每次实验体会需要写两行。)
六、源代码或重要代码 #include <stdio.h> #include <stdlib.h> #include <string.h> #define max 100 typedef struct{ char data[max]; int length; }Hstring; int StrAssign(Hstring *T,char *chars){ int i =0; for(;chars[i]!='\0';i++){ T->data[i]=chars[i];
} T->length=i; return 1; } int Strlength(Hstring s){ return s.length; } int Strcompare(Hstring S,Hstring T){ return S.length-T.length; } int ClearString(Hstring *s){ s->length=0; return 1; } int Concat(Hstring *T,Hstring s1,Hstring s2){ int i=0,j=0; for(;i<s1.length;i++){ T->data[i]=s1.data[i]; } for(j=0;j<s2.length;j++){ T->data[i+j]=s2.data[j]; } T->length=s1.length+s2.length; return 1; } int Substring(Hstring *Sub,Hstring s,int pos,int len){ int i,j=0; for(i=pos-1;i<pos+len-1;i++,j++){ Sub->data[j]=s.data[i]; } Sub->length=len; return 1; } int Index_BF(Hstring s,Hstring T,int pos){ int i,j,sum=0; for(i=pos;i<s.length;i++){ sum=0; for(j=0;j<T.length;j++){ if(s.data[i+j]!=T.data[j]) break; if(s.data[i+j]==T.data[j]) sum++; if(sum>=T.length) return i+1; } } return 0; } int Strinsert(Hstring *s,int pos,Hstring T){ int j; Hstring str; str.length=0; if(pos<=0||pos>s->length+1) return 0; for(j=0;j<pos-1;j++){ str.data[j]=s->data[j]; } for(j=0;j<T.length;j++){ str.data[pos+j-1]=T.data[j]; } for(j=pos-1;j<s->length;j++){ str.data[T.length+j]=s->data[j]; } str.length=s->length+T.length; *s=str; } int Strdelete(Hstring *s,int pos,int len){ int i; Hstring str; for(i=0;i<pos-1;i++){ str.data[i]=s->data[i+len]; } for(;i<s->length-len;i++){ str.data[i]=s->data[i+len]; } str.length=s->length-len; *s=str; return 1; } void Dispstr(Hstring s){ int i; if(s.length>0){ for(i=0;i<s.length;i++){ printf("%c",s.data[i]); } printf("\n"); }
} int main(){ Hstring s,T,sub,xx; int a,b,c,d,len,len2;
StrAssign(&s,"abcdefghijklmnopqrstuvwxyz"); Dispstr(s); printf("s串?的?长¤度è为a%d\n",Strlength(s)); StrAssign(&T,"def"); // 创洹?建¨一?个?模£式?串?;? Dispstr(s); printf("比括?较?s和íT的?长¤度è:阰"); if(Strcompare(s,T)) printf("str比括?较?长¤\n"); else printf("T比括?较?长¤\n"); printf("请?输?入?,?返う?回?子哩?串?T在ú主÷串?中D第台?个?字?符?之?后ó的?位?置?\n"); scanf("%d",&a); printf("返う?回?子哩?串?T在ú主÷串?中D第台?d个?字?符?之?后ó的?位?置?,?在ú主÷串?中D的?位?置?为a%d\n",a,Index_BF(s,T,a));
printf("请?输?入?,?用?sub返う?回?串?s的?第台?个?字?符?起e长¤度è为a 的?字?符?串?\n"); scanf("%d %d",&b,&len); Substring(&sub,s,b,len); Dispstr(sub); printf("用?xx返う?回?由ub和íT联结á而?成é的?新?串?:阰"); Concat(&xx,sub,T); Dispstr(xx); printf("请?输?入?,?在ú串?s的?第台?个?字?符?之?前°插?入?串?T:"); scanf("%d",&c); Strinsert(&s,c,T); Dispstr(s); printf("从洙?串?s中D删?除y第台?个?字?符?起e长¤度è为a 的?子哩?串?:阰"); scanf("%d%d",&d,&len2); Strdelete(&s,d,len2); Dispstr(s); printf("将?T清?空?\n"); ClearString(&T); printf("T的?长¤度è为a%d",Strlength(T));
} |
数据结构与算法实验7-串的应用
最新推荐文章于 2023-09-15 06:00:00 发布