课次14——第四章02堆串,块链串
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
显然,若数据元素很多,用法2存储更优—称为块链结构
7 2020/8/4
4.2.3
块链结构的定义
#define BLOCK_SIZE 4
块链串(2)
/*每结点存放字符个数*/
typedef struct Block {
char ch[BLOCK_SIZE]; struct Block *next; } Block;
4.2.2 堆串(1)
讨论:想存放超长字符串怎么办?——静态数组有缺陷!
改用动态分配的一维数组—— “堆”! 堆分配存储:
仍用一组连续的存储单元来存放串,但存储空间是在程序 执行过程中动态分配而得。
思路:利用malloc函数合理预设串长空间。 特点: 若在操作中串值改变,还可以利用realloc函数按新
if (temp==NULL) return(0);
for (i=0;i<pos;i++) temp[i]=s->ch[i];
for (i=0;i<t ->len;i++) temp[i+pos]=t -> ch[i];
for (i=pos;i<s->len;i++) temp[i + t.-> len]=s->ch[i];
4.2.3 块链串(1)
链式存储特点 :用链表存储串值,易插入和删除。
法1:链表结点(数据域)大小取1
head A
B
C
I NULL
法2:链表结点(数据域)大小取n(例如n=4)
head A B C D
E F G H
I # # # NULL
讨论:法1存储密度为 1/2;法2存储密度为 9/1;5=3/5
{ s->ch=(char *)malloc(len); if (s->ch==NULL) return(0); for (i=0;i<len;i++) s->ch[i]=tval[i];
} else s->ch=NULL; s->len=len; return(1); }
4 2020/8/4
4.2.2 堆串(5)
串长度增加(堆砌)空间。
1 2020/8/4
4.2.2 堆串(2)
堆串存储表示:在C语言中,已经有一个称为“堆”的自 由存储空间,并可用函数malloc和函数free完成动态存储、 释放的管理。因此,我们可以直接利用C语言中的“堆” 来实现堆串。此时堆串可定义如下:
typedef struct {
堆串:
heap[MAXSIZE]
free=23
a p r o g r a ms t r i n g
p r oc e s s
符号表
符号名 len
start
a
9
0
b
7
9
c
7
16
3 2020/8/4
百度文库
4.2.2 堆串(4)
(1) 堆串赋值函数
StrAssign(HString *s,char *tval) /*将字符常量tval的值赋给串s */ { int len,i=0; if (s->ch!=NULL) free(s->ch); while (tval[i]!='\0') i++; len=i; if (len)
9 2020/8/4
4.3 总结与提高(2)
Link *StrIndex(LKString *s, LKString *t) /* 求串t在串s中第一次出现的位置
指针,作为返回指针的函数,定义时要加* */
{ Link *sp, *tp, *start;
/*Link为节点数据类型*/
if (t->len == 0) return s->head->next; /* 空串是任意串的子串 */
【算法思想】从主串s的第一个字符和模式串t的第一个字 符开始比较,如果相等,就继续比较后续字符,如果不等, 则从主串s的下一个字符开始重新和模式串t比较。一直到 模式串t中的每一个字符依次和主串s中的对应字符相等, 则匹配成功,返回主串的当前起始位置指针。如果主串中 没有和模式串相同的子串,则称匹配不成功,返回空指针 NULL。
char * ch; int len; } HString;
其中len域指示串的长度,ch域指示串的起始地址。
2 2020/8/4
4.2.2 堆串(3)
串名符号表:所有串名的存储映像构成一个符号表。借助此 结构可以在串名和串值之间建立一个对应关系,称为串名的 存储映像。
堆串的存储映象示例
a='a program',b='string ',c='process',free=23。
typedef struct {
Block *head; Block *tail; int length; } BLString;
8 2020/8/4
4.3 总结与提高(1)
要求编写一个用带头结点的单链表实现串的模式匹配算法, 每个结点存放一个字符(结点大小为1)。
【问题分析】该算法类同顺序串的简单模式匹配,实现匹 配过程需考虑链表的特征(从头比较的技术,指针保留的 技术)。
s->len+=t -> len;
free(s->ch);
s->ch=temp;
return(1);
5 2020/8/4
}
4.2.2 堆串(6)
(3) 堆串删除函数
6 2020/8/4
StrDelete(HString *s,int pos,int len) /*在串s中删除从下标pos起len个字符 */ { int i; char *temp;
if (pos<0 || pos>(s->len - len)) return(0); temp=(char *)malloc(s->len - len); if (temp==NULL) return(0); for (i=0;i<pos;i++) temp[i]=s->ch[i]; for (i=pos;i<s->len - len;i++) temp[i]=s->ch[i+len]; s->len=s->len-len; free(s->ch); s->ch=temp; return(1); }
(2) 堆串插入函数
StrInsert(HString *s,int pos,HString *t)
/*在串s中下标为pos的字符之前插入串t */
{ int i; char *temp;
if (pos<0 || pos>s->len || s->len==0) return(0);
temp=(char *)malloc(s->len + t ->len);