数据结构(C语言版)严蔚敏->串的定义(顺序存储堆分配存储块链存储)
Posted 坚持不懈的大白
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构(C语言版)严蔚敏->串的定义(顺序存储堆分配存储块链存储)相关的知识,希望对你有一定的参考价值。
字符串简称串,是由零个或多个字符组成的有序序列。
1. 串的存储结构
1.1 定长顺序存储
#define MAXLEN 255
typedef struct
char ch[MAXLEN+1];
// 下标为0处不存储字符
int length; // 串的实际长度
SString;
1.2 堆分配存储
typedef struct
char *ch; // 按串长分配存储区,ch指向串的基地址
int length; // 串的长度
HString;
1.3 块链存储
typedef struct StringNode
char ch; // 每个节点存一个字符
struct StringNode *next;
StringNode,*String;
【注】:上述块链存储结构存储密度低,每个字符占用1B,而每个指针却占4B
typedef struct StringNode
char ch[4]; // 每个节点存多个字符
struct StringNode *next;
StringNode,*String;
存储密度提高
优缺点:便于删除、增加空间,不便于随机存储。
2. 串的顺序存储结构实现
sstring.h
#ifndef SSTRING_H_INCLUDED
#define SSTRING_H_INCLUDED
#define MAXLEN 255
typedef struct
char ch[MAXLEN+1];
// 下标为0处不存储字符
int length; // 串的实际长度
SString;
bool StrAssign(SString &T, const char *chars);
// 赋值操作,把串赋值为chars
int StrLength(SString T);
// 串T的长度
void ClearString(SString &T);
// 将串T清为空串
int StrCompare(SString S,SString T);
// 串的比较操作
bool SubString(SString &Sub,SString S,int pos,int len);
// 用串Sub返回S中的第pos个字符起长度为len的子串
int Index(SString S,SString T);
// 定位操作
#endif // SSTRING_H_INCLUDED
【注】:ch字符数组下标为0处不存储字符。
sstring.cpp
#include <stdlib.h>
#include "sstring.h"
bool StrAssign(SString &T, const char *chars)
int k = 0;
while(chars[k])
k++;
if(k>MAXLEN)
return false;
for(int i=0;i<k;i++)
T.ch[i+1] = chars[i];
T.length = k;
return true;
// 赋值操作,把串赋值为chars
int StrLength(SString T)
return T.length;
// 串T的长度
void ClearString(SString &T)
T.length = 0;
// 将串T清为空串
int StrCompare(SString S,SString T)
int len_s = StrLength(S),len_t = StrLength(T);
for(int i=1;i<=len_s&&i<=len_t;i++)
if(S.ch[i]!=T.ch[i])
return S.ch[i] - T.ch[i];
return len_s - len_t;
// 串的比较操作
bool SubString(SString &Sub,SString S,int pos,int len)
int len_s = StrLength(S);
if(pos<1 || pos>len_s || len<0 || len > len_s-pos+1)
return false;
for(int i=1;i<=len;i++)
Sub.ch[i] = S.ch[pos+i-1];
Sub.length = len;
return true;
// 用串Sub返回S中的第pos个字符起长度为len的子串
int Index(SString S,SString T)
int len_s = S.length,len_t = T.length;
SString Sub;
for(int i=1;i<=len_s-len_t+1;i++)
SubString(Sub,S,i,len_t);
if(StrCompare(Sub,T)==0)
return i;
return 0;
// 定位操作
main.cpp
#include <stdio.h>
#include "sstring.h"
void PrintStr(SString S)
for(int i=1;i<=S.length;i++)
printf("%c",S.ch[i]);
printf("\\n");
int main()
SString S,T,S1,T1;
StrAssign(S,"able");
printf("S string is:");
PrintStr(S);
const char *chars = "ability";
StrAssign(T,chars);
printf("T string is:");
PrintStr(T);
// 串的比较操作
printf("S and T is %d\\n",StrCompare(S,T));
SubString(S1,S,3,2);
PrintStr(S1);
// 取子串操作
StrAssign(T1,"li");
printf("%d\\n",Index(T,T1));
// 定位操作
return 0;
运行结构如下:
以上是关于数据结构(C语言版)严蔚敏->串的定义(顺序存储堆分配存储块链存储)的主要内容,如果未能解决你的问题,请参考以下文章
4-1-串的顺序存储结构-串-第4章-《数据结构》课本源码-严蔚敏吴伟民版
数据结构(C语言版)严蔚敏->队列的顺序存储(循环队列)和链式存储
谁有《数据结构》(C语言版)严蔚敏,清华大学2005年的课本?麻烦把目录告知,非常感谢