数据结构与算法实验7-串的应用

一、实验目的

串的应用,结合应用实例,深入理解和掌握串的基本操作及模式匹配算法。

二、实验软硬件要求

1、VC++ 6.0

三、实验预习

串基本操作、串模式匹配算法

四、实验内容(实验步骤、测试数据等)

  1. 编写程序,实现顺序串(堆分配存储结构)的各种基本运算。(必做)

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的子串

以下题目选做:

  1. 实现顺序串的各种模式匹配算法
  1. 采用简单匹配算法求子串t在主串s中的位置
  2. 采用KMP算法求子串t在主串s中的位置
  3. 采用改进的KMP算法求子串t在主串s中的位置

  1. 文本串加密和解密程序。一个文本串可用事先给定的字母映射表进行加密。例如,设字母映射表为:

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));

   

   

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值