【数据结构】数组和字符串(十一):字符串的定义与存储(顺序存储、链式存储及其C语言实现)

news2024/12/23 15:59:11

文章目录

  • 4.3 字符串
    • 4.3.1 字符串的定义与存储
      • 1. 顺序存储
      • 2. 链式存储
      • 3. C语言实现顺序存储
      • 4. C语言实现链式存储
        • 代码优化

4.3 字符串

  字符串(String)是由零个或多个字符(char)顺序排列组成的有限序列,简称为串。例如 “good morning”就是由12个字符构成的一个字符串。一般把字符串记作:

S = ′ ′ a 0 a 1 … a n − 1 ′ ′ S=''a_{0} a_{1}…a_{n-1}'' S=′′a0a1an1′′

  其中S是串名,引号中的字符序列是串值。字符个数是串的长度,长度为0的串被称为空串,因为它不包含任何字符。需要注意的是,空格字符(" ")并不是空串,因为它包含一个字符——空格。
  若把某个串称为主串,则主串中任意个连续的字符组成的子序列被称为子串。子串在主串中第一次出现时,其首字符在主串中的序号被称为该子串在主串中的位置。

4.3.1 字符串的定义与存储

  字符串在许多非数值计算问题中扮演着重要的角色,并在模式匹配、程序编译和数据处理等领域得到广泛应用。
  在高级程序设计语言中,字符串通常被定义为以特殊字符’\0’(称为空字符或字符串结束符)结尾的字符序列。这个约定使得在处理字符串时可以方便地确定字符串的结束位置。

  关于字符串的存储方式,主要有两种常见的方式:

  • 顺序存储:字符串的字符按照顺序依次存储在连续的内存空间中。这种方式使得字符串的访问和操作效率较高,可以通过索引直接访问任意位置的字符。在顺序存储方式中,字符串的长度可以通过计算字符个数或者遇到’\0’结束符来确定。

  • 链式存储:字符串的字符通过链表的方式进行存储。每个节点包含一个字符和指向下一个节点的指针。链式存储方式可以动态地分配内存,适用于长度可变的字符串。但是相比于顺序存储,链式存储方式需要更多的内存空间,并且访问字符需要遍历链表。

  选择何种存储方式取决于具体的应用场景和需求。顺序存储适合于需要频繁访问和操作字符串的情况,而链式存储适合于长度可变的字符串或者对内存空间要求较高的情况。关于字符串的基础知识亦可参考前文:
【重拾C语言】六、批量数据组织(三)数组初值;字符串、字符数组、字符串数组;类型定义 typedef
【重拾C语言】七、指针(三)指针与字符串(字符串与字符串数组;指针与字符串的遍历、拷贝、比较;反转字符串)

1. 顺序存储

  串的顺序存储是把一个串所包含的字符序列相继存入连续的字节中,通常用数组实现。例如字符串S="student", 顺序存储在数组A[10]中,则A[0]=‘s’,A[1]=‘t’,…,A[6]=‘t’ .

2. 链式存储

  串的链式存储是通过将可用的存储空间划分为一系列大小相同的节点来实现的。每个节点包含两个部分:一个存储字符的数据域和一个指向下一个节点的指针域。
  例如,假设我们有一个字符串S = “student”,我们可以使用链式存储方式将其表示为一个节点序列。每个节点包含一个字符和一个指向下一个节点的指针。
  链式存储的节点结构可以如下表示:

struct Node {
    char data;      // 存储字符的数据域
    Node* next;     // 指向下一个节点的指针域
};

  对于字符串S = “student”,可以创建以下节点序列:

Node 1: data = 's', next -> Node 2
Node 2: data = 't', next -> Node 3
Node 3: data = 'u', next -> Node 4
Node 4: data = 'd', next -> Node 5
Node 5: data = 'e', next -> Node 6
Node 6: data = 'n', next -> Node 7
Node 7: data = 't', next -> NULL

  其中,每个节点的data域存储一个字符,next指针指向下一个节点。最后一个节点的next指针为空(NULL),表示链表的结束。

  链式存储方式可以动态地分配内存空间,适用于长度可变的字符串。通过遍历链表,我们可以访问和操作字符串中的字符。然而,相对于顺序存储方式,链式存储需要额外的指针空间,并且访问字符的效率较低。

3. C语言实现顺序存储

#include <stdio.h>

int main() {
    char S[] = "student";
    printf("String S: %s\n", S);

    return 0;
}

输出结果为:

String S: student

  使用字符数组S来存储字符串"student"。该字符串被存储在数组中的连续内存空间中,每个字符占据一个数组元素的位置。

4. C语言实现链式存储

  接下来,让我们使用C语言实现字符串的链式存储:我们将使用一个结构体来表示链表的节点,每个节点包含一个字符和一个指向下一个节点的指针。

#include <stdio.h>
#include <stdlib.h>

struct Node {
    char data;
    struct Node* next;
};

void printString(struct Node* head) {
    struct Node* current = head;
    while (current != NULL) {
        printf("%c", current->data);
        current = current->next;
    }
    printf("\n");
}

int main() {
    struct Node* head = (struct Node*)malloc(sizeof(struct Node));
    struct Node* second = (struct Node*)malloc(sizeof(struct Node));
    struct Node* third = (struct Node*)malloc(sizeof(struct Node));
    struct Node* fourth = (struct Node*)malloc(sizeof(struct Node));
    struct Node* fifth = (struct Node*)malloc(sizeof(struct Node));
    struct Node* sixth = (struct Node*)malloc(sizeof(struct Node));
    struct Node* seventh = (struct Node*)malloc(sizeof(struct Node));

    head->data = 's';
    head->next = second;
    second->data = 't';
    second->next = third;
    third->data = 'u';
    third->next = fourth;
    fourth->data = 'd';
    fourth->next = fifth;
    fifth->data = 'e';
    fifth->next = sixth;
    sixth->data = 'n';
    sixth->next = seventh;
    seventh->data = 't';
    seventh->next = NULL;

    printf("String S: ");
    printString(head);

    return 0;
}

输出结果为:

String S: student

  创建一个链表来表示字符串"student"。每个节点都包含一个字符和一个指向下一个节点的指针。通过遍历链表,我们可以打印出链表中存储的字符,从而得到字符串的内容。注意,在实际应用中,我们应该在使用完链表后释放分配的内存,以避免内存泄漏。

代码优化
#include <stdio.h>
#include <stdlib.h>

struct Node {
    char data;
    struct Node* next;
};

void printString(struct Node* node) {
    while (node != NULL) {
        printf("%c", node->data);
        node = node->next;
    }
}

int main() {
    struct Node* head = NULL;
    struct Node* tail = NULL;
    char characters[] = {'s', 't', 'u', 'd', 'e', 'n', 't'};
    int length = sizeof(characters) / sizeof(characters[0]);

    for (int i = 0; i < length; i++) {
        struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
        newNode->data = characters[i];
        newNode->next = NULL;

        if (head == NULL) {
            head = newNode;
            tail = newNode;
        } else {
            tail->next = newNode;
            tail = newNode;
        }
    }

    printf("String S: ");
    printString(head);
    printf("\n");

    // 释放链表节点的内存
    struct Node* current = head;
    while (current != NULL) {
        struct Node* temp = current;
        current = current->next;
        free(temp);
    }

    return 0;
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

优思学院|制作SPC控制图一定要用Minitab吗?

如果是使用SPC控制图作为一种控制过程变异的工具&#xff0c;无需使用Minitab&#xff0c;用Excel已经相当足够。但无论你使用哪种工具&#xff0c;你都应该要先明白SPC或者控制图工具的目的是什么&#xff0c;以及如何选择合适的控制图&#xff0c;以及如何去解读它等等。 要…

从云到AI到大模型,阿里云始终和谁站在了一起?

引言&#xff1a;云的创新没有减缓 而且在加速深入百行百业 【科技明说 &#xff5c; 热点关注】 【全球云观察 | 每日看点】作为中国最大的云计算厂商&#xff0c;阿里云的产品矩阵覆盖越来越全面&#xff0c;越来越细致&#xff0c;越来越到位。 ​ 在2023杭州云栖大会现场…

如何使用ArcGIS Pro制作带基底三维地图

使用ArcGIS制作三维地形图相信大家都已经比较熟悉了&#xff0c;现在Esri主推的桌面GIS产品是ArcGIS Pro&#xff0c;这里为大家介绍一下ArcGIS Pro制作三维地图的方法&#xff0c;希望能对你有所帮助。 01数据来源 本教程所使用的数据是从水经微图中下载的DEM数据&#xff…

Java体系性能测试进阶必须了解的知识点——GC日志分析

GC定义 GC&#xff08;Garbage Collection&#xff09;是垃圾收集的意思,内存处理是程序员编码容易产生问题的地方&#xff0c;忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃&#xff0c;Java提供的GC功能可以自动监测对象是否需要进行垃圾回收。所以&#xff0c;J…

有质更有智,最低10.88万的哪吒X有多超值?

近期,哪吒汽车可谓是存在感极高,先是官宣娜扎为品牌代言人,再是哪吒X正式上市,更有哪吒GT运动版和官改套件上线等一系列大动作,频频霸榜车圈热搜。近日,首台哪吒X于哪吒汽车嘉兴直营中心交付的消息也在朋友圈刷屏,从正式上市到首台交付,仅仅相隔两天时间,真正实现“上市即交付”…

【pdf密码】PDF没有密码,为什么不能编辑?

打开PDF文件的时候&#xff0c;没有提示带有密码&#xff0c;但是打开文件之后发现没有办法编辑PDF文件&#xff0c;这个是因为PDF文件设置了限制编辑&#xff0c;我们需要将限制取消才能够编辑文件。 那么&#xff0c;我们应该如何取消密码&#xff0c;编辑文件呢&#xff1f…

Linux系统封装ISO镜像(自动安装)

一、准备一个系统 centos7或者centos8都可以;最小化或者桌面版的都可以,自行选择 二、安装自定义镜像工具 yum -y install createrepo mkisofs openssl rsync syslinux三、挂载镜像 创建挂载点 mkdir /mnt/cdrommount /dev/sr0 /mnt/cdrom四、同步 /mnt/cdrom/ 下的文件到 …

分享一下微信小程序里怎么开店

如何在微信小程序中成功开店&#xff1a;从选品到运营的全方位指南 一、引言 随着微信小程序的日益普及&#xff0c;越来越多的人开始尝试在微信小程序中开设自己的店铺。微信小程序具有便捷、易用、即用即走等特点&#xff0c;使得开店门槛大大降低。本文将详细介绍如何在微…

vue-query的使用

vue-query&#xff0c;类似于vuex/pinia&#xff0c;以缓存为目的&#xff0c;但侧重的是对网络请求的缓存。 这是我预想的使用场景&#xff1a;假设在各个页面都需要发起相同的请求&#xff0c;去获取数据&#xff0c;而这种数据在一定时间内不会发生变化&#xff0c;那么这种…

优思学院:从西格玛计算出Cpk与不良率PPM

在品质控制的领域中&#xff0c;Cpk&#xff08;制程能力指数&#xff09;和PPM&#xff08;每百万个中不良品的个数&#xff09;是两个关键的指标&#xff0c;用来评估一个制程的稳定性和一致性。然而&#xff0c;这两者的计算并不简单&#xff0c;特别是当规格中心值与物品量…

openfeign和全局异常

我们在seata中使用openfeign调用服务的时候经常会出现一些问题 (1)在使用openfeign的时候使用到了全局异常,本来feign调用失败会触发降级异常,但是如果加上 全局异常处理器的话可能不会触发,导致降级失败 (2)服务a调用服务b的接口b(),b接口调用出错了,服务b本来应该返回异常,但…

最新ai系统ChatGPT商业运营版网站源码+支持GPT4.0/支持AI绘画+已支持OpenAI GPT全模型+国内AI全模型+绘画池系统

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如…

GPU渲染中各个步骤的作用

MainLightShadow(主光照阴影&#xff09;&#xff1a; 通常在渲染管线中的最开始阶段进行绘制&#xff0c;这是因为主要光源的阴影对于场景中的物体渲染和视觉效果非常重要。 下面是一些原因&#xff0c;解释为什么主光照阴影往往是在最开始绘制的&#xff1a; 1、视觉效果的…

关闭谷歌浏览器的自动更新 详细教程

1.前往资源库找到Google文件夹 2.进入找到GoogleSoftwareUpdate.bundle 并且删除 弹出删除框 需要我们使用指纹或者锁屏密码 就可以删除了 3.打开谷歌浏览器查看是否已经不再自动更新了 发现上面提示更新失败即可 将不会再次更新 window/其他电脑关闭自动更新教程参考&#x…

MFC实现堆栈窗口:多个子界面可任意切换

1、效果 在Qt中可使用QStackedWidget控件直接拖动布置即可实现&#xff0c;但在MFC中并未提供类似的控件&#xff0c;因此需要自己简单实现。 2、实现原理 实现原理比较简单&#xff0c;父级对话框在显示的区域部分&#xff0c;通过切换子对话框即可实现。子对话框去掉边框后…

ZOC8 for Mac:超越期待的终端仿真器

在Mac上&#xff0c;一个优秀的终端仿真器是每位开发者和系统管理员的必备工具。ZOC8&#xff0c;作为一款广受好评的终端仿真器&#xff0c;以其强大的功能和易用性&#xff0c;已经在Mac用户中积累了良好的口碑。本文将为您详细介绍ZOC8的各项特性&#xff0c;以及为什么它会…

如何从微信视频号中提取视频链接,视频号链接获取办法?

方法1&#xff1a;李华面临的新挑战 让我们回到李华的故事。他是一个自身的自媒体从业者&#xff0c;自己有一个很好的习惯&#xff0c;就是将自己喜欢的内容直接保存下载来。但是&#xff0c;微信视频号并没有提供直接下载的功能。此时&#xff0c;李华又陷入了困扰。 方法2&a…

MATLAB——一维小波的多层分解

%% 学习目标&#xff1a;一维小波的多层分解 clear all; close all; load noissin.mat; xnoissin; [C,L]wavedec(x,3,db4); % 3层分解&#xff0c;使用db4小波 [cd1,cd2,cd3]detcoef(C,L,[1,2,3]); % 使用detcoef函数获取细节系数 ca3appcoef(C,L,db4,3); …

ROS常用命令及多机(TX2 与虚拟机)通信步骤

目录 ROS常用命令 常用命令 ROS多机通信步骤 虚拟机中添加镜像源 TX2中添加镜像源 ROS常用命令 rostopic list 命令查看当前系统中有哪些 topic。 rostopic info 命令查看该 topic 的信息&#xff0c;包括它的数据类型、发布者数量等。 rostopic hz 命令查看该 topic 的发布…

GIT文件夹上面的状态(对钩或红色感叹号)不显示,解决

换了新电脑&#xff0c;GIT代码上传啥的都正常&#xff0c;但是文件中文件图标状态不显示&#xff0c;搜了一下已找到解决方法&#xff0c;实测有效。 第一步 winr&#xff0c;输入regedit.exe&#xff0c;打开注册表 第二步 找到以下路径 “ HKEY_LOCAL_MACHINE–>SOFTWA…