当前位置:文档之家› 数据结构第四章串ppt

数据结构第四章串ppt



顺序存储结构

链接存储结构

索引存储结构

技 学
不讲

6
4.2.1 串的顺序存储结构
南• 1.顺序存储的类型定义
昌• 顺序串的类型定义与顺序表的定义相似,可以用一个字符
大 型数组和一个整型变量表示,其中字符数组存储串,整型
学 变量表示串的长度。
科 技•
如串S=“Beijing”,字符串从S.ch[0]单元开始存放,用‘\0’
{ 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-2
十分浪费。
8
4.2.1 串的顺序存储结构
• (2)紧凑存储。同样存
南 昌
储S="Hello boy",用紧
大 凑格式一个地址能存四
学 个字符,如图5-3所示。 科 技 紧凑存储的优点是空间
学 利用率高,缺点是对串
院 中字符处理的效率低。
存储地址 1000 1001 1002 1003
字长为4
}/* S_STRLEN */
22
(3)顺序串的比较函数S_strcmp(s1, s2):比较两个顺序串的 大小。若s1=s2,则函数返回0;若s1>s2,则函数返回正数; 若s1<s2,则函数返回负数。
/* 两个顺序串比较函数,函数返回值为0、正数或负数 */
南int S_strcmp(s1, s2)
学 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 */
昌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++;
/* 求带头结点链串head的长度函数 */ int L_strlen(head) linkstring *head;
大 { linkstring *p; int i;

p=head->next; /* 指向链串head的首结点 */

for(i=1;p!=NULL;i++) /* 统计链串中结点的个数 */
科 技 串名
学 院
串元素
串值
n为串长
不包含任何字符的串称为空串(Empty String),
空串的长度为零。
2
• 串相等:
• “BeiJing 2010” “BeiJing 2010”
南•
一个串中任意个连续的字符组成的子序列称为该串的子 串,包含子串的串相应地称为该子串的主串。
昌 •例如:“a”、“ab”、“abcd”都是主串“abcde”的子串。

技• 对于结点大小为1的链串,其类型定义如下:
学 院
/* 链串结点大小为1的结点类型 */
typedef struct strnode
{ char data;
/* data为结点的数据域 */
struct strnode *next; /* next为指针域 */
} linkstring;
/* linkstring为链串类型 */
图4-3 9
4.顺序串的类型定义

昌 顺序串的类型定义与顺序表类似,可定义为:

#define STRMAX 64

typedef struct node

{ char data[STRMAX];

int slen;
学 院
}seqstring;
/* seqstring为顺序串的类型 */
10
4.2.2 串的链接存储结构

在串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)后,
}/* 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);/* 返回顺序串的长度 */
串常量与串变量 • 串常量:在程序执行过程中,其值不能改变的量
南昌大学•例串E:rr变or量(“o:在ver程flo序w执”)行中 过“程ov中erf,lo其w”值是是直可接以量。改变的量 科 技 注意 不能使用赋值语句对串变量进行赋值运算。 学 院
5
4.2 串的存储结构
南 • 常用的串的存储方式有:
技 学 院
{ 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; }
11
2.改进的链接存储方法
• 改进的链接存储方法是:让链表中每个结点存放多个字符。
• 通常,将链表中每个结点数据域存储的字符个数称为结点的
南 大小。 昌 大 学 科 技 学 院•当结点大小m>1(例如m = 4)时,链串最后一个结点的各
个数据域不一定被m个字符占满。此时,应在每个串的末尾
还没有被占用的数据域里加上一个串的结束标志
学 来表示串的结束,则串S的存储示意图下图所示。

7
4.2.1 串的顺序存储结构
• 2.存储方式
南• 当计算机按字节(Byte)为单
存储地址
字长为4

位编址时,一个存储单元刚好 存放一个字符,串中相邻的字
大 学•
符顺序地存储在地址相邻的存 储单元中。 当计算机按字(例如1个字为
1000 1001 1002 1003
linkstring *head ; /* head是链串的头指针 */15
• 对于结点大小不为1的链串,其类型定义为:

/* NODESIZE为链串结点的大小,由用户自定义 */ #define NODESIZE 4
昌 typedef struct strnodem
大 { char data[NODESIZE]; /* data为结点数据域 */
1.一般的链接存储方法
南 • 采用链接存储结构的串称为链串。
昌 • 链串与链表的差异:在于其结点的数据域为字符类型。
大 • 下图就是一个字符串链接存储结构的示意图。


技 学

串的链接存储结构的优点: 便于字符的插入和删除运算。
院 • 串的链接存储结构的缺点:
存储空间的利用率很低。
访问链串的子串比访问顺序串的子串效率要低,
科 技
32位)为单位编址时,一个存 储单元可以由4个字节组成。 此时顺序存储结构又有非紧凑
学 院•
格式和紧凑格式两种存储方式。 (1)非紧凑存储。设串 S="Hello boy",计算机字长为
32位(4个Byte),用非紧凑
格式一个地址只能存一个字符,
如图4-2所示。其优点是运算 处理简单,但缺点是存储空间
(例如‘\0’或‘@’),以表示串的结束,
12
3.链串的类型定义
• 链串和单链表的差异仅在于其结点数据域为字符类型。
南 • 链串中每个结点有两个域:数据域data存放一个字符或
昌 一个字符串(对于结点大小不为1的链串),指针域
大 next存放指向下一个结点的指针。一个链串则由头指针
学 head惟一确定。
s=“good to you!”。
19
4.3.2 顺序串上基本运算的实现
南(1)顺序串的赋值函数S_strassign(s):将从键盘
昌 输入的一串字符赋给串变量s。
大/* 顺序串建立函数,从键盘输入字符串赋给顺序串变量s */ 学 void S_strassign(s)
科 seqstring *s;

相关主题