一、实现顺序串的各种基本运算的算法

#include<stdio.h>
#include<stdlib.h>
#define MaxSize 50typedef struct{char data[MaxSize];int length;
}SqString;//生成串
void StrAssign(SqString &s,char cstr[]){int i;for(i=0;cstr[i]!='\0';i++)s.data[i]=cstr[i];s.length=i;
} //销毁串
void DestroyStr(SqString &s){} //串的复制
void StrCopy(SqString &s,SqString t){int i;for(i=0;i<t.length;i++)s.data[i]=t.data[i];s.length=t.length;
} //判断串相等
bool StrEqual(SqString s,SqString t){bool same=true;int i;if(s.length!=t.length) same=false;else{for(i=0;i<s.length;i++)if(s.data!=t.data){same=false;break;}}return same;
} //求串的长
int StrLength(SqString s){return s.length;
} //串的连接
SqString Concat(SqString s,SqString t){SqString str;int i;str.length=s.length+t.length;for(i=0;i<s.length;i++)str.data[i]=s.data[i];for(i=0;i<t.length;i++)str.data[i+s.length]=t.data[i];return str;
} //求子串
SqString SubStr(SqString s,int i,int j){int k;SqString str;str.length=0;if(i<=0||i>s.length||j<0||i+j-1>s.length)return str;for(k=i-1;k<i+j-1;k++)str.data[k-i+1]=s.data[k];str.length=j;return str;
} //子串的插入
SqString InsStr(SqString s1,int i,SqString s2){int j;SqString str;str.length=0;if(i<=0||i>s1.length+1)return str;for(j=0;j<i-1;j++) str.data[j]=s1.data[j];for(j=0;j<s2.length;j++) str.data[i+j-1]=s2.data[j]; for(j=i-1;j<s1.length;j++) str.data[s2.length+j]=s1.data[j];str.length=s1.length+s2.length;return str;
}//子串的删除
SqString DelStr(SqString s,int i,int j){int k;SqString str;str.length=0;if(i<=0||i>s.length||i+j-1>s.length)return str;for(k=0;k<i-1;k++) str.data[k]=s.data[k];for(k=j+i-1;k<s.length;k++) str.data[k-j]=s.data[k];str.length=s.length-j;return str;
}//子串的替换
SqString InsStr(SqString s,int i,int j,SqString t){int k;SqString str;str.length=0;if(i<=0||i>s.length||i+j-1>s.length)return str;for(k=0;k<i-1;k++) str.data[k]=s.data[k];for(k=0;k<t.length;k++) str.data[i+k-1]=t.data[k]; for(k=j+i-1;k<s.length;k++) str.data[k-j+t.length]=s.data[k];str.length=s.length-j+t.length;return str;
} //输出串
void DispStr(SqString s){int i;if(s.length>0){for(i=0;i<s.length;i++)printf("%c",s.data[i]);printf("\n");}
} int main(){SqString s,s1;//建立串s,s1printf("1、建立串s,s1\n");char cstr[]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n'};char cstr1[]={'x','y','z'};StrAssign(s,cstr);StrAssign(s1,cstr1); printf("\n");//输出串sprintf("2、输出串s:");DispStr(s); printf("\n");//输出串s的长度printf("3、输出串s的长度:");StrLength(s);printf("%d",StrLength(s));printf("\n");//在串s的第9个字符位置插入s1而产生s2printf("4、在串s的第9个字符位置插入s1而产生s2");SqString s2;s2=InsStr(s,9,s1);//输出s2printf("5、输出串s2:");DispStr(s2); printf("\n"); //删除串s的第2个字符开始的5个字符而产生的s2printf("6、删除串s的第2个字符开始的5个字符而产生的s2"); s2=DelStr(s,2,5);printf("\n");//输出s2printf("7、输出串s2:");DispStr(s2); printf("\n");//将串s的第二个字符开始的5个字符替换成s1而产生s2printf("8、将串s的第二个字符开始的5个字符替换成s1而产生s2"); s2=InsStr(s,2,5,s1);printf("\n");//输出s2printf("9、输出串s2:");DispStr(s2); printf("\n");//提取串s的第2个字符开始的10个字符而产生串s3printf("10、提取串s的第2个字符开始的10个字符而产生串s3");SqString s3;s3=SubStr(s,2,10); printf("\n");//输出串s3printf("11、输出串s3:");DispStr(s3); printf("\n");//将串s1与s2连接起来产生串s4printf("12、将串s1与s2连接起来产生串s4"); SqString s4;s4=Concat(s1,s2);printf("\n");//输出串s4printf("13、输出串s4:");DispStr(s4); printf("\n");return 0;
}

结果:

二、实现链串的各种基本运算的算法

#include<stdio.h>
#include<stdlib.h>typedef struct snode{char data;struct snode *next;
}LinkStrNode;//生成串
void StrAssign(LinkStrNode *&s,char cstr[]){int i;LinkStrNode *r,*p;s=(LinkStrNode *)malloc(sizeof(LinkStrNode));r=s;for(i=0;cstr[i]!='\0';i++){p=(LinkStrNode *)malloc(sizeof(LinkStrNode));p->data=cstr[i];r->next=p;r=p;}r->next=NULL;
} //销毁串
void DestroyStr(LinkStrNode *&s){LinkStrNode *pre=s,*p=s->next;while(p!=NULL){free(pre);pre=p;p=p->next;}free(pre);
} //串的复制
void StrCopy(LinkStrNode *&s,LinkStrNode *t){LinkStrNode *p=t->next,*q,*r;s=(LinkStrNode *)malloc(sizeof(LinkStrNode));r=s;while(p!=NULL){q=(LinkStrNode *)malloc(sizeof(LinkStrNode));q->data=p->data;r->next=q;r=q;p=p->next;}r->next=NULL;
} //判断串相等
bool StrEqual(LinkStrNode *s,LinkStrNode *t){LinkStrNode *p=s->next,*q=t->next;while(p!=NULL&&q!=NULL&&p->data==q->data){p=p->next;q=q->next; } if(p==NULL&&q==NULL) return true;else return false;
} //求串的长
int StrLength(LinkStrNode *s){LinkStrNode *p=s->next;int count=0;while(p!=NULL){count++;p=p->next; }return count;
} //串的连接
LinkStrNode* Concat(LinkStrNode *s,LinkStrNode *t){LinkStrNode *str,*p=s->next,*q,*r;str=(LinkStrNode *)malloc(sizeof(LinkStrNode));r=str;while(p!=NULL){q=(LinkStrNode *)malloc(sizeof(LinkStrNode));q->data=p->data;r->next=q;r=q;p=p->next;}p=t->next;while(p!=NULL){q=(LinkStrNode *)malloc(sizeof(LinkStrNode));q->data=p->data;r->next=q;r=q;p=p->next;}r->next=NULL;return str;
} //求子串
LinkStrNode * SubStr(LinkStrNode *s,int i,int j){int k;LinkStrNode *str,*p=s->next,*q,*r;str=(LinkStrNode *)malloc(sizeof(LinkStrNode));str->next=NULL; r=str;if(i<=0||i>StrLength(s)||j<0||i+j-1>StrLength(s))return str;for(k=1;k<i;k++)p=p->next;for(k=1;k<=j;k++){q=(LinkStrNode *)malloc(sizeof(LinkStrNode));q->data=p->data;r->next=q;r=q;p=p->next;}r->next=NULL;return str;
} //子串的插入
LinkStrNode * InsStr(LinkStrNode *s,int i,LinkStrNode *t){int k;LinkStrNode *str,*p=s->next,*p1=t->next,*q,*r;str=(LinkStrNode *)malloc(sizeof(LinkStrNode));str->next=NULL; r=str;if(i<=0||i>StrLength(s)+1)return str;for(k=1;k<i;k++){q=(LinkStrNode *)malloc(sizeof(LinkStrNode));q->data=p->data;r->next=q;r=q;p=p->next;}while(p1!=NULL){q=(LinkStrNode *)malloc(sizeof(LinkStrNode));q->data=p1->data;r->next=q;r=q;p1=p1->next;}while(p!=NULL){q=(LinkStrNode *)malloc(sizeof(LinkStrNode));q->data=p->data;r->next=q;r=q;p=p->next;}r->next=NULL; return str;
}//子串的删除
LinkStrNode * DelStr(LinkStrNode *s,int i,int j){int k;LinkStrNode *str,*p=s->next,*q,*r;str=(LinkStrNode *)malloc(sizeof(LinkStrNode));str->next=NULL; r=str;if(i<=0||i>StrLength(s)||j<0||i+j-1>StrLength(s))return str;for(k=1;k<i;k++){q=(LinkStrNode *)malloc(sizeof(LinkStrNode));q->data=p->data;r->next=q;r=q;p=p->next;}for(k=0;k<j;k++) p=p->next;while(p!=NULL){q=(LinkStrNode *)malloc(sizeof(LinkStrNode));q->data=p->data;r->next=q;r=q;p=p->next;}r->next=NULL; return str;
}//子串的替换
LinkStrNode * InsStr(LinkStrNode *s,int i,int j,LinkStrNode *t){int k;LinkStrNode *str,*p=s->next,*p1=t->next,*q,*r;str=(LinkStrNode *)malloc(sizeof(LinkStrNode));str->next=NULL; r=str;if(i<=0||i>StrLength(s)||j<0||i+j-1>StrLength(s))return str;for(k=0;k<i-1;k++){q=(LinkStrNode *)malloc(sizeof(LinkStrNode));q->data=p->data;r->next=q;r=q;p=p->next;}for(k=0;k<j;k++) p=p->next;while(p1!=NULL){q=(LinkStrNode *)malloc(sizeof(LinkStrNode));q->data=p1->data;r->next=q;r=q;p1=p1->next;}while(p!=NULL){q=(LinkStrNode *)malloc(sizeof(LinkStrNode));q->data=p->data;r->next=q;r=q;p=p->next;}r->next=NULL; return str;
} //输出串
void DispStr(LinkStrNode *s){LinkStrNode *p=s->next;while(p!=NULL){printf("%c",p->data);p=p->next;        }printf("\n");
} int main(){LinkStrNode *s,*s1;//建立串s,s1printf("1、建立串s,s1\n");char cstr[]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n'};char cstr1[]={'x','y','z'};StrAssign(s,cstr);StrAssign(s1,cstr1); printf("\n");//输出串sprintf("2、输出串s:");DispStr(s); printf("\n");//输出串s的长度printf("3、输出串s的长度:");StrLength(s);printf("%d",StrLength(s));printf("\n");//在串s的第9个字符位置插入s1而产生s2printf("4、在串s的第9个字符位置插入s1而产生s2");LinkStrNode *s2;s2=InsStr(s,9,s1);//输出s2printf("5、输出串s2:");DispStr(s2); printf("\n"); //删除串s的第2个字符开始的5个字符而产生的s2printf("6、删除串s的第2个字符开始的5个字符而产生的s2"); s2=DelStr(s,2,5);printf("\n");//输出s2printf("7、输出串s2:");DispStr(s2); printf("\n");//将串s的第二个字符开始的5个字符替换成s1而产生s2printf("8、将串s的第二个字符开始的5个字符替换成s1而产生s2"); s2=InsStr(s,2,5,s1);printf("\n");//输出s2printf("9、输出串s2:");DispStr(s2); printf("\n");//提取串s的第2个字符开始的10个字符而产生串s3printf("10、提取串s的第2个字符开始的10个字符而产生串s3");LinkStrNode *s3;s3=SubStr(s,2,10); printf("\n");//输出串s3printf("11、输出串s3:");DispStr(s3); printf("\n");//将串s1与s2连接起来产生串s4printf("12、将串s1与s2连接起来产生串s4"); LinkStrNode *s4;s4=Concat(s1,s2);printf("\n");//输出串s4printf("13、输出串s4:");DispStr(s4); printf("\n");return 0;
}

截图:

三、实现顺序串的各种模式匹配算法

#include<stdio.h>
#include<stdlib.h>
#define MaxSize 50typedef struct{char data[MaxSize];int length;
}SqString;//生成串
void StrAssign(SqString &s,char cstr[]){int i;for(i=0;cstr[i]!='\0';i++)s.data[i]=cstr[i];s.length=i;
} //销毁串
void DestroyStr(SqString &s){} //串的复制
void StrCopy(SqString &s,SqString t){int i;for(i=0;i<t.length;i++)s.data[i]=t.data[i];s.length=t.length;
} //判断串相等
bool StrEqual(SqString s,SqString t){bool same=true;int i;if(s.length!=t.length) same=false;else{for(i=0;i<s.length;i++)if(s.data!=t.data){same=false;break;}}return same;
} //求串的长
int StrLength(SqString s){return s.length;
} //串的连接
SqString Concat(SqString s,SqString t){SqString str;int i;str.length=s.length+t.length;for(i=0;i<s.length;i++)str.data[i]=s.data[i];for(i=0;i<t.length;i++)str.data[i+s.length]=t.data[i];return str;
} //求子串
SqString SubStr(SqString s,int i,int j){int k;SqString str;str.length=0;if(i<=0||i>s.length||j<0||i+j-1>s.length)return str;for(k=i-1;k<i+j-1;k++)str.data[k-i+1]=s.data[k];str.length=j;return str;
} //子串的插入
SqString InsStr(SqString s1,int i,SqString s2){int j;SqString str;str.length=0;if(i<=0||i>s1.length+1)return str;for(j=0;j<i-1;j++) str.data[j]=s1.data[j];for(j=0;j<s2.length;j++) str.data[i+j-1]=s2.data[j]; for(j=i-1;j<s1.length;j++) str.data[s2.length+j]=s1.data[j];str.length=s1.length+s2.length;return str;
}//子串的删除
SqString DelStr(SqString s,int i,int j){int k;SqString str;str.length=0;if(i<=0||i>s.length||i+j-1>s.length)return str;for(k=0;k<i-1;k++) str.data[k]=s.data[k];for(k=j+i-1;k<s.length;k++) str.data[k-j]=s.data[k];str.length=s.length-j;return str;
}//子串的替换
SqString InsStr(SqString s,int i,int j,SqString t){int k;SqString str;str.length=0;if(i<=0||i>s.length||i+j-1>s.length)return str;for(k=0;k<i-1;k++) str.data[k]=s.data[k];for(k=0;k<t.length;k++) str.data[i+k-1]=t.data[k]; for(k=j+i-1;k<s.length;k++) str.data[k-j+t.length]=s.data[k];str.length=s.length-j+t.length;return str;
} //输出串
void DispStr(SqString s){int i;if(s.length>0){for(i=0;i<s.length;i++)printf("%c",s.data[i]);printf("\n");}
} //BF算法
int BF(SqString s,SqString t){int j=0,i=0;while(i<s.length && j<t.length){if(s.data[i]==t.data[j]){i++;j++;}else{i=i-j+1;j=0;}}if(j>=t.length)return(i-t.length);else return -1;
} //KMP算法
//求串t的next数组
void GetNext(SqString t,int next[]){int j,k;j=0;k=-1;next[0]=-1;while(j<t.length-1){if(k==-1 || t.data[j]==t.data[k]){j++;k++;next[j]=k;}else k=next[k];}
}
//KMP
int KMPIndex(SqString s,SqString t){int next[MaxSize],i=0,j=0;GetNext(t,next);while(i<s.length && j<t.length){if(j==-1||s.data[i]==t.data[j]){i++;j++;}else j=next[j];}if(j>=t.length) return(i-t.length);else return -1;
}//Nextval
void GetNextval(SqString t,int nextval[]){int j,k;j=0;k=-1;nextval[0]=-1;while(j<t.length){if(k==-1 || t.data[j]==t.data[k]){j++;k++;if(t.data[j]!=t.data[k])nextval[j]=k;elsenextval[j]=nextval[k];}else k=nextval[k];}
}//KMP
int KMPIndex1(SqString s,SqString t){int nextval[MaxSize],i=0,j=0;GetNextval(t,nextval);while(i<s.length && j<t.length){if(j==-1||s.data[i]==t.data[j]){i++;j++;}else j=nextval[j];}if(j>=t.length) return(i-t.length);else return -1;
}int main(){SqString s,t;//建立串s,tprintf("1、建立串s,t\n");char cstr[]={'a','b','c','a','b','c','d','a','b','c','d','e','a','b','c','d','e','f','a','b','c','d','e','f','g'};char cstr1[]={'a','b','c','d','e','a','b','c','d','e','f','a','b'};StrAssign(s,cstr);StrAssign(t,cstr1); printf("\n");//输出串sprintf("2、输出串s:");DispStr(s); printf("\n");//输出串tprintf("3、输出串t:");DispStr(t); printf("\n");//t的next数组printf("t的next数组:"); int next[t.length];GetNext(t,next); for(int i=0;i<t.length;i++)printf("%d\t",next[i]);printf("\n");//t的nextval数组printf("t的nextval数组:"); int nextval[t.length];GetNextval(t,nextval); for(int i=0;i<t.length;i++)printf("%d\t",nextval[i]);printf("\n");//BF算法 KMPIndex(s,t);printf("%d\n",KMPIndex(s,t));KMPIndex1(s,t);printf("%d\n",KMPIndex1(s,t));   return 0;
}

结果:

数据结构教程(第五版 李春葆 上机实验题4 验证性实验)相关推荐

  1. 数据结构教程(第五版 李春葆 上机实验题3 验证性实验)

    一.实现顺序栈的各种基本运算的算法 #include<stdio.h> #include<stdlib.h> #define MaxSize 50 typedef struct ...

  2. 《Java程序设计与数据结构教程(第二版)》学习指导

    <Java程序设计与数据结构教程(第二版)>学习指导 目录 图书简况 学习指导 第一章 绪论 第二章 数据和表达式 第三章 使用类和对象 第四章 条件和循环 第五章 编写类 第六章 图形用 ...

  3. Java2实用教程第五版+第四章习题答案

    这是<Java2实用教程第五版>的试题答案,需要的同学评论关注加点赞 有问题可以在评论区提出 1.问答题 (1)面向对象语言有哪三个特性? 封装.继承和多态 (2)类名应当遵守怎样的编程风 ...

  4. 计算机网络教程第五版|微课版 - 第五章 运输层 - 习题【补充】

    第五章.运输层[补充] 本章的习题 在 "滑动窗口" 概念中,"发送窗口" 和 "接受窗口" 的作用是什么?如果接受方的接受能力不断地发生变 ...

  5. 计算机网络教程第五版|微课版 - 第四章 网络层 - 习题【补充】

    第四章.网络层[补充] 本章的习题 请简述网络层的转发和选路两个重要功能的区别和联系 转发:分组在单一的路由器的一条输入链路中,由路由器将该分组移动到合适的输出链路 路由选择:一个网络中,分组从发送方 ...

  6. Java2实用教程第五版+第五章习题答案

    这是<Java2实用教程第五版>的试题答案,需要的同学评论关注加点赞 有问题可以在评论区提出 1.问答题 (1)子类可以有多个父类吗? 不可以.Java是单继承的,只能继承一个父类. (2 ...

  7. 计算机网络教程第五版|微课版 - 第七章 网络安全 - 重要概念【补充】

    第七章.网络安全[补充] 本章的重要概念 计算机网络中需要提供的基本安全服务有机密性.报文完整性.不可否认性.实体鉴别.访问控制和可用性等. 密码学是计算机网络安全的基础,是实现机密性.报文完整性.实 ...

  8. 费翔林, 骆斌. 操作系统教程(第五版).第121页28、29题笔记

    参考文献:[1]费翔林, 骆斌. 操作系统教程(第五版) [M]. 北京:高等教育出版社,2014. 题目:某多道程序系统采用可变分区存储管理,供用户使用的内存空间为200KB,磁带机5台.采用静态方 ...

  9. 费翔林, 骆斌. 操作系统教程(第五版).Page118第19题笔记

    参考文献:[1]费翔林, 骆斌. 操作系统教程(第五版) [M]. 北京:高等教育出版社,2014. 题目:在单处理器多到分时系统中,有三道作业依次提交,其提交时刻及运行时间分别为 作业 作业提交时刻 ...

最新文章

  1. 如果重走职场,一定会送自己 8 个锦囊
  2. linux ftp登录命令_Linux使用pinky命令查询登录用户信息
  3. 编程开发之--Oracle数据库--存储过程和存储函数(2)
  4. ASP解析JSON例子
  5. 以 vim 的方式来使用 chrome 浏览器(利用 vimium 插件)
  6. timestamp 数据类型在 sql_mode 主从不一致引起的不同步问题解决
  7. android之相机开发
  8. SRTP参数及数据包处理过程
  9. 抽象工厂模式升级版————泛型化实现
  10. activexobject mysql_ActiveXObject函数详解(转)
  11. Library not found for -lPods-Unity-iPhone 的解决方法
  12. oracle菜鸟入门,Oracle入门教程,新手必读
  13. android模拟器电视,AndroidTV 模拟器的搭建
  14. 秒杀系统 后端设计方案
  15. VNC远程控制软件,五大容易上手的VNC远程控制软件
  16. js实现复制图片到剪切板下载图片
  17. 关于@hide的理解
  18. 什么是CPS?数字孪生技术在工业4.0该如何应用?ThingJS
  19. python爬虫入门教程:爬取网页图片
  20. Android动画(一)

热门文章

  1. 网站域名绑定与ICP备案
  2. 15、计时器方法1(setInterval、clearInterval)
  3. Android 实现USB转串口通信
  4. 数据分析入门:贝叶斯定理
  5. 互金场景下竞价广告投放简介
  6. navicat连接oracle 87,[Navicat] 连接Oracle报错_Cannot load OCI DLL 87
  7. portlet示例_Portlet概念详细示例教程–第II部分
  8. WINDOWS下如何安装GCC
  9. DRP项目:知识,我们的成长记录
  10. Sybase复制服务器、自动备份恢复及案例