一.简述

  【暂无】

  二.头文件

 //4_2_part1.h
/**
author:zhaoyu
*/
//2016-6-10
//----串的定长顺序存储表示----
#include "head.h"
#define MAXSTRLEN 255//用户可以在255以内定义最大串长
//这语法还不是很熟悉
typedef unsigned char SString[MAXSTRLEN+];//0 号单元存放串的长度
int StrLength(SString T)
{
for (int i = ; i <= MAXSTRLEN; ++i)
{
if ('\0' == T[i])
{
return i-;
}
}
return MAXSTRLEN;
} /**
algorithm 4.2
*/
Status Concat(SString &T, SString S1, SString S2)
{
//用 T 返回由 S1 和 S2 连接而成的新串。
//若未截断,则返回 TRUE,否则返回 FALSE
Status uncut;
if (S1[] + S2[] < MAXSTRLEN)
{//未截断
int i = ;
for (i = ; i <= S1[]; ++i)
{
T[i] = S1[i];
}
for (i = ; i <= S2[]; ++i)
{
T[S1[]+i] = S2[i];
}
T[] = S1[] + S2[];
uncut = TRUE;
}
else if (S1[] < MAXSTRLEN)
{
int i = ;
for (i = ; i <= S1[]; i++)
{
T[i] = S1[i];
}
for (i = S1[]+; i <= MAXSTRLEN; i++)
{
T[i] = S2[i-S1[]];
}
T[] = MAXSTRLEN;
uncut = FALSE;
}
else
{
for (int i = ; i <= MAXSTRLEN; i++)
{
T[i] = S1[i];
}
T[] = S1[] = MAXSTRLEN;
uncut = FALSE;
}
return uncut;
}
/**
algorithm 4.3
*/
Status SubString(SString &Sub, SString S, int pos, int len)
{
//用 Sub 返回串 S 的第 pos 个字符起长度为 len 的字串
//其中, 1<= pos <<= SreLength(S) 且 0 <= len <= StrLength(S)-pos+1
if (pos < || pos > S[] || len < || len > S[]-pos+)
{
return ERROR;
}
for (int i = ; i <= len; i++)
{
Sub[i] = S[i+pos-];
}
Sub[] = len;
return OK;
}
void PrintSString(SString T)
{
//if(T[])
for (int i = ; i <= T[]; ++i)
{
printf("%c", *(T+i));
}
printf("\n");
} 4_2_part1.h

4_2_part1.h

 //4_2_part2.h
/**
author:zhaoyu
*/
//2016-6-12
#include "head.h"
#include <cstdlib>
#include <cstring>
//----串的对分配存储表示----
typedef struct {
char *ch;//
int length;
}HString; Status StrInsert(HString &S, int pos, HString T)
{//1<= pos <= StrLength(S)+1
//在串的第 pos 个字符之前插入串 T
if ( < pos || pos > S.length + )
{
printf("Illegal pos\n");
return ERROR;
}
if (T.length){//T 非空,则重新分配空间,插入 T
if (!(S.ch = (char *)realloc(S.ch, (S.length +
T.length)*sizeof(char))));
{
exit(OVERFLOW);
}
for (int i = S.length-; i >= pos-; i--)
{//为插入 T 为腾出位置
S.ch[i+T.length] = S.ch[i];
}
for (int i = pos-; i <= pos+T.length-; i++)
{//插入 T
S.ch[i] = T.ch[i];
}
S.length += T.length;
}
return OK;
}
//page 76-77
//----基本操作的算法描述----
Status StrAssign(HString &T, char *chars)
{//生成一个其值等于串常量 chars的串 T
if (T.ch)
{
T.ch = NULL;
}
int L;
char *c;;
for (L = , c = chars; *c!='\0'; ++L, ++c);//求 chars 的长度 L
if(!L)
{
T.ch = NULL;
T.length = ;
}
else
{
if (!(T.ch = (char *)malloc(L*sizeof(char))))
{
exit(OVERFLOW);
}
for (int i = ; i < L; ++i)
{
T.ch[i] = chars[i];
}
T.length = L;
}
return OK;
}
int StrLength(HString S)
{//返回 S 的元素个数, 称为串的长度
return S.length;
}
int StrCompare(HString S, HString T)
{//若 S >|=|< T,则返回 >|=|< 0
for (int i = ; i < S.length && i < T.length; i++)
{
if (T.ch[i] != S.ch[i])
{
return S.ch[i] - T.ch[i];
}
}
return S.length - T.length;
}
Status ClearString(HString &S)
{
//将 S 清空为空串
if (S.ch)
{
free(S.ch);
S.ch = NULL;
}
S.length = ;
return OK;
}
Status Concat(HString &T, HString S1, HString S2)
{
if (T.ch)
{//释放旧空间
free(T.ch);
}
if (!(T.ch = (char *)malloc((S1.length+S2.length)*sizeof(char))))
{
exit(OVERFLOW);
}
for (int i = ; i < S1.length; ++i)
{
T.ch[i] = S1.ch[i];
}
for (int i = ; i < S2.length; ++i)
{
T.ch[i+S1.length] = S2.ch[i];
}
T.length = S1.length + S2.length;
return OK;
}
Status SubString(HString &Sub, HString S, int pos, int len)
{
//用 Sub 返回串 S 的第 pos 个字符起长度为 len 的子串
//其中,其中, 1<= pos <<= SreLength(S) 且 0 <= len <= StrLength(S)-pos+1
if (pos < || pos > S.length || len < || len > S.length-pos+)
{
return ERROR;
}
if (Sub.ch)
{
free(Sub.ch);
}
if (!len)
{//空子串
Sub.ch = NULL;
Sub.length = ;
}
else
{
Sub.ch = (char *)malloc(len*sizeof(char));
for (int i = ; i < len; ++i)
{
Sub.ch[i] = S.ch[pos+i-];
}
Sub.length = len;
}
return OK;
}
void PrintHString(HString S)
{
for (int i = ; i < S.length; ++i)
{
printf("%c", S.ch[i]);
}
printf("\n");
}

4_2_part2.h

  三.CPP文件

 #include "4_2_part1.h"
int main(int argc, char const *argv[])
{
SString S1;
SString S2;
SString T;
scanf("%s", S1+);
*S1 = StrLength(S1);
scanf("%s", S2+);
*S2 = StrLength(S2);
Concat(T, S1, S2);
PrintSString(T);
int pos = , len = ;
SubString(T, S1, pos, len);
PrintSString(T);
return ;
}

4_2_part1.cpp

 #include "4_2_part2.h"
int main(int argc, char const *argv[])
{
char S[];
HString T = {NULL, };
HString S1 = {NULL, };
HString S2 = {NULL, };
scanf("%s", S);
StrAssign(S1, S);
printf("S1:\t");
PrintHString(S1);
printf("StrLength\t%d\n", StrLength(S1));
scanf("%s", S);
StrAssign(S2, S);
printf("S2\t");
PrintHString(S2);
printf("StrLength\t%d\n", StrLength(S1));
printf("Compare S1 vs S2\t%d\n", StrCompare(S1, S2));
Concat(T, S1, S2);
printf("T = S1 + S2\t");
PrintHString(T);
SubString(S1, T, , );
printf("Sub :T[2]-T[4]\t");
PrintHString(S1);
return ;
}

4_2_part2.cpp

  四.测试

  连接

  

  求子串

  

  比较串

  

数据结构算法C语言实现(十四)--- 4.1&4.2串的类型定义、表示及实现的更多相关文章

  1. 数据结构算法C语言实现(四)---2.3循环链表与双向链表

    一.简述 [工作中...]

  2. 数据结构算法C语言实现(十七)--- 5.1&5.2数组:定义、顺序表示及实现

    一.简述 理解数组位置的计算公式 LOC(j1, j2, ···, jn) = LOC(0, 0, ..., 0) + (b2 x ··· x bn x j1 + b3 x ··· x bn x j2 ...

  3. 数据结构算法C语言实现(二十)--- 6.3.1遍历二叉树

    一.简述 二叉树的遍历主要是先序.中序.后序及对应的递归和非递归算法,共3x2=6种,其中后序非递归在实现上稍复杂一些.二叉树的遍历是理解和学习递归及体会栈的工作原理的绝佳工具! 此外,非递归所用的栈 ...

  4. 数据结构算法C语言实现(十二)--- 3.4循环队列&队列的顺序表示和实现

    一.简述 空队列的处理方法:1.另设一个标志位以区别队列是空还是满:2.少用一个元素空间,约定以队列头指针在队尾指针下一位置上作为队列呈满的状态的标志. 二.头文件 //3_4_part1.h /** ...

  5. 数据结构算法C语言实现(十)--- 3.3栈与递归的实现

    一.简介 汉诺塔问题是递归的一个典型例子,而且书上的讲解很详细,对理解C语言函数及函数传参的工作机制很有帮助,值得一看.而且,递归在我看来和分治.DP.贪心等一样是十分优美的思想,值得学习!!! 二. ...

  6. 数据结构算法[c语言]

    共16章,共四部分:基础知识,数据结构,排序和搜索. 所有的实现都是使用C语言缩写.任何语言都有优缺点,选用C语言是因为它使用的广泛. 第一章: 导论 第二章: 算法分析原理 第三章: 基本数据结构 ...

  7. 数据结构算法C语言实现(八)--- 3.2栈的应用举例:迷宫求解与表达式求值

    一.简介 迷宫求解:类似图的DFS.具体的算法思路可以参考书上的50.51页,不过书上只说了粗略的算法,实现起来还是有很多细节需要注意.大多数只是给了个抽象的名字,甚至参数类型,返回值也没说的很清楚, ...

  8. 数据结构算法C语言实现(六)---2.4一元多项式的表示及相加

    一.简述 利用链表表示稀疏多项式,并基于之前的一些操作(编程实现上还是有所不同的)组合新的操作实现一元多项式的表示及相加. 二.ADT 抽象数据类型一元多项式的定义 ADT Polyomail{ 数据 ...

  9. 数据结构算法C语言实现(五)---2.3重新定义线性链表及其基本操作

    一.简述 ...由于链表在空间的合理利用上和插入.删除时不需要移动等的优点,因此在很多场合下,它是线性表的首选存储结构.然而,它也存在着实现某些基本操作,如求线性表的长度时不如顺序存储结构的缺点:另一 ...

  10. 数据结构算法C语言实现(二)---2.3线性表的链式表示和实现之单链表

    一.简述 [暂无] 二.头文件 #ifndef _2_3_part1_H_ #define _2_3_part1_H_ //2_3_part1.h /** author:zhaoyu email:zh ...

随机推荐

  1. nginx学习(1):编译、安装、启动

    一.下载 从官网http://nginx.org/en/download.html 下载稳定版(目前最新稳定版是1.6.2) 二.解压 tar zxf nginx-1.6.2.tar.gzcd ngi ...

  2. K-means算法及文本聚类实践

    K-Means是常用的聚类算法,与其他聚类算法相比,其时间复杂度低,聚类的效果也还不错,这里简单介绍一下k-means算法,下图是一个手写体数据集聚类的结果. 基本思想 k-means算法需要事先指定 ...

  3. Oracle 常用操作【01】修改、更新数据

    1. oracle 修改表名.列名.字段类型.添加表列.删除表列  alert table scott.test rename to test1--修改表名 alter table scott.tes ...

  4. Python3.1-标准库之Numpy

    这系列用来介绍Python的标准库的支持Numpy部分.资料来自http://wiki.scipy.org/Tentative_NumPy_Tutorial,页面有许多链接,这里是直接翻译,所以会无法 ...

  5. ModernUI教程:处理内容导航事件

    Modern UI包含了一个机遇uri的内容导航框架用来处理区域加载.卸载和处理访问记录页面间的导航. 如果你希望你的页面具有这些处理事件,你需要继承一个IContent接口,该接口位于FirstFl ...

  6. [转]史上最全的CSS hack方式一览

    做前端多年,虽然不是经常需要hack,但是我们经常会遇到各浏览器表现不一致的情况.基于此,某些情况我们会极不情愿的使用这个不太友好的方式来达到大家要求的页面表现.我个人是不太推荐使用hack的,要知道 ...

  7. 富文本KidnEditor在MVC中的应用

    最近看到很多网站后台都用到了富文本,包括自己所在的公司也是.公司用的KindEditor,所以就讲讲KindEditor.之前我也没学过,所以网上搜了一篇博文,直接转载如下(PS:完全以学习为目的哦~ ...

  8. [Offer收割]编程练习赛5-1 小Ho的防护盾

    #1357 : 小Ho的防护盾 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho的虚拟城市正在遭受小Hi的攻击,小Hi用来攻击小Ho城市的武器是一艘歼星舰,这艘歼星 ...

  9. 东大OJ-1544: GG的战争法则

    题目描述 你在桥上看风景 看风景的人在楼上看你 明月装饰了你的窗子 你装饰了我的梦 这是GG在长坂坡发出的感叹. 三年前GG莫名的穿越到了三国时期,在这三年里他看尽了各种杀戮,心里早已麻木.GG他渴望 ...

  10. rabbitmq 相关方法

    //连接$conn_args = array( 'host'=>'127.0.0.1' , 'port'=> '5672', 'login'=>'guest' , 'password ...