数据结构(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年的课本?麻烦把目录告知,非常感谢

4-3-串的块链存储结构-串-第4章-《数据结构》课本源码-严蔚敏吴伟民版

《数据结构:c语言版》(严蔚敏)知识点整合

数据结构(C语言版)严蔚敏->顺序表的定义及合并顺序表