武汉理工数据结构ch4

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
武汉理工大学
串中任意个连续字符组成的子序列称为该串的子串, 串中任意个连续字符组成的子序列称为该串的子串,包含子 子串 串的串相应地称为主串 主串。 串的串相应地称为主串。通常将子串在主串中首次出现时的 该子串的首字符对应的主串中的序号, 该子串的首字符对应的主串中的序号,定义为子串在主串中 位置。例如, 的位置。例如,设A和B分别为 A=“This string” B=“is is” A= This is a string B= is 的子串, 为主串。 中出现了两次, 则B是A的子串,A为主串。B在A中出现了两次,其中首次出 现所对应的主串位置是3 因此, 中的序号(或位置) 现所对应的主串位置是3。因此,称B在A中的序号(或位置) 为3。 特别地,空串是任意串的子串,任意串是其自身的子串。 特别地,空串是任意串的子串,任意串是其自身的子串。 两个串相等的 当且仅当这两个串的值相等。 称两个串相等的,当且仅当这两个串的值相等。即只有当 两个串的长度相等,且各个对应位置的字符相等时才相等。 两个串的长度相等,且各个对应位置的字符相等时才相等。
武汉理工大学
通常在程序中使用的串可分为两种:串变量和串常量。 通常在程序中使用的串可分为两种:串变量和串常量。 串常量和整常数、实常数一样,在程序中只能被引用但 串常量和整常数、实常数一样, 不能改变其值,即只能读不能写。 不能改变其值,即只能读不能写。通常串常量是由直接 量来表示的,例如语句Error( overflow”) Erro,例如语句Error( overflow )中“overflow 是直接量。但有的语言允许对串常量命名, 是直接量。但有的语言允许对串常量命名,以使程序易 易写。 C++中 读、易写。如C++中,可定义 path[]=“dir/bin/appl dir/bin/appl”; const char path[]= dir/bin/appl ; 这里path是一个串常量,对它只能读不能写。 path是一个串常量 这里path是一个串常量,对它只能读不能写。串变 量和其它类型的变量一样, 量和其它类型的变量一样,其取值是可以改变的
武汉理工大学
1.串插入 Status StrInsert(HString &s, int pos, HString t) { if(pos<1 || pos>s.length+1) return ERROR; if(t.length) { if(!(s.ch=(char*)realloc(s.ch, (s.length+t.length)*sizeof(char)))) exit(OVERFLOW); for(i=s.length-1; i>=pos-1; --i) s.ch[i+t.length] = s.ch[i]; s.ch[pos-1..pos+t.length-2]=t.ch[0..t.length-1]; s.length+=t.length; } return OK;}
武汉理工大学
6.求子串 Status SubStr(HString &sub, HString s, int pos, int len) { if(pos<1|| pos>s.length || len<0 || len>s.length-pos+1) return ERROR; if(sub.ch) free(sub.ch); if(!len) { sub.ch=NULL; sub.length=0; } else{ sub.ch=(char *)malloc(len*sizeof(char)); sub.ch[0..len-1]=s[pos-1..pos+len-2]; sub.length=len; } return OK; }
武汉理工大学
二、串的抽象数据定义
串的逻辑结构和线性表极为相似, 串的逻辑结构和线性表极为相似,区别仅在于串的 数据对象约束为字符集。然而在操作上有很大差别, 数据对象约束为字符集。然而在操作上有很大差别,线 性表大多以“单个元素”为操作对象,而串通常以“ 性表大多以“单个元素”为操作对象,而串通常以“串 的整体”为对象。 的整体”为对象。 串的抽象数据类型定义 ADT String { D={ } R1={ } (13种操作 种操作) P:(13种操作) }ADT String 中串赋值、串比较、求串长、串联接、 P中串赋值、串比较、求串长、串联接、求子串五种 操作构成串类型的最小操作子集。 操作构成串类型的最小操作子集。
武汉理工大学
2.求串长 int StrLength(HString s) { return s.length; } 3.串清空 Status ClearString(HString &s) { if(s.ch) {free(s.ch); s.ch=NULL;} s.length=0; return OK; }
第4章 串String
4.1 4.2 串类型的定义 串的表示和实现 4.2.1 定长顺序存储表示 4.2.2 堆分配存储表示 4.2.3 串的块链存储表示
武汉理工大学
4.1
串类型的定义
一.串的基本概念 (String)是零个或多个字符组成的有限序列 是零个或多个字符组成的有限序列。 串(String)是零个或多个字符组成的有限序列。一 般记作S= a1a2a3…an 其中S 串名, S=‘a1a2a3 an’, 般记作S= a1a2a3 an ,其中S 是串名,单引号括 起来的字符序列是串值 ai(1≦ 串值; n)可以是字母 可以是字母、 起来的字符序列是串值;ai(1≦i≦n)可以是字母、 数字或其它字符;串中所包含的字符个数称为该串 数字或其它字符;串中所包含的字符个数称为该串 的长度。长度为零的串称为空串(Empty String), 的长度。长度为零的串称为空串(Empty String), 空串 它不包含任何字符。 它不包含任何字符。 通常将仅由一个或多个空格组成的串称为空白串 通常将仅由一个或多个空格组成的串称为空白串 (Blank String) 注意:空串和空白串的不同,例如“ ”和“”分 注意:空串和空白串的不同,例如“ “”分 别表示长度为1的空白串和长度为0的空串。 别表示长度为1的空白串和长度为0的空串。
武汉理工大学
例1、串的定位index(S, T, pos) 串的定位 int index(string s, string t, int pos) { if(pos>0) { n=strlength(s); m=strlength(t); i=pos; while(i<=n-m+1){ substring(sub,s,i,m); if(strcompare(sub,t)!=0) ++i; else return(i); } } return(0); }
武汉理工大学
三.串的块链式存储结构 顺序串上的插入和删除操作不方便, 顺序串上的插入和删除操作不方便,需要移动大量的 字符。因此,我们可用单链表方式来存储串值, 字符。因此,我们可用单链表方式来存储串值,串的 这种链式存储结构简称为链串。 这种链式存储结构简称为链串。
武汉理工大学
二.堆分配存储表示 这种存储表示的特点是, 这种存储表示的特点是,仍以一组地址连续的存储单元 存放串值字符序列, 存放串值字符序列,但它们的存储空间是在程序执行过 程中动态分配而得。所以也称为动态存储分配的顺序表。 程中动态分配而得。所以也称为动态存储分配的顺序表。 语言中, 在C语言中,利用动态存储管理函数来根据实际需要动态 分配和释放字符数组空间。 分配和释放字符数组空间。这样定义的顺序串类型也有 两种形式。 两种形式。 typedef struct { char *ch; int length; }HString; “堆”的自由存储区,用malloc()和free()来管理。 来管理。 堆 的自由存储区, malloc()和free()来管理
武汉理工大学
4.2 串的表现和实现
因为串是特殊的线性表, 因为串是特殊的线性表,故其存储结构与线性表的存储 结构类似。只不过由于组成串的结点是单个字符。 结构类似。只不过由于组成串的结点是单个字符。串有三种 机内表示方法,下面分别介绍。 机内表示方法,下面分别介绍。 一.定长顺序存储表示 定长顺序存储表示,也称为静态存储分配的顺序表。 定长顺序存储表示,也称为静态存储分配的顺序表。它 是用一组连续的存储单元来存放串中的字符序列。 是用一组连续的存储单元来存放串中的字符序列。所谓定长 顺序存储结构,是直接使用定长的字符数组来定义,数组的 顺序存储结构,是直接使用定长的字符数组来定义, 上界预先给出: 上界预先给出: #define maxstrlen 255 typedef unsigned char SString[maxstrlen+1]; 可使用S[0]存储串的长度,pascal采用此方式。 可使用S[0]存储串的长度,pascal采用此方式。 S[0]存储串的长度 采用此方式
武汉理工大学
5.串联接 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); t.ch[0..s1.length-1]=s1.ch[0..s1.length-1]; t.length=s1.length+s2.length; t.ch[s1.length..t.length-1]=s2.ch[0..s2.length-1]; return OK; }
武汉理工大学
4.串赋值 Status StrAssign(HString &t, char *chars) { if(t.ch) free(t.ch); for(i=0,c=chars; c; ++i,++c); if(!i) { t.ch = null; t.length = 0; } else { if(!(t.ch=(char *)malloc(i*sizeof(char)))) exit(OVERFLOW); t.ch[0..i-1] = chars[0..i-1]; t.length = i; } return OK; }
武汉理工大学
1. 串联接定长顺序存储的串算法
Status Concat ( SString &T, SString S1, SString S2 ) { if ( S1[0] + S2[0] <= MAXSTRLEN ) { T[ 1.. S1[0] ] = S1[ 1.. S1[0] ]; T[ S1[0] + 1.. S1[0] + S2[0] ] = S2[ 1.. S2[0] ]; T[0] = S1[0] + S2[0]; uncut = TURE; } else if ( S1[0] < MAXSTRLEN ) { T[ 1.. S1[0] ] = S1[ 1.. S1[0] ]; T[ S1[0] + 1.. MAXSTRLEN ] = S2[ 1.. MAXSTRLEN – S1[0] ]; T[0] = MAXSTRLEN; uncut = FALSE; }
武汉理工大学
else { T[ 0.. MAXSTRLEN ] = S1[ 0.. MAXSTRLEN ]; uncut = FALSE; } return uncut;}
武汉理工大学
2. 求子串 Status SubString ( SString &Sub, SString S, int pos, int len) { if ( pos < 1 || pos > S[0] || len < 0 || len > S[0]-pos+1 ) return ERROR; Sub[ 1.. len ] = S[ pos .. pos+len-1 ]; Sub[0] = len; return OK; }
相关文档
最新文档