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

 更新时间:2022年01月10日 09:16:54   作者:玄澈_  
这篇文章将带大家深入了解C语言数据结构与算法中的字符串,文中主要是介绍了字符串的定义、字符串的比较以及一些串的抽象数据类型,感兴趣的可以学习一下

串的定义

零个或多个字符组成的有限序列

串的比较 

串的比较实际上是在比较串中字符的编码

存在某个k < min(n,m),使得ai = bi (i = 1,2,3,4..k)

如果 ak < bk  -->  那么srt1 < srt2 (反之也成立)

除去相等的字符,在第一个不相等的字符位置以Ascii码进行比较

串的抽象数据类型

串的顺序存储结构示意图

串的顺序存储结构是用一组地址连续的存储单元来存储串中的字符序列 

typedef struct sqString{
    char* ch;  //若串为空,则按串长分配存储区  
               //否则ch = NULL
    int length;//串长
}sqString;

串的初始化

相关定义初始化

/** 状态码  **/
#define TRUE 1
#define FALSE 0
#define EQ 0
#define GT 1  //大于
#define LT -1 //小于

定长类初始化

#define MAX_SIZE 1024
typedef struct{
    char ch[MAX_SIZE + 1];  
    //定长方式实现了字符串的顺序结构--缺点是浪费空间
    int length;
 
}SString;

串的堆式顺序存储结构(Heap)

/** 串的堆式顺序存储结构(Heap)**/
typedef struct{
    char * ch;  
    //如果是非空串,那么就按照指定长度分配内存,否则ch就指向NULL
    int length;   //串当前长度
}HString;

初始化堆字符串 

赋值操作

/** 为串str赋值,值为字符串常量chars **/
void StrAssign_HeapString(HString * str,char * chars){
    int len = strlen(chars);
    if(!len) return ERROR;
    InitString_HeapString(str);
    //动态为字符串分配空间
    str->ch = (char*)malloc(len * sizeof(char));
    if(!str->ch){
        exit(OVERFLOW); //内存溢出,分配失败
    }
    //逐个将字符串输入所分配的空间中
    for(int i = 0;i < len ; i++)
    {
        str->ch[i] = chars[i];
    }
    str->length = len;  //将长度赋值
    return OK;    
}

比较两个堆字符串的大小

str1 == str2 返回0 ; str1 < str2 返回-1 ; str1 > str2 返回1

Status Strcmp_HeapString(HString * str1,HString * str2){
    for(int i = 0;i < str->length && i < str2->length; i ++){
        //遇到不同的字符就直接比较Ascii
        if(str->ch[i] != str[2]->ch[i]){
                //大于则返回整数,小于则返回负数
            return str->ch[i] - str[2]->ch[i];
        }
    }
    //字符都相等但是长度不等,就比较长度
    return str1->length - str2->length;
}

到此这篇关于C语言 数据结构与算法之字符串详解的文章就介绍到这了,更多相关C语言 字符串内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++中delete和delete[]的区别说明

    C++中delete和delete[]的区别说明

    一直对C++中的delete和delete[]的区别不甚了解,今天遇到了,上网查了一下,得出了结论。希望本文可以对你有所帮助
    2013-02-02
  • C++类与对象深入之运算符重载与const及初始化列表详解

    C++类与对象深入之运算符重载与const及初始化列表详解

    运算符是程序中最最常见的操作,例如对于内置类型的赋值我们直接使用=赋值即可,因为这些编译器已经帮我们做好了,但是对象的赋值呢?能直接赋值吗
    2022-06-06
  • MoveWindow() SetWindowPos()的区别于联系

    MoveWindow() SetWindowPos()的区别于联系

    这篇文章主要介绍了VC++中MoveWindow() SetWindowPos()的区别于联系,需要的朋友可以参考下
    2015-01-01
  • C语言超全面define预处理指令的使用说明

    C语言超全面define预处理指令的使用说明

    C语言里可以用#define定义一个标识符来表示一个常量。特点是:定义的标识符不占内存,只是一个临时的符号,预编译后这个符号就不存在了,也不做类型定义。预编译又叫预处理
    2022-04-04
  • C语言之选择分支语句详解

    C语言之选择分支语句详解

    大家好,本篇文章主要讲的是C语言之选择分支语句详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • C++实现LeetCode(65.验证数字)

    C++实现LeetCode(65.验证数字)

    这篇文章主要介绍了C++实现LeetCode(65.验证数字),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C语言实现动态顺序表的实现代码

    C语言实现动态顺序表的实现代码

    这篇文章主要介绍了C语言实现动态顺序表的实现代码的相关资料,动态顺序表在内存中开辟一块空间,可以随我们数据数量的增多来扩容,需要的朋友可以参考下
    2017-08-08
  • 详解C++ 创建文件夹的四种方式

    详解C++ 创建文件夹的四种方式

    这篇文章主要介绍了C++ 创建文件夹的四种方式,本文示例都是在 E:\database 路径下创建一个叫做 testFolder 的文件夹,文章通过实例代码给大家介绍的非常详细,需要的朋友参考下吧
    2021-11-11
  • C语言模拟实现memmove的示例代码

    C语言模拟实现memmove的示例代码

    memmove函数用于拷贝字节,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,但复制后源内容会被更改。本文主要介绍了C语言模拟实现memmove的示例代码,需要的可以参考一下
    2022-12-12
  • C++中std::vector的6种初始化方式

    C++中std::vector的6种初始化方式

    这篇文章主要介绍了C++中std::vector的6种初始化方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08

最新评论