C语言实现串的顺序存储表示与基本操作

本文实例为大家分享了C语言实现串的顺序存储表示与基本操作代码,供大家参考,具体内容如下

1 串的三种存储表示

串,即:字符串。要注意的是,C语言中是没有字符串数据类型的,而将其作为一种数据结构——“内容受限的线性表”进行实现,并对空串、空格串、串的长度、子串与主串等概念进行了约定【详见 《数据结构(C语言版)》 ,严蔚敏、吴伟民编著

串的存储表示主要分为三种:

【1】顺序存储表示 :使用字符型数组(一块连续的内存存储空间)来存储串的内容,其最大长度已经定义则不可修改;(这也是C语言中初始约定好的一种较为字符串内容的表示方式)

【2】堆分配存储表示:使用malloc和free函数对堆区进行操作,进行堆区内存的动态分配与释放,而这块存储空间就用于存储串的内容;

【3】块链存储表示:即采用链表的形式,通过指针,将位于不同存储空间的多个字符串“碎片”进行连接,“拼凑”成为一个完整的串

在此只介绍第一种,即:串的顺序存储表示。

2 串的顺序存储表示与基本操作

这部分就直接贴代码了

【因为这里是对数组元素的操作,就偷个懒,直接用了C语言string.h头文件中提供的一些库函数,对一些基本操作进行了简单实现。需要详细写代码的部分到串的堆分配实现时候再体现】

2.1 头文件声明

/**
 * 串的顺序存储实现
 */
#include <string.h>
#define  MAXLEN 255
//结构体定义-表示串结构体
typedef struct{
 char ch[MAXLEN+1];//存储串内容的字符型数组[+1是为了存储结束标志'\0']
 int length;//当前串的长度
}SString;

/**
 * 将字符串T复制为chars
 */
int StrAssignS(SString* T,char* chars);

/**
 * 获取字符串长度
 */
int StrLengthS(SString T);

/**
 * 字符串的判空操作
 */
int StrIsEmptyS(SString T);

/**
 * 串连接操作
 */
int StrConcatS(SString* T,char* s1,char* s2);

/**
 * 截取子串
 */
int SubStringS(SString* T,SString src,int pos,int len);

/**
 * 串清空
 */
int ClearStringS(SString* T);

/**
 * 串比较
 */
int StrCompareS(SString T1,SString T2);

2.2 函数实现

#include "SString.h"

/**
 * 将字符串T复制为chars
 */
int StrAssignS(SString* T,char* chars){
 //清空原始内容
 memset(T->ch,0,MAXLEN);
 T->length=0;
 //重新赋值为chars
 strcpy(T->ch,chars);
 T->length=(int)strlen(chars);
 /*printf("len=%d\n",strlen(T->ch));*/
 return 0;
}

/**
 * 字符串的判空操作
 */
int StrIsEmptyS(SString T){
 return T.length==0;
}

/**
 * 获取字符串长度
 */
int StrLengthS(SString T){
 return T.length;
}

/**
 * 串连接操作
 */
int StrConcatS(SString* T,char* s1,char* s2){
 //辅助变量
 char *p;
 //清空T中的内容
 memset(T->ch,0,MAXLEN);
 T->length=0;
 //连接字符串
 p=strcat(s1,s2);
 //字符串连接到T中
 strcpy(T->ch,p);
 T->length=(int)strlen(p);
 return 1;
}

/**
 * 截取子串
 */
int SubStringS(SString* T,SString src,int pos,int len){
 //清空T中的原始内容
 memset(T->ch,0,MAXLEN);
 T->length=0;
 //获取子串
 /**
   char *strncpy(char *dest, const char *src, size_t n)
   dest -- 指向用于存储复制内容的目标数组
   src -- 要复制的字符串
   n -- 要从源中复制的字符数
  */
 strncpy(T->ch,src.ch+pos,len);
 //重新设置串的长度
 T->length=len;
 return 1;
}

/**
 * 串比较
 */
int StrCompareS(SString T1,SString T2){
 /*
  int strcmp(const char *str1, const char *str2)
  如果返回值小于 0,则表示 str1 小于 str2
  如果返回值大于 0,则表示 str1 大于 str2
  如果返回值等于 0,则表示 str1 等于 str2
 */
 return strcmp(T1.ch,T2.ch);
}

/**
 * 串清空
 */
int ClearStringS(SString* T){
 memset(T->ch,0,MAXLEN);
 T->length=0;
 return 1;
}

2.3 函数测试

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

int main(int argc,char **argv){
 SString str1,str2;
 //str1.ch="Hello,World!";
 StrAssignS(&str1,"Hello,World");
 StrAssignS(&str2,"Hello");
 printf("len=%d\n",StrLengthS(str1));
 //字符串连接
 StrConcatS(&str1,"SHello","Hi");
 printf("len=%d\n",StrLengthS(str1));
 //打印字符串内容
 printf("str1=%s\n",str1.ch);
 printf("str2=%s\n",str2.ch);
 printf("CompareRes=%d\n",StrCompareS(str1,str2));
 //截取子串
 SubStringS(&str2,str1,2,3);
 puts(str1.ch);
 puts(str2.ch);
 //清空字符串内容
 ClearStringS(&str1);
 printf("str1's len=%d,str2's len=%d,\nso str1 isEmpty:%d,str2 isEmpty:%d\n",StrLengthS(str1),StrLengthS(str2),StrIsEmptyS(str1),StrIsEmptyS(str2));

 return 0;
}

贴上测试结果的截图:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C语言线性表顺序存储结构实例详解

    C语言线性表顺序存储结构实例详解 1. 什么是顺序存储结构? 用一段地址连续的存储单元依次存储线性表的数据元素. 2.线性表的顺序存储结构 #include<stdio.h> #include<stdlib.h> #define Max 80 //存储空间初始分配量 #define Increment 10 //存储空间分配增量 typedef struct { int *elem; // 存储空间基地址,此处为int型,视情况而定 int length; // 元素表当前长度 i

  • C语言 数据结构堆排序顺序存储(升序)

    堆排序顺序存储(升序) 一: 完全二叉树的概念:前h-1层为满二叉树,最后一层连续缺失右结点! 二:首先堆是一棵全完二叉树: a:构建一个堆分为两步:⑴创建一棵完全二叉树      ⑵调整为一个堆 (标注:大根堆为升序,小根堆为降序) b:算法描述:①创建一棵完全二叉树 ②while(有双亲){ A:调整为大根堆: B:交换根和叶子结点: C:砍掉叶子结点: } c:时间复杂度为 O(nlogn)  ,空间复杂度为 O(1), 是不稳定排序! 代码实现: /*堆排序思想:[完全二叉树的定义:前

  • C语言实现串的顺序存储表示与基本操作

    本文实例为大家分享了C语言实现串的顺序存储表示与基本操作代码,供大家参考,具体内容如下 1 串的三种存储表示 串,即:字符串.要注意的是,C语言中是没有字符串数据类型的,而将其作为一种数据结构--"内容受限的线性表"进行实现,并对空串.空格串.串的长度.子串与主串等概念进行了约定[详见 <数据结构(C语言版)> ,严蔚敏.吴伟民编著] . 串的存储表示主要分为三种: [1]顺序存储表示 :使用字符型数组(一块连续的内存存储空间)来存储串的内容,其最大长度已经定义则不可修改:

  • C++语言数据结构 串的基本操作实例代码

    C语言数据结构 串的基本操作实例代码 输出结果: 实现代码: #include<iostream> using namespace std; typedef int Status; #define Max 20 #define OK 1 #define ERROR 0 #define OVERLOE -2 typedef struct//堆分配表示串 { char *ch; int length; }HString; //====================================

  • C语言的堆串操作详解

    目录 一.堆串概念. 二.基本操作. 三.运行: 总结 一.堆串概念. 与定长顺序穿的存储结构类似,都是用一组地址连续的存储单元存储串的字符序列,不同的是堆串的存储空间是动态分配的,只要存储空间分配成功,就不会担心串在插入或者连接时候出现截断的情况. malloc(),free(),realloc()  这三个函数用来对动态存储进行操作. 二.基本操作. #include<stdio.h> #include<stdlib.h> #include<string.h> #d

  • C语言 数据结构与算法之字符串详解

    目录 串的定义 串的比较 串的抽象数据类型 串的初始化 相关定义初始化 定长类初始化 串的堆式顺序存储结构(Heap) 初始化堆字符串 赋值操作 比较两个堆字符串的大小 串的定义 零个或多个字符组成的有限序列 串的比较 串的比较实际上是在比较串中字符的编码 存在某个k < min(n,m),使得ai = bi (i = 1,2,3,4..k) 如果 ak < bk  -->  那么srt1 < srt2 (反之也成立) 除去相等的字符,在第一个不相等的字符位置以Ascii码进行比较

  • C语言数据结构之顺序数组的实现

    C语言数据结构之顺序数组的实现 以下为展示顺序数组的示例: 1.用C语言实现的版本 #include<stdio.h> /* EOF(=^Z或F6),NULL */ #include<math.h> /* floor(),ceil(),abs() */ #include<stdlib.h> /*申请和释放内存*/ #include<stdarg.h> /*可变参数*/ #define OK 1 //成功标志 #define ERROR 0 //错误标志 #d

  • C语言中单链表的基本操作指南(增删改查)

    目录 1.链表概述 2.链表的基本使用 2.0 准备工作 2.1 创建节点(结构体) 2.2 全局定义链表头尾指针 方便调用 2.3 创建链表,实现在链表中增加一个数据(尾添加)----增 2.4 遍历链表 -----查 2.5 查询指定的节点 (遍历 一个个找) 2.6 链表清空------全部删除 2.7.在指定位置插入节点 ----在指定位置增 2.8尾删除----删 2.9 删除头------删 2.10 删除指定节点 3. 测试主程序 总结 1.链表概述 链表是一种常见的数据结构.它与

  • C#词法分析器之正则表达式的使用

    正则表达式是一种描述词素的重要表示方法.虽然正则表达式并不能表达出所有可能的模式(例如"由等数量的 a 和 b 组成的字符串"),但是它可以非常高效的描述处理词法单元时要用到的模式类型. 一.正则表达式的定义正则表达式可以由较小的正则表达式按照规则递归地构建.每个正则表达式 r  表示一个语言 L(r) ,而语言可以认为是一个字符串的集合.正则表达式有以下两个基本要素: 1.ϵ  是一个正则表达式, L(ϵ)=ϵ ,即该语言只包含空串(长度为 0 的字符串).2.如果 a  是一个字符

  • XML加ASP实现网页“本地化”

    想让你的站点能被来自多个国家的冲浪者看明白吗?无疑,这就需要提供多个语言版本的页面内容,也就是所谓的 "本地化"功能.最容易想到的方法就是分别编写多种语言的页面内容,然后放置到不同的目录下,再在首页上添加导航 到各自语言位置的链接.很明显,这样的处理方式将浪费许多包含公共元素以及设计框架的空间,而且修改.维护也很烦 琐.有什么好方法吗?当然,本文就介绍如何结合使用XML与ASP技术实现这个目的.  本文将讨论如下几个方面的内容:创建包含语言资源的XML文档.使用ASP创建Web页面模板

  • go语言实现顺序存储的栈

    本文实例讲述了go语言实现顺序存储的栈.分享给大家供大家参考.具体如下: 1. sequence.go代码如下: 复制代码 代码如下: //////// // 顺序存储的栈 //////// package sequence const MAXSIZE = 20 type Stack struct {     Data [MAXSIZE]int //存储栈元素     Top  int          //指向栈顶,总是指向顶部元素,空时为-1 } //压栈 //d:栈元素 func (s *

  • Go语言实现顺序存储的线性表实例

    本文实例讲述了Go语言实现顺序存储的线性表的方法.分享给大家供大家参考.具体如下: 代码如下: 复制代码 代码如下: ///////// // 顺序存储线性表 //////// package main import "fmt" const MAXSIZE = 20 //定义数组长度 //定义线性表结构 type List struct {     Element [MAXSIZE]int //存储线性表元素的数组     length  int          //线性表长度 }

随机推荐