数据结构 串结构

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

串即字符串,是由零个或多个字符组成的有限序列,是数据 元素为单个字符的特殊线性表。 记为: s =‗ a1 , a2 , …….. , an‘ (n≥0 )
隐含结束符‘/0‘ , 串名 串值(用‘ ’ 括起来) 即ASCII码NULL 若干术语: 串长: 串中字符个数(n≥0). n=0 时称为空串 。 空白串: 由一个或多个空格符组成的串。 子串: 串s中任意个连续的字符序列叫s的子串; S叫主串。
if (!(S.ch=(char*)realloc(S.ch, (S.length+T.length)*sizeof(char)) )) exit(OVERFLOW); for ( i=S.length-1; i>=pos-1; --i ) //为插入T而腾出pos之后的位置
S.ch[i+T.length] = S.ch[i];
2) 求子串函数SubString (&Sub, S, pos, len)
将串S中从第pos个字符开始长度为len的字符序列复 制到串Sub中(注:串Sub的预留长度与S一样)
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; //pos不合法则警告 Sub[1……len] = S[pos……pos+len-1]; Sub[0]=len; return OK; }
5) 联接两个串成新串
Status Concat ( HString &T, Hstring S1, Hstring S2 ) { // 用T返回由S1和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; } // Concat
子串位置: 子串的第一个字符的序号。 字符位置: 字符在串中的序号。 串相等: 串长度相等,且对应位置上字符相等。
0个或多个 字符组成的序列,一般记 练1:串是由 为 S=‘a1a2……an‘ 。
练2:现有以下4个字符串: a =‗BEI‘ b =‗JING‘ c = ‗BEIJING‘
d = ‗BEI JING‘
Concat =concatenation,在字符串处理中,把多个短字符串合成为长字符 串的操作。
数据结构课程的内容
第4章 串(String)
1. 定义 2. 逻辑结构 3. 存储结构 4. 运算规则 5. 实现方式
4.1 4.2 4.3
串类型的定义 串的表示和实现 串的模式匹配算法
4.1
串类型的定义
指针变量C也可以自 增!意即每次后移一 个数据单元。
}//StrAssign
3) 比较字符串是否相同 Int Strcompare ( Hstring S, Hstring T ) { for ( i = 0; i < S.length && i <T.length; ++i ) if ( S.ch[i] != T.ch[i] ) return S.ch [i] – T.ch[i]; return S.length- T.length; } // StrCompare 4) 清空字符串 Status ClearString ( Hstring &S) { if ( S.ch ) { free(S.ch); S.ch = NULL; } S.length = 0; return OK; } // ClearString
Байду номын сангаас
注: • 一般用SString[0]来存放串长信息; •C语言约定在串尾加结束符 ‘ \0‘,以利操作加速,但不计入串长; •若字符串超过Maxstrlen 则自动截断(因为静态数组存不 进去)。
实现方式:参见教材P73编程两例,两串连接和求子串
1) 串连接Concat(&T, S1,S2)
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 = TRUE; } else if ( S1[0] < MAXSTRSIZE ) // 截断 { 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 ]; // 截取(仅取S1) uncut = FALSE; } return uncut; } // Concat
直到终值为“假” 停止,串尾特征 是‘/0‘= NULL=0
for (i=0, c=chars; c; ++i, ++c); else{
//求串长度
if (!i) {T.ch = NULL; T.length = 0;}
if (!(T.ch = (char*)malloc(i*sizeof(char)))) exit(OVERFLOW); T.ch[0..i-1] = chars[0..i-1]; T.length =i; } Return OK;
串的抽象数据类型定义(参见教材P71) ADT Sting{ Objects: D={ai | ai∈CharacterSet, i=1, 2,…,n, n≥0} Relations: R1={<ai-1,ai> | ai-1,ai ∈D, i=2, …,n} functions: // 有13种之多 StrAssign(&T, chars) // 串赋值,生成值为chars的串T 最 StrCompare(S,T) // 串比较,若S>T,返回值大于0… 小 操 StrLength(S) // 求串长,即返回S的元素个数 作 Concat(&T, S1, S2) // 串连接,用T返回S1+S2的新串 子 SubString(&Sub, S, pos, len) // 求S中pos起长度为len的子串 集
• 定长顺序存储表示
顺序 存储 ——用一组地址连续的存储单元存储串值的字 符序列。
• 堆分配存储表示
——用一组地址连续的存储单元存储串值的字 符序列,但存储空间是在程序执行过程中动态 分配而得。
链式 • 串的块链存储表示 存储
——链式方式存储
1.定长顺序存储特点:
用一组连续的存储单元来存放串,直接使用定长的字符数 组来定义,数组的上界预先给出,故称为静态存储分配。 例如: #define Maxstrlen 255 //用户可用的最大串长 typedef unsigned char SString[ Maxstrlen+1 ]; SString s; //s是一个可容纳255个字符的顺序串。
问:① 他们各自的长度? a =3,b =4,c = 7,d=8 ② a是哪个串的子串?在主串中的位置是多少? a是c和d的子串,在c和d中的位置都是1 练3:空串和空白串有无区别? 答:有区别。空串(Null String)是指长度为零的串; 而空白串(Blank String),是指包含一个或多个 空白字符‘ ’(空格键)的字符串.
6)求子串 Status SubString ( Hstring &Sub, Hstring S, int pos, int len ) { // 用Sub返回串S的第pos个字符起长度为len的子串。 // 其中,1<=pos<= StrLength (S) 且 0<=len<=StrLength(S)-pos+1。 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.ch [ pos-1.. Pos+len-2]; Sub.length = len; } return OK; }
s =‗ a1 , a2 , …….. , an‘
pos len
n=串长
讨论:想存放超长字符串怎么办?——静态数组有缺陷!
改用动态分配的一维数组—— ―堆”!
12
2.堆分配存储特点:仍用一组连续的存储单元来存放
串,但存储空间是在程序执行过程中动态分配而得。
思路:利用malloc函数合理预设串长空间。
//从S的pos位置起全部字符均后移
S.ch[pos-1…pos+T.length-2] = T.ch[0…T.length-1];
//插入T,略/0
S.length + = T.length;
} return OK; }//StrInsert
//刷新S串长度
2) 堆分配存储表示
Status StrAssign( HString &T, char *chars ) { if (T.ch) free(T.ch);
补充:C语言中常用的串运算
注:用C处理字符串时,要调用标准库函数 #include<string.h>
串比较,int strcmp(chars1,char s2); // StrCompare(S,T) 求串长, int strlen(char s); // StrLength(S) 串连接,char strcat(char to,char from) // Concat(&T, S1, S2) 子串T定位,char strchr(char s,char c); // Index(S, T, pos) ……
Replace(s, ‗STUDENT‘,q)= ’I AM A WORKER‘
再问:Concat(SubString(s,6,2), Concat(t,SubString(s,7,8))) =? ‘A GOOD STUDENT‘
4.2 串的表示和实现
首先强调:串与线性表的运算有所不同,是以‚串的整体‛作 为操作对象,例如查找某子串,在主串某位置上插入一个子串 等。 串有三种机内表示方法:
…… Index(S, T, pos) Replace(&S, T,V)
// 返回子串T在pos之后的位置 // 用子串V替换子串T
}ADT Sting
练习: 设 s =‘I AM A STUDENT‘, t =‘GOOD‘,
q=‘WORKER‘。求:
StrLength(s) = StrLength(t) = SubString(s, 8, 7)= SubString(t, 2, 1)= Index(s, ‗A‘)= Index(s, t)= 14 4 ‗STUDENT‘ ‗O‘ 3 0 ( s中没有t!)
特点: 若在操作中串值改变,还可以利用realloc函数按新 串长度增加(堆砌)空间。 约定:所有按堆存储的串,其关键信息放置在:
Typedef struct {
char *ch; // 若非空串,按串长分配空间; 否则 ch = NULL
int length; //串长度 }HString
1)用‚堆‛实现串插入操作(教材P75)
Status StrInsert ( HString &S, int pos, HString T ) {
//在串S的第pos个字符之前(包括尾部)插入串T
if (pos<1||pos>S.length+1) return ERROR; if(T.length){
//pos不合法则告警
//只要串T不空,就需要重新分配S空间,以便插入T
相关文档
最新文档