在项目一中介绍了顺序串的构成利弊,这次来了解一下链串。
顾名思义,采用链式储存结构的串叫做链串。
链串的组织形式与一般的单链表相似,主要区别在于链串中的一个结点可以储存多个字符,通常将链串中每个结点所储存的字符个数称为结点大小。
当结点大小大于1时,链串的尾结点的各个数据域不一定总能全被字符占满,此时应在这些未占用的数据域里补上不属于字符集的特殊符号(例如‘#’字符),以示区别。(书上的大白话)。(意思就是链式储存当结点中放了多个字符的时候,结果尾结点字符没放满,为了填满它放一些与字符区分的特殊符号。)
链串储存的密度一般比非紧凑格式顺序串储存密度大,而且是结点大小越大,储存密度越大(毕竟每个结点都是放的满满的,尾结点除外),因此它适合于那种串修复很少的情况;与之相反,结点大小越小,相关操作实现起来越方便,但就是储存密度较小。
一般情况下,规定链串结点大小均为1。
以下为一个链串结点的实现:
头文件(liString.h)
*Copyright (c) 2017,烟台大学计算机与控制工程学院
*All rights reserved.
*文件名称:多文件组织
*作 者:张昕
*完成日期:2017年10月19日
*版 本 号:v1.0
*/
#ifndef LISTRING_H_INCLUDED
#define LISTRING_H_INCLUDED
typedef struct snode
{
char data;
struct snode *next;
} LiString;
void StrAssign(LiString *&s,char cstr[]); //字符串常量cstr赋给串s
void StrCopy(LiString *&s,LiString *t); //串t复制给串s
bool StrEqual(LiString *s,LiString *t); //判串相等
int StrLength(LiString *s); //求串长
LiString *Concat(LiString *s,LiString *t); //串连接
LiString *SubStr(LiString *s,int i,int j); //求子串
LiString *InsStr(LiString *s,int i,LiString *t) ; //串插入
LiString *DelStr(LiString *s,int i,int j); //串删去
LiString *RepStr(LiString *s,int i,int j,LiString *t); //串替换
void DispStr(LiString *s); //输出串
#endif // LISTRING_H_INCLUDED
源文件(liString.cpp)
#include <stdio.h>
#include <malloc.h>
#include "liString.h"
void StrAssign(LiString *&s,char cstr[]) //字符串常量cstr赋给串s
{
int