一.简述

  【暂无】

  二.头文件

 //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. Ros与Vrep平台搭建

    参考资料: ROS安装: ros 是一个framework 和Android有点像,内核用的linux.Ros提供了一种供机器人开发者迅速上手的一个平台, 可以快速搭建自己的应用,利用ros下面自带的 ...

  2. [转]注释驱动的 Spring cache 缓存介绍

    原文:http://www.ibm.com/developerworks/cn/opensource/os-cn-spring-cache/ 概述 Spring 3.1 引入了激动人心的基于注释(an ...

  3. 分析cocos2d-x中的CrystalCraze示例游戏

    cocos2d-x自带了不少示例,以及几个比较简单的游戏,不过这些游戏都是用javascript binding(SpiderMonkey)做的,所以我猜测javascript binding可能是c ...

  4. 翻译qmake文档 目录

    利用空闲时间把qmke的文档翻译出来,翻译水平有限,有些地方翻译的不好,请谅解, 如果您能指出来,我会很感激并在第一时候做出修改. 翻译qmake文档(一) qmake指南和概述 翻译qmake文档( ...

  5. infer.net 入门2 用一个侦探故事来讲解,通俗易懂

    The results look OK, but how do you know that you aren’t missing something. Would a more sophisticat ...

  6. [Python]新手写爬虫全过程(已完成)

    今天早上起来,第一件事情就是理一理今天该做的事情,瞬间get到任务,写一个只用python字符串内建函数的爬虫,定义为v1.0,开发中的版本号定义为v0.x.数据存放?这个是一个练手的玩具,就写在tx ...

  7. Windows 部署 Redis 群集

    1,下载Redis for windows 的最新版本,解压到 c:\Redis 目录下备用https://github.com/MSOpenTech/redis/releases当前我使用的是 3. ...

  8. parsing XML document from class path resource

    遇到问题:parsing XML document from class path resource [spring/resources] 解决方法:项目properties— source—remo ...

  9. nios II--实验2——led硬件部分

    Led 硬件开发 新建原理图 1.打开Quartus II 11.0,新建一个工程,File -> New Project Wizard…,忽略Introduction,之间单击 Next> ...

  10. 日志记录类库log4net的使用总结

    log4net是一个开源的日志记录类库,经过配置后可以自动抓取程序中的错误.异常信息,并写入磁盘,也可以在异常发生时执行其他指定的操作,比如:通知某人右键.写入数据库等.这里写个ASP.NET MVC ...