数据结构第四章串ppt
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
技 学 院
p=p->next; printf("\n\t该串的长度为%2d", i); return(i); /* 函数返回带头结点链串head长度 */
}/* L_STRLEN */
head
p
27
(3)链串比较函数L_strcmp(head1, head2):将
两个带头结点链串进行比较。若两串相等,则函
}/* S_STRLEN */
22
(3)顺序串的比较函数S_strcmp(s1, s2):比较两个顺序串的 大小。若s1=s2,则函数返回0;若s1>s2,则函数返回正数; 若s1<s2,则函数返回负数。
/* 两个顺序串比较函数,函数返回值为0、正数或负数 */
南int S_strcmp(s1, s2)
}/* S_STRASSIGN */ 21
南(2)求顺序串的长度函数S_strlen(s):求顺
昌 序串s的长度。
大
学 /* 求顺序串长度函数 */
科 int S_strlen(s)
技 seqstring *s;
学 院
{ printf("\n\t顺序串长度length=%d\n", s->slen); return (s->slen);/* 返回顺序串的长度 */
学 来表示串的结束,则串S的存储示意图下图所示。
院
7
4.2.1 串的顺序存储结构
• 2.存储方式
南• 当计算机按字节(Byte)为单
存储地址
字长为4
昌
位编址时,一个存储单元刚好 存放一个字符,串中相邻的字
大 学•
符顺序地存储在地址相邻的存 储单元中。 当计算机按字(例如1个字为
1000 1001 1002 1003
例如,s=strcat(s1, s2),则s=“a1a2…anb1b2…bm”。
18
(4)串比较strcmp(s1, s2)
比较两个字符串的大小。若s1<s2,则函数返回一个
南 昌
负数或1;若s1>s2,则函数返回一个正数或1;若 s1=s2,则函数返回0。
大 (5)串插入insert(s1, i, s2)
学
在串s1第i个字符位置之后插入字符串s2,例如,执行
科
insert(s2, 3,“THIS”) 后,s2=“b1b2b3THISb4…bm”。
技 学
(6)串删除delete(s,
i,
j):
院
从串s第i个字符开始,连续删除j个字符。若不足j个字
符,则删除到s的最后一个字符。
例如,s=“good lucky to you!”,执行delete(s, 6, 6)后,
科 技 串名
学 院
串元素
串值
n为串长
不包含任何字符的串称为空串(Empty String),
空串的长度为零。
2
• 串相等:
• “BeiJing 2010” “BeiJing 2010”
南•
一个串中任意个连续的字符组成的子序列称为该串的子 串,包含子串的串相应地称为该子串的主串。
昌 •例如:“a”、“ab”、“abcd”都是主串“abcde”的子串。
11
2.改进的链接存储方法
• 改进的链接存储方法是:让链表中每个结点存放多个字符。
• 通常,将链表中每个结点数据域存储的字符个数称为结点的
南 大小。 昌 大 学 科 技 学 院•当结点大小m>1(例如m = 4)时,链串最后一个结点的各
个数据域不一定被m个字符占满。此时,应在每个串的末尾
还没有被占用的数据域里加上一个串的结束标志
科
技• 对于结点大小为1的链串,其类型定义如下:
学 院
/* 链串结点大小为1的结点类型 */
typedef struct strnode
{ char data;
/* data为结点的数据域 */
struct strnode *next; /* next为指针域 */
} linkstring;
/* linkstring为链串类型 */
p1=head1; /* 指向head1的首结点 */
p2=head2; /* 指向head2的首结点 */
28
/* 将两个链串进行比较,函数返回-1 、0、或1 */
while((p1!=NULL)&&(p2!=NULL)&&(k==0))
linkstring *head ; /* head是链串的头指针 */15
• 对于结点大小不为1的链串,其类型定义为:
南
/* NODESIZE为链串结点的大小,由用户自定义 */ #define NODESIZE 4
昌 typedef struct strnodem
大 { char data[NODESIZE]; /* data为结点数据域 */
/* 求带头结点链串head的长度函数 */ int L_strlen(head) linkstring *head;
Байду номын сангаас
大 { linkstring *p; int i;
学
p=head->next; /* 指向链串head的首结点 */
科
for(i=1;p!=NULL;i++) /* 统计链串中结点的个数 */
学
struct strnodem *next;/* next为指针域 */
科 }linkstringnode;
技 /*linkstringnode是结点大小为m的链串类型 */
学
院
16
4.3 串的基本运算及实现 南 昌 ➢4.3.1 串的基本运算 大 学 ➢4.3.2 顺序串上基本运算的实现 科 技 ➢4.3.3 链串上基本运算的实现 学 院
大
学
•
字符在序列中的序号称为该字符在串中的位置,子串在 主串中的位置是以子串的第一个字符在主串中的位置来
科 表示的。
技 • 例如,有两个字符串A和B分别为:
学
A=“This is a string” B=“is”
院
B在A中的序号(或位置)是3
注: 空串是任意串的子串,任意串是其自身的子串。
真子串
4
图4-2
十分浪费。
8
4.2.1 串的顺序存储结构
• (2)紧凑存储。同样存
南 昌
储S="Hello boy",用紧
大 凑格式一个地址能存四
学 个字符,如图5-3所示。 科 技 紧凑存储的优点是空间
学 利用率高,缺点是对串
院 中字符处理的效率低。
存储地址 1000 1001 1002 1003
字长为4
昌seqstring *s1, *s2; 大{ int i=0, flag=1, m=0, n1, n2; 学 n1=S_strlen(s1); n2=S_strlen(s2);
S1:abcde S2:abcde
科 while ((flag==1)&&(i<=n1)&&(i<=n2))
技 { i++;
{ p=(linkstring *)malloc(LEN); p->data=t[k++];
y->next=p; y=p;}
y->next=NULL; return(s);
}/* L_STRASSIGN */
26
(2)求链串长度函数L_strlen(head):求带头结点 链串head的长度。
南 昌
第4章 串
南 • 4.1 串的基本概念
昌 大
•
4.2
串的存储结构
学 • 4.3 串的基本运算及实现
科 技
•
4.4
串的模式匹配运算
学 • 4.5 串的简单应用举例
院
1
4.1 串的基本概念
南 • 串(或字符串String)是由零个或多个字
昌 符组成的有限序列,一般记为:
大
学
s =“a0a1…an-1” (n≥0)
s=“good to you!”。
19
4.3.2 顺序串上基本运算的实现
南(1)顺序串的赋值函数S_strassign(s):将从键盘
昌 输入的一串字符赋给串变量s。
大/* 顺序串建立函数,从键盘输入字符串赋给顺序串变量s */ 学 void S_strassign(s)
科 seqstring *s;
南 昌
数返回0;若前串大于后串,则函数返回1;若前 串小于后串,则返回1。
大
学
/* 将两个链串进行比较,函数返回1、0、或1 */
科
int L_strcmp(head1, head2)
技 linkstring *head1, *head2;
学 { linkstring *p1, *p2;
院
int k=0; /* k为链串是否相等的标志 */
技 学 院
{ char c; int j=1; printf("\n\n\t\t请输入一个字符串,以#作为结束: "); scanf("%c", &c); while(c!='#' &&j<MAX)
{ s->data[j]=c; j++; scanf("%c", &c); }
s->data[j]='\0'; s->slen=j-1; }
1.一般的链接存储方法
南 • 采用链接存储结构的串称为链串。
昌 • 链串与链表的差异:在于其结点的数据域为字符类型。
大 • 下图就是一个字符串链接存储结构的示意图。
学
科
技 学
•
串的链接存储结构的优点: 便于字符的插入和删除运算。
院 • 串的链接存储结构的缺点:
存储空间的利用率很低。
访问链串的子串比访问顺序串的子串效率要低,
昌
顺序存储结构
大
链接存储结构
学
索引存储结构
科
技 学
不讲
院
6
4.2.1 串的顺序存储结构
南• 1.顺序存储的类型定义
昌• 顺序串的类型定义与顺序表的定义相似,可以用一个字符
大 型数组和一个整型变量表示,其中字符数组存储串,整型
学 变量表示串的长度。
科 技•
如串S=“Beijing”,字符串从S.ch[0]单元开始存放,用‘\0’
学 linkstring *s; char t[ ];
char t[] =“rogram”
科
{ int k=0; linkstring *y, *p; s=(linkstring*)malloc(LEN);
技 学
s->data='#' ; s #
y=s;
/* r为指向队尾指针 */
院
while(t[k]!='\0') /* 将字符串常量t依次赋给链串s */
return(m); }/* S_STRCMP */
S2:abde
23
4.3.3 链串上基本运算的实现
(1)链串赋值函数L_strassign(s, t):将一个字符
南 串常量t赋给链串s,函数返回指向链串s的头指针。
昌 /* 将一个串常量t赋给链串s,返回链串s头指针 */
大 linkstring *L_strassign(s, t)
科 技
32位)为单位编址时,一个存 储单元可以由4个字节组成。 此时顺序存储结构又有非紧凑
学 院•
格式和紧凑格式两种存储方式。 (1)非紧凑存储。设串 S="Hello boy",计算机字长为
32位(4个Byte),用非紧凑
格式一个地址只能存一个字符,
如图4-2所示。其优点是运算 处理简单,但缺点是存储空间
图4-3 9
4.顺序串的类型定义
南
昌 顺序串的类型定义与顺序表类似,可定义为:
大
#define STRMAX 64
学
typedef struct node
科
{ char data[STRMAX];
技
int slen;
学 院
}seqstring;
/* seqstring为顺序串的类型 */
10
4.2.2 串的链接存储结构
学 院
if(s1->data[i]!=s2->data[i]) flag=0; } if((flag==1)&&(i>n1)&&(i>n2)) m=0;
S1:abcde S2:abcdef S1:abcdef S2:abcde
else m=s1->data[i]-s2->data[i];
S1:abcdef
串常量与串变量 • 串常量:在程序执行过程中,其值不能改变的量
南昌大学•例串E:rr变or量(“o:在ver程flo序w执”)行中 过“程ov中erf,lo其w”值是是直可接以量。改变的量 科 技 注意 不能使用赋值语句对串变量进行赋值运算。 学 院
5
4.2 串的存储结构
南 • 常用的串的存储方式有:
17
4.3.1 串的基本运算 南昌大学科技学院(((123假)))求数将将串求串设s返两串一赋 串 连回 个的个值 长 接一 串s其长串1sss=个 首ttt中度rrr常“cal整 尾aea,s1量n1st数连≤a((i即g或ss21)n。接…m,:统串(ss在≤2a,计)变t:n一)n”串量,。起中t赋s形字2给=成符“串一b个1变个b数2量新…,s串。b函m,”,
(例如‘\0’或‘@’),以表示串的结束,
12
3.链串的类型定义
• 链串和单链表的差异仅在于其结点数据域为字符类型。
南 • 链串中每个结点有两个域:数据域data存放一个字符或
昌 一个字符串(对于结点大小不为1的链串),指针域
大 next存放指向下一个结点的指针。一个链串则由头指针
学 head惟一确定。