数据结构 (12)串的存储实现

一、顺序存储结构

       顺序存储结构是用一组连续的存储单元来存储串中的字符序列。这种存储方式类似于线性表的顺序存储结构,但串的存储对象仅限于字符。顺序存储结构又可以分为定长顺序存储和堆分配存储两种方式。

  1. 定长顺序存储

    • 使用静态数组存储(定长,提前开辟内存空间)字符串。
    • 为每个串变量分配一个固定长度的存储区,即定长数组。
    • 串的实际长度可以在预定义长度的范围内随意,但超出预定义长度的串值会被舍弃,称为“截断”。
  2. 堆分配存储

    • 使用动态数组存储字符串。
    • 串的存储空间在程序运行时根据串的实际长度动态分配。
    • 这种方式可以克服定长顺序存储中串长受限的问题。

二、链式存储结构

       链式存储结构是通过链表来存储串的每个字符。每个结点存储一个或多个字符,同时包括一个指向下一个结点的指针。链式存储结构便于进行插入和删除操作,但不如顺序存储结构那样方便于随机访问。

  1. 单链表存储

    • 每个节点存储一个字符,但这种方式存在较大的空间浪费。
    • 为了提高空间利用率,可以每个节点存储多个字符,最后一个节点若未被占满,可用“#”或其他非串值字符补全。
  2. 块链存储

    • 类似于线性表的链式存储结构,但每个节点称为“块”,可以存储多个字符。
    • 这种方式结合了顺序存储和链式存储的优点,既便于进行插入和删除操作,又提高了空间利用率。

三、其他存储方式

       除了顺序存储和链式存储外,还有一些其他的串存储方式,如紧缩存储和非紧缩存储等。紧缩存储是指每个存储单元中存放多个字符,以提高存储密度;而非紧缩存储则是一个存储单元中只存放一个字符。

四、实现示例

     以下是使用C语言实现的顺序存储和链式存储的简单示例:

  1. 顺序存储实现:
    #include <stdio.h>
    #include <string.h>
    
    #define MAXSIZE 255
    typedef struct {
        char ch[MAXSIZE];
        int length;
    } SString;
    
    int main() {
        SString str1, str2;
        strcpy(str1.ch, "Hello, World!");
        str1.length = strlen(str1.ch);
    
        strcpy(str2.ch, "C Programming");
        str2.length = strlen(str2.ch);
    
        // 串连接操作
        strcat(str1.ch, " ");
        strcat(str1.ch, str2.ch);
        str1.length = strlen(str1.ch);
    
        printf("The concatenated string is: %s\n", str1.ch);
    
        return 0;
    }
  2. 链式存储实现:
    #include <stdio.h>
    #include <stdlib.h>
    
    #define CHUNKSIZE 80
    typedef struct chunk {
        char ch[CHUNKSIZE];
        struct chunk *next;
    } chunk;
    
    typedef struct {
        chunk *head, *tail;
    } LinkStrNode;
    
    int main() {
        LinkStrNode str;
        str.head = str.tail = NULL;
    
        char input[100];
        printf("Input the string: ");
        scanf("%s", input);
    
        // 构造链表存储字符串
        chunk *current = NULL;
        for (int i = 0; input[i] != '\0'; i++) {
            chunk *new_chunk = (chunk *)malloc(sizeof(chunk));
            new_chunk->ch[0] = input[i];
            new_chunk->ch[1] = '\0'; // 字符串结尾
            new_chunk->next = NULL;
    
            if (str.tail == NULL) {
                str.head = str.tail = new_chunk;
            } else {
                str.tail->next = new_chunk;
                str.tail = new_chunk;
            }
        }
    
        // 输出链表存储的字符串
        current = str.head;
        while (current != NULL) {
            printf("%s", current->ch);
            current = current->next;
        }
        printf("\n");
    
        // 释放链表内存
        current = str.head;
        while (current != NULL) {
            chunk *temp = current;
            current = current->next;
            free(temp);
        }
    
        return 0;
    }

五、总结

       串的存储实现方式多种多样,每种方式都有其优点和缺点。在实际应用中,需要根据具体的需求和场景选择合适的存储方式。顺序存储结构适用于串长固定且操作频繁的场景;链式存储结构则适用于串长变化较大且需要频繁进行插入和删除操作的场景。

 结语  

傻瓜用嘴说话

聪明人用脑袋说话

智慧的人用心说话

!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/923497.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在线绘制Nature Communication同款双色、四色火山图,突出感兴趣的基因

导读&#xff1a;火山图通常使用三种颜色分别表示显著上调&#xff0c;显著下调和不显著。通过为特定的数据点添加另一种颜色&#xff0c;可以创建双色或四色火山图&#xff0c;从而更直观地突出感兴趣的数据点。 《Nature Communication》文章“Molecular and functional land…

2024赣ctf-web -wp

1.你到底多想要flag??? 首先来解决第一关&#xff1a; 先了解一下stripos&#xff08;&#xff09;&#xff1b; 并且此函数处理数组返回false。而且pre_match同样遇见数组是返回false&#xff08;解释一下正则 i&#xff1a;这是正则表达式的修饰符&#xff0c;代表“不区…

计算机毕业设计Python+大模型美食推荐系统 美食可视化 美食数据分析大屏 美食爬虫 美团爬虫 机器学习 大数据毕业设计 Django Vue.js

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

Linux 查看内核日志的方法

文章目录 1. dmesg 命令一. 介绍内核环形缓冲区的特点 二. 主要功能三. dmesg 使用 2. 查看kmsg文件/dev/kmsg 的用途使用 /dev/kmsg与 dmesg 的关系 3. 内核日志消息的打印行为 1. dmesg 命令 一. 介绍 dmesg&#xff08;display message 或 display driver message 的缩写&…

Perforce SAST专家详解:自动驾驶汽车的安全与技术挑战,Klocwork、Helix QAC等静态代码分析成必备合规性工具

自动驾驶汽车安全吗&#xff1f;现代汽车的软件包含1亿多行代码&#xff0c;支持许多不同的功能&#xff0c;如巡航控制、速度辅助和泊车摄像头。而且&#xff0c;这些嵌入式系统中的代码只会越来越复杂。 随着未来汽车的互联程度越来越高&#xff0c;这一趋势还将继续。汽车越…

从Full-Text Search全文检索到RAG检索增强

从Full-Text Search全文检索到RAG检索增强 时光飞逝&#xff0c;转眼间六年过去了&#xff0c;六年前铁蛋优化单表千万级数据查询性能的场景依然历历在目&#xff0c;铁蛋也从最开始做CRUD转行去了大数据平台开发&#xff0c;混迹包装开源的业务&#xff0c;机缘巧合下做了实时…

LLM PPT Translator

LLM PPT Translator 引言Github 地址UI PreviewTranslated Result Samples 引言 周末开发了1个PowerPoint文档翻译工具&#xff0c;上传PowerPoint文档&#xff0c;指定想翻译的目标语言&#xff0c;通过LLM的能力将文档翻译成目标语言的文档。 Github 地址 https://github.…

【踩坑】git中文乱码问题

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 背景说明 使用git diff显示中文乱码&#xff0c;如&#xff1a; 修复方法 执行一次&#xff1a; export LESSCHARSETutf-8 如果需要下次登录免输入…

安装Docker报错TCP connection reset by peer或者Timeout

原因&#xff1a;访问的外网下载导致超时或者断连接报错 修改为国内阿里下载地址 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

Linux宝塔部署wordpress网站更换服务器IP后无法访问管理后台和打开网站页面显示错乱

一、背景&#xff1a; wordpress网站搬家&#xff0c;更换服务器IP后&#xff0c;如果没有域名时&#xff0c;使用服务器IP地址无法访问管理后台和打开网站页面显示错乱。 二、解决方法如下&#xff1a; 1.wordpress搬家后&#xff0c;在新服务器上&#xff0c;新建站点时&am…

Rust Newtype模式(通过结构体封装现有类型来创建新的类型)(单字段结构体,通过.0访问)模式匹配、解构、DerefMut

文章目录 深入理解Rust中的Newtype模式什么是Newtype模式&#xff1f;Newtype模式的基本形式Newtype的访问访问 Newtype 的值1. 通过 .0 访问字段2. 通过方法访问3. 通过模式匹配&#xff08;解构&#xff09;访问 总结 Newtype模式的应用场景1. 类型安全2. 增强可读性3. 定制化…

【ArcGIS Pro】实现一下完美的坐标点标注

在CAD里利用湘源可以很快点出一个完美的坐标点标注。 但是在ArcGIS Pro中要实现这个效果却并不容易。 虽然有点标题党&#xff0c;这里就尽量在ArcGIS Pro中实现一下。 01 标注实现方法 首先是准备工作&#xff0c;准备一个点要素图层&#xff0c;包含xy坐标字段。 在地图框…

【ArcGIS Pro实操第10期】统计某个shp文件中不同区域内的站点数

统计某个shp文件中不同区域内的站点数 方法 1&#xff1a;使用“空间连接 (Spatial Join)”工具方法 2&#xff1a;使用“点计数 (Point Count)”工具方法 3&#xff1a;通过“选择 (Select by Location)”统计方法 4&#xff1a;通过“Python 脚本 (ArcPy)”实现参考 在 ArcGI…

学习threejs,使用设置lightMap光照贴图创建阴影效果

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.MeshLambertMaterial…

Cocos编辑器

1、下载 下载地址&#xff1a;https://www.cocos.com/creator-download 2、编辑器界面介绍 官方链接&#xff1a;https://docs.cocos.com/creator/3.8/manual/zh/editor/ 3、项目结构 官方链接&#xff1a;https://docs.cocos.com/creator/3.8/manual/zh/getting-started/…

C++11特性(详解)

目录 1.C11简介 2.列表初始化 3.声明 1.auto 2.decltype 3.nullptr 4.范围for循环 5.智能指针 6.STL的一些变化 7.右值引用和移动语义 1.左值引用和右值引用 2.左值引用和右值引用的比较 3.右值引用的使用场景和意义 4.右值引用引用左值及其一些更深入的使用场景分…

Notepad++ 替换所有数字给数字加单引号

前言 今天遇到这样一个场景&#xff1a; 要去更新某张表里 code1,2,3,4,5,6 的数据&#xff0c;把它的 name 设置为 ‘张三’ 但是 code在数据库里面的字段类型是 vachar(64)&#xff0c;它自身携带索引 原本可以这样写 SQL: update tableA set namezhangsan where code in …

Django 路由层

1. 路由基础概念 URLconf (URL 配置)&#xff1a;Django 的路由系统是基于 urls.py 文件定义的。路径匹配&#xff1a;通过模式匹配 URL&#xff0c;并将请求传递给对应的视图处理函数。命名路由&#xff1a;每个路由可以定义一个名称&#xff0c;用于反向解析。 2. 基本路由配…

工作中可以用到的前端小知识(不定时更新)

1、split 结合 filter(Boolean)使用&#xff0c;可以过滤空字符 2、分割 Unicode 字符 用 Array.from() 实现 const text "&#x1f44d;&#x1f60a;&#x1f468;‍&#x1f469;‍&#x1f466;"; const result Array.from(text); console.log(result); // 输…

第R4周:LSTM-火灾温度预测(TensorFlow版)

>- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营]中的学习记录博客** >- **&#x1f356; 原作者&#xff1a;[K同学啊]** 往期文章可查阅&#xff1a; 深度学习总结 任务说明&#xff1a;数据集中提供了火灾温度&#xff08;Tem1&#xff09;、一氧化碳浓度…