数据结构 - 串的性质和基本操作(二)

串的顺序存储结构

①定长顺序存储

结构类型:

#define  MAXSTRLEN  255
// 用户可在255以内定义最大串长
typedef unsigned char SString[MAXSTRLEN+1];
// 0号单元存放串的长度

分析:

(1) 串的实际长度可在这个预定义长度的范围内随意设定,超过预定义长度的串值则被舍去,称之为“截断”

(2) 按这种串的表示方法实现串的运算时,其基本操作为“字符序列的复制”

串的联接算法中需分三种情况处理

(第一种情况)

Status Concat(SString S1, SString S2, SString &T) {

  if (S1[0]+S2[0] <= MAXSTRLEN) {// 未截断
     T[1..S1[0]] = S1[1..S1[0]];
     T[S1[0]+1..S1[0]+S2[0]] = S2[1..S2[0]];
     T[0] = S1[0]+S2[0];   uncut = TRUE;
     }
     return uncut;
} 

注意: 用T返回由S1和S2联接而成的新串。若未截断, 则返回TRUE,否则FALSE。

(第二种情况)

Status Concat(SString S1, SString S2, SString &T) {
  if (S1[0]+S2[0] <= MAXSTRLEN) {// 未截断

  else if (S1[0] <MAXSTRSIZE) { // 截断
     T[1..S1[0]] = S1[1..S1[0]];
     T[S1[0]+1..MAXSTRLEN] =S2[1..MAXSTRLEN-S1[0]];
     T[0] = MAXSTRLEN;
     uncut = FALSE;
     }
     return uncut;
} 

注意: 用T返回由S1和S2联接而成的新串。若未截断, 则返回TRUE,否则FALSE。

(第三种情况)

Status Concat(SString S1, SString S2, SString &T) {
  if (S1[0]+S2[0] <= MAXSTRLEN) {// 未截断

  else if (S1[0] <MAXSTRSIZE) { // 截断
    else{
    T[0..MAXSTRLEN] = S1[0..MAXSTRLEN];
    // T[0] == S1[0] == MAXSTRLEN
    uncut = FALSE;           }

    return uncut;
} 

注意: 用T返回由S1和S2联接而成的新串。若未截断, 则返回TRUE,否则FALSE。

②堆分配存储

分析:

(1)通常,C语言中提供的串类型就是以堆这种存储方式实现的

(2)系统利用函数malloc( )和free( )进行串值空间的动态管理,为每一个新产生的串分配一个存储区,称串值共享的存储空间为“堆”

(3)C语言中的串以一个空字符(‘\0’)为结束符, 串长是一个隐含值

结构类型:

//按串长分配存储区
typedef struct{
    char   *ch;
    int    length;
}HString;

注意:

(1)在程序执行过程中,利用标准函数malloc和free动态分配或释放存储字符串的存储单元,并以一个特殊的字符(’\0’)作为字符串的结束标志

算法实现的步骤:

先为新生成的串分配一个存储空间,然后进行串值的复制

算法如下:

int  StringAssign(HString &T, char * chars) {
    if(T.ch)
       free(T.ch);  //若T已经存在,将它占据的空间释放掉  

    for(i=0,c = chars;  c; ++i, ++c ) ;//求chars串的长度i

    if(!i) { //空串
       T.ch=NULL;
       T.length=0;
    } else {
       if(!(T.ch=(char*)malloc(i*sizeof(char))))
                exit(OVERFLOW);
            T[0..i-1] = chars[0..i-1]; //对应字符赋值
            T.length = i;
        }
    return OK;
 }

串的堆分配存储的操作实现

int StringConcat(HString &T,HString S1,HString S2){
    //T返回S1和S2联接的新串
    if(T.ch)
          free(T.ch); //释放T原来占据的空间

    if(!(T.ch=(char*)malloc((S1.length+S2.length)*sizeof(char))))

          exit (OVERFLOW);  //重新为T分配空间
          T.ch[0..S1.length-1]=S1.ch[0..S1.length-1];
          T.length=S1.length+S2.length;
          T.ch[S1.length..T.length-1] = S2.ch[0..S2.length-1];

          return OK;
}

串的链式存储结构

分析:

(1)串作为一种特殊的线性表(数据元素为字符),使用顺序表示时,做插入和删除运算,运算量很大,不方便,效率低

(2)所有经常采用链式存储结构

什么是链式存储结构呢?

如下图所示:

直接采用上面这种链表存储串值,进行操作时效率太低

这种链表存储就比上面的那种效率高

时间: 2024-08-01 20:32:57

数据结构 - 串的性质和基本操作(二)的相关文章

数据结构 - 串的性质和基本操作(一)

串的概念 什么是串呢? 串(String):由零个或多个字符组成的有限序列.记为:s='a1a2-an'(n≥0) s为串名, 'a1a2-an'为串值,n为串的长度. 子串在主串中的位置:以子串的第一个字符在主串中的位置来表示 串相等:当且仅当两个串的串值相等(两个串的长度相等,并且各个对应的字符也都相等 串的数据类型 ADT String { D={ ai |ai∈CharacterSet, i=1,2,...,n, n≥0 } R={ < ai-1, ai > | ai-1, ai ∈D

javascript实现数据结构: 串的块链存储表示

和线性表的链式存储结构相类似,也可采用链式方式存储串值.由于串结构的特殊性--结构中的每个数据元素是一个字符,则用链表存储串值时,存在一个"结点大小"的问题,即每个结点可以存放一个字符,也可以存放多个字符. 下面是结点大小为4(即每个结点存放4个字符)的链表: head --> (a) --> (b) --> (c) --> ... --> (i) 当结点大小大于1时,由于串长不一定是结点大小的整倍数,则链表中的最后一个结点不一定全被串值占满,此时通常补上

[数据结构] 二叉树的建立及其基本操作

如图: 代码: #include <iostream> #include <stdio.h> #include <algorithm> #include <string.h> using namespace std; char ch; typedef struct BinNode { char data; struct BinNode *lchild,*rchild; }BinNode,*BinTree; //二叉树链式存储结构 void CreateBin

.net core 1.1.0 MVC 控制器接收Json字串 (JObject对象) (二)

.net core 1.1.0 MVC 控制器接收Json字串 (JObject对象) (二) .net core 1.1.0 MVC 控制器接收Json字串 (JObject对象) (一) 上一篇主要是以Form键值对提交的数据,转为Json方式处理,有时我们直接以Body字串提交,我们要解决以下两种方式提交的取值问题: JObject $('#btn_add').click(function (e) { var a = $('#tb_departments').bootstrapTable(

数据结构与算法-链表的基本操作---ShinPans

//链表操作:建立.插入.删除.查找.倒置.删除等基本操作 #include<stdio.h> #include<stdlib.h> typedef  struct LNode {       int data;       structLNode *next; }LNode,*Llist; LNode *creat_head();//创建一个空表 void creat_list(LNode *,int);//创建一个长度为n的线性链表 void insert_list(LNode

数据结构 【实验7 二叉树基本操作】

实验7   二叉树基本操作 实验目的 1.  熟悉二叉树结点的结构和对二叉树的基本操作. 2.  掌握对二叉树每一种操作的具体实现. 3.  学会利用递归方法编写对二叉树这种递归数据结构进行处理的算法. 实验内容 该程序的功能是实现二叉树结点的类型定义和对二叉树的基本操作.该程序包括二叉树结构类型以及每一种操作的具体的函数定义和主函数. /* 定义DataType为char类型 */ typedef char DataType; /* 二叉树的结点类型 */ typedef struct Bit

数据结构—串的堆分配

#include<stdio.h> #include<stdlib.h> typedef struct { char *ch; int length; }HString; void StrAssign(HString &T,char *chars); void StrLength(HString S); void StrCompare(HString S,HString T); void ClearString(HString &S); void Concat(HS

数据结构——串的相关算法实现

数据结构--串的相关算法实现 顺序串的插入函数实现 在进行顺序串的插入时,插入pos将串分为两个部分(假设为A.B,长度为LA.LB)及待插入部分(假设为C,长度为LC),则串由插入前的AB变为ACB,由于是顺序串,插入会引起元素的移动.可能会出现以下的三种情况: ①插入后串长度(LA+LC+LB)<=MAXLEN,则将B后移LC个元素位置,再将C插入: ②插入后串长度 >=MAXLEN 且 pos+LC <=MAXLEN,则 B 后移时会有部分字符被舍弃; ③插入后串长度>MAX

数据结构学习之单链表基本操作

数据结构学习之单链表基本操作 0x1 前言 今天实验课,学习了下单链表的写法,这里记录下. 0x2 正文 题目要求如下: 本实验的单链表元素的类型为char,完成如下实验要求: (1)初始化单链表h (2)采用尾插法依次插入a.b.c.d.e (3)输出单链表h (4)输出单链表h的长度 (5)判断单链表h是否为空 (6)输出单链表h的第3个元素 (7)输出元素a的逻辑位置 (8)在第4个元素位置上插入元素f (9)输出单链表h (10)删除单链表h的第3个元素 (11)输出单链表h (12)释