建立链串的算法库

一般每一种数据结构都不会局限于在连续空间内的存取,那我们的串自然也不反常,本次实践将建立链串的算法库,应用于有需求的工程当中,提高程序的容错性。

本次实践依然会用到多文件组织工程的建立,具体可点击此处参照。

建立好的工程文件视角图如下,对工程结构有一个整体的把握。

工程的源代码如下:

1头文件:liString.h,包含定义链串数据结构的代码、宏定义、要实现算法的函数的声明;

//*Copyright  (c)2017,烟台大学计算机与控制工程学院*
//*All rights reservrd.*
//*文件名称 :liString.h*
//*作者:田长航*
//*完成时间:2017年10月19日*
//*版本号:v1.0*
//*问题描述:定义链串数据结构的代码、宏定义、要实现算法的函数的声明*
//*输入描述:无*
//*程序输出:无*
#ifndef LISTRING_H_INCLUDED
#define LISTRING_H_INCLUDEDtypedef struct snode
{char data;struct snode *next;
} LiString;void StrAssign(LiString *&s,char cstr[]);   //字符串常量cstr赋给串s
void StrCopy(LiString *&s,LiString *t); //串t复制给串s
bool StrEqual(LiString *s,LiString *t); //判串相等
int StrLength(LiString *s); //求串长
LiString *Concat(LiString *s,LiString *t);  //串连接
LiString *SubStr(LiString *s,int i,int j);  //求子串
LiString *InsStr(LiString *s,int i,LiString *t) ;   //串插入
LiString *DelStr(LiString *s,int i,int j);  //串删去
LiString *RepStr(LiString *s,int i,int j,LiString *t);  //串替换
void DispStr(LiString *s);  //输出串
#endif // LISTRING_H_INCLUDED

2源文件:liString.cpp,包含实现各种算法的函数的定义

//*Copyright  (c)2017,烟台大学计算机与控制工程学院*
//*All rights reservrd.*
//*文件名称 :liString.cpp*
//*作者:田长航*
//*完成时间:2017年10月19日*
//*版本号:v1.0*
//*问题描述:各种算法的函数的定义*
//*输入描述:无*
//*程序输出:无*
#include <stdio.h>
#include <malloc.h>
#include "liString.h"void StrAssign(LiString *&s,char cstr[])    //字符串常量cstr赋给串s
{int i;LiString *r,*p;s=(LiString *)malloc(sizeof(LiString));r=s;                        //r始终指向尾节点for (i=0;cstr[i]!='\0';i++){   p=(LiString *)malloc(sizeof(LiString));p->data=cstr[i];r->next=p;r=p;}r->next=NULL;
}
void StrCopy(LiString *&s,LiString *t)  //串t复制给串s
{LiString *p=t->next,*q,*r;s=(LiString *)malloc(sizeof(LiString));r=s;                //r始终指向尾节点while (p!=NULL)     //将t的所有节点复制到s{   q=(LiString *)malloc(sizeof(LiString));q->data=p->data;r->next=q;r=q;p=p->next;}r->next=NULL;
}
bool StrEqual(LiString *s,LiString *t)  //判串相等
{LiString *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;elsereturn false;
}
int StrLength(LiString *s)  //求串长
{int i=0;LiString *p=s->next;while (p!=NULL){   i++;p=p->next;}return i;
}
LiString *Concat(LiString *s,LiString *t)   //串连接
{LiString *str,*p=s->next,*q,*r;str=(LiString *)malloc(sizeof(LiString));r=str;while (p!=NULL)         //将s的所有节点复制到str{   q=(LiString *)malloc(sizeof(LiString));q->data=p->data;r->next=q;r=q;p=p->next;}p=t->next;while (p!=NULL)         //将t的所有节点复制到str{   q=(LiString *)malloc(sizeof(LiString));q->data=p->data;r->next=q;r=q;p=p->next;}r->next=NULL;return str;
}
LiString *SubStr(LiString *s,int i,int j)   //求子串
{int k;LiString *str,*p=s->next,*q,*r;str=(LiString *)malloc(sizeof(LiString));str->next=NULL;r=str;                      //r指向新建链表的尾节点if (i<=0 || i>StrLength(s) || j<0 || i+j-1>StrLength(s))return str;             //参数不正确时返回空串for (k=0;k<i-1;k++)p=p->next;for (k=1;k<=j;k++)          //将s的第i个节点开始的j个节点复制到str{   q=(LiString *)malloc(sizeof(LiString));q->data=p->data;r->next=q;r=q;p=p->next;}r->next=NULL;return str;
}
LiString *InsStr(LiString *s,int i,LiString *t)     //串插入
{int k;LiString *str,*p=s->next,*p1=t->next,*q,*r;str=(LiString *)malloc(sizeof(LiString));str->next=NULL;r=str;                              //r指向新建链表的尾节点if (i<=0 || i>StrLength(s)+1)       //参数不正确时返回空串return str;for (k=1;k<i;k++)                   //将s的前i个节点复制到str{   q=(LiString *)malloc(sizeof(LiString));q->data=p->data;r->next=q;r=q;p=p->next;}while (p1!=NULL)                    //将t的所有节点复制到str{   q=(LiString *)malloc(sizeof(LiString));q->data=p1->data;r->next=q;r=q;p1=p1->next;}while (p!=NULL)                     //将*p及其后的节点复制到str{   q=(LiString *)malloc(sizeof(LiString));q->data=p->data;r->next=q;r=q;p=p->next;}r->next=NULL;return str;
}
LiString *DelStr(LiString *s,int i,int j)   //串删去
{int k;LiString *str,*p=s->next,*q,*r;str=(LiString *)malloc(sizeof(LiString));str->next=NULL;r=str;                      //r指向新建链表的尾节点if (i<=0 || i>StrLength(s) || j<0 || i+j-1>StrLength(s))return str;             //参数不正确时返回空串for (k=0;k<i-1;k++)         //将s的前i-1个节点复制到str{   q=(LiString *)malloc(sizeof(LiString));q->data=p->data;r->next=q;r=q;p=p->next;}for (k=0;k<j;k++)               //让p沿next跳j个节点p=p->next;while (p!=NULL)                 //将*p及其后的节点复制到str{   q=(LiString *)malloc(sizeof(LiString));q->data=p->data;r->next=q;r=q;p=p->next;}r->next=NULL;return str;
}
LiString *RepStr(LiString *s,int i,int j,LiString *t)   //串替换
{int k;LiString *str,*p=s->next,*p1=t->next,*q,*r;str=(LiString *)malloc(sizeof(LiString));str->next=NULL;r=str;                          //r指向新建链表的尾节点if (i<=0 || i>StrLength(s) || j<0 || i+j-1>StrLength(s))return str;                 //参数不正确时返回空串for (k=0;k<i-1;k++)             //将s的前i-1个节点复制到str{   q=(LiString *)malloc(sizeof(LiString));q->data=p->data;q->next=NULL;r->next=q;r=q;p=p->next;}for (k=0;k<j;k++)               //让p沿next跳j个节点p=p->next;while (p1!=NULL)                //将t的所有节点复制到str{   q=(LiString *)malloc(sizeof(LiString));q->data=p1->data;q->next=NULL;r->next=q;r=q;p1=p1->next;}while (p!=NULL)                 //将*p及其后的节点复制到str{   q=(LiString *)malloc(sizeof(LiString));q->data=p->data;q->next=NULL;r->next=q;r=q;p=p->next;}r->next=NULL;return str;
}
void DispStr(LiString *s)   //输出串
{LiString *p=s->next;while (p!=NULL){   printf("%c",p->data);p=p->next;}printf("\n");
}

3.在同一项目(project)中建立一个源文件(如main.cpp),编制main函数,完成相关的测试工作。

//*Copyright  (c)2017,烟台大学计算机与控制工程学院*
//*All rights reservrd.*
//*文件名称 :main.cpp*
//*作者:田长航*
//*完成时间:2017年10月19日*
//*版本号:v1.0*
//*问题描述:算法库测试函数*
//*输入描述:无*
//*程序输出:测试结果*
#include <stdio.h>
#include "liString.h"
int main()
{LiString *s,*s1,*s2,*s3,*s4;printf("链串的基本运算如下:\n");printf("  (1)建立串s和串s1\n");StrAssign(s,"abcdefghijklmn");printf("  (2)输出串s:");DispStr(s);StrAssign(s1,"123");printf("  (2)输出串s1:");DispStr(s1);printf("  (3)串s的长度:%d\n",StrLength(s));printf("  (4)在串s的第9个字符位置插入串s1而产生串s2\n");s2=InsStr(s,9,s1);printf("  (5)输出串s2:");DispStr(s2);printf("  (6)删除串s第2个字符开始的5个字符而产生串s2\n");s2=DelStr(s,2,3);printf("  (7)输出串s2:");DispStr(s2);printf("  (8)将串s第2个字符开始的5个字符替换成串s1而产生串s2\n");s2=RepStr(s,2,5,s1);printf("  (9)输出串s2:");DispStr(s2);printf("  (10)提取串s的第2个字符开始的10个字符而产生串s3\n");s3=SubStr(s,2,10);printf("  (11)输出串s3:");DispStr(s3);printf("  (12)将串s1和串s2连接起来而产生串s4\n");s4=Concat(s1,s2);printf("  (13)输出串s4:");DispStr(s4);return 0;
}

运行结果截图如下:

数据结构上机实践第八周项目2- 建立链串的算法库相关推荐

  1. 数据结构上机实践第五周项目2 - 建立链栈算法库

    建立链栈算法库 链式存储和顺序存储方式各有特点,各有缺点,上次实践建立了顺序栈的算法库,本次实践将建立链栈的算法库,用以应多更多多样化的问题.(编译环境:VC++6.0) 本次建立算法库需要建立多文件 ...

  2. 数据结构上机实践第八周项目1- 建立顺序串的算法库

    建立顺序串的算法库 本次实践将建立顺序串的算法库,这样可以方便的将此算法运用于我们的所需的工程中,简化操作. 本次实践将用到多文件组织工程的建立,建立方法可以点击此处参照.(工程环境:Visual C ...

  3. 数据结构上机实践第八周项目3-顺序串算法

    顺序串算法 本次实践项目要求如下: 采用顺序存储方式存储串,实现下列算法并测试:  (1)试编写算法实现将字符串S中所有值为c1的字符换成值为c2的字符:  void Trans(SqString * ...

  4. 数据结构上机实践第八周项目9-广义表算法库及应用

    广义表算法库及应用 为了丰富算法库,以应对各类工程的需要,本次实践将进行广义表算法库的建立以及应用. 项目要求一: 建立广义表算法库,包括:  ① 头文glist.h,定义数据类型,声明函数:  ② ...

  5. 数据结构上机实践第八周项目6- 猴子选大王(数组版)

    猴子选大王(数组版) 在之前的项目中,实现了猴子选大王的项目要求,本次实践,将再次实现这个项目,但是运用数组的方法,做到一题多解,集思广益. 项目要求如下:一群猴子,编号是1,2,3 -m,这群猴子( ...

  6. 数据结构上机实践第八周项目5 - 计数的模式匹配

    计数的模式匹配 模式匹配在生活中运用广泛,日常所见的指纹识别,人脸识别......无一不用到模式匹配,为了体现模式匹配的基本思想,本次实践将实现简单的字符串的计数模式匹配. 项目要求如下:采用顺序结构 ...

  7. 数据结构上机实践第八周项目4-字符串加密

    字符串加密 密码在我们的生活中很常见,现在的加密算法最常用的是MD5和SHA512散列式算法,最早的密码加密方式很简单,容易被破译,但是却引领信息安全的潮流,本次实践,将实现最早的字符串加密方式,采用 ...

  8. 数据结构上机实践第八周项目8-稀疏矩阵的三元组表示的实现及应用

    稀疏矩阵的三元组表示的实现及应用 在现代社会中,在一个大量的人群集体中,总会有和某个人有相互之间的关系或者单向关系的,那我们的矩阵也是如此,稀疏矩阵压缩存储的方式,便可以让这种关系一目了然,巧妙应用. ...

  9. 数据结构上机实践第八周项目7—对称矩阵的压缩存储及基本运算

    对称矩阵的压缩存储及基本运算 贺老师的慕课当中,给我们拓展了这样的知识. 所以,本次的项目实践要求如下: 用压缩形式存储对称矩阵,实现下面的操作并测试 void Init(int *&b);/ ...

最新文章

  1. 利用动态加载模板,配合ajax实现无刷新操作
  2. queue 常见方法
  3. 【知识星球】ElementAI提出超复杂多尺度细粒度图像分类Attention模型
  4. Python教程:Sys 与 Import 模块
  5. Tensorflow1.x 和 2.x如何读取ckpt中保存了那些参数
  6. Oracle数据库卸载
  7. .f' '或者.F' '或者string.format(args)
  8. 程序员的进阶课-架构师之路(2)-数组
  9. wincc工程组态论文_基于WinCC软件的组态设计与实现
  10. 计数器控制的while循环(C++/python版)
  11. jq怎么赋值给变量_jq: 工具方法
  12. pcie协议_如何通过PCIE协议实现FPGA 配置?详情请戳这里!
  13. 黑群晖系统备份与恢复
  14. matlab积分计算面积,定积分的近似计算(数学实验报告matlab版).doc
  15. How to install php evn on ubuntu
  16. Apache http设置反向代理和负载均衡
  17. 帮你解读身份证号码的秘密
  18. loadrunner+win2003虚拟机的安装
  19. Win11或Win10重置电脑提示“找不到恢复环境”
  20. hostapd源码编译与配置

热门文章

  1. [机器学习] 混淆矩阵和kappa系数
  2. 将图片转化为txt文本显示
  3. NLP自然语言处理库系列教程——gensim库
  4. C语言学习记录_2019.02.10
  5. WeixinJSBridge API使用实例
  6. Jmeter(GUI模式)教程
  7. linux下lampp(xampp)安装memcached扩展
  8. Software--Architecture--SOA Factory
  9. 2017-2018-1 20155213 20155303 实验二 固件程序设计
  10. windows下php命令行模式错误信息