C语言数据结构(8)--字符串的存储结构

简介: 本文目录1. 串的概念2. 顺序存储代码实现3. 链式存储代码实现

1. 串的概念

字符串操作可谓是常见中的常见,usual中的usually,不好意思先秀一把英文。


串可以通过一组连续地址存储,即为串的顺序存储。


也可以通过链表存储,即为串的链式存储。


2. 顺序存储代码实现

使用C语言数组实现字符串的操作,还是便于兄弟们理解字符串在内存中的组织与操作的。代码如下,精华都在注释中

#include <stdio.h>
#define MAX_LENGTH 100
/*
 * 主题:使用数组实现字符串操作实例
 * 作者:熊猫大大
 * 时间:2020-01-15
 */
//字符串结构体
typedef struct{
  char content[MAX_LENGTH];//内容部分,最后一位存储'\0',所以实际字符串内容长度是MAX_LENGTH-1
  int length;//实际长度
}String;
//打印字符串
void printStr(String *str) 
{
  printf("str:%s\n",str->content);
}
//请空字符串
void clearStr(String *str) 
{
  str->content[0] = '\0';
  str->length = 0;
}
//返回字符串长度
int getStrLength(String *str)
{
  return str->length;
}
//判断字符串是否为空 是1 否0
int isEmpty(String *str) 
{
  if (str->length == 0) 
  {
    return 1;
  }
  else 
  {
    return 0;
  }
}
//添加字符
int appendChar(String *str,char c) 
{
  if (str->length < MAX_LENGTH - 1) 
  {
    str->content[str->length] = c;
    str->length++;
    str->content[str->length] = '\0';
    return 1;
  }
  else //长度不足,返回失败0
  {
    return 0;
  }
}
//插入字符,index从0开始,注意需要将后面的字符全部向后挪一个位置
int insertChar(String *str,int index,char c) 
{
  int i;
  if (str->length < MAX_LENGTH - 1)
  {
    for (i = str->length; i >= index; i--) //从最后一个'\0'开始都向后移动一个位置
    {
      str->content[i+1] = str->content[i];
    }
    str->content[index] = c;//将插入元素放入指定位置
    return 1;
  }
  else //长度不足,返回失败0
  {
    return 0;
  }
}
//删除指定位置元素,index从0开始,直接从后面往前覆盖即可
int deleteChar(String *str,int index) 
{
  int i;
  for (i = index; i <= str->length; i++) 
  {
    str->content[i ] = str->content[i+1];
  }
  return 1;
}
//将str2连接到str1
int concat(String *str1,String *str2) 
{ 
  int i = 0;
  int leftLength = MAX_LENGTH - 1 - str1->length;//剩余可用长度
  if (leftLength < str2->length) {//长度不足返回失败
    return 0;
  }
  //依次取出str2中元素追加到str1
  for (i = 0; i < str2->length; i++) 
  {
    appendChar(str1,str2->content[i]);
  }
  return 1;
}
int main() 
{
  //str1测试
  String str1;
  clearStr(&str1);
  printf("str1清空后:\n");
  printStr(&str1);
  printf("str1是否为空?\n");
  printf("%d\n", isEmpty(&str1));
  printf("str1当前长度:\n");
  printf("%d\n", getStrLength(&str1));
  appendChar(&str1, 'a');
  appendChar(&str1, 'b');
  appendChar(&str1, 'c');
  printf("str1添加abc后:\n");
  printStr(&str1);
  insertChar(&str1, 0, 'x');
  printf("str1插入x后:\n");
  printStr(&str1);
  deleteChar(&str1,1);
  printf("str1删除a后:\n");
  printStr(&str1);
  //str2测试
  String str2;
  clearStr(&str2);
  appendChar(&str2, 'e');
  appendChar(&str2, 'f');
  appendChar(&str2, 'g');
  printf("str2添加efg后:\n");
  printStr(&str2);
  //str1连接str2
  concat(&str1, &str2);
  printf("str1连接str2后:\n");
  printStr(&str1);
}

3. 链式存储代码实现

实际上将线性表的数据区域的数据类型int改为char,不就是一个链式存储的字符串么。

直接附上链接:链式存储线性表

相关文章
|
6天前
|
存储 C语言
【C语言基础考研向】10 字符数组初始化及传递和scanf 读取字符串
本文介绍了C语言中字符数组的初始化方法及其在函数间传递的注意事项。字符数组初始化有两种方式:逐个字符赋值或整体初始化字符串。实际工作中常用后者,如`char c[10]=&quot;hello&quot;`。示例代码展示了如何初始化及传递字符数组,并解释了为何未正确添加结束符`\0`会导致乱码。此外,还讨论了`scanf`函数读取字符串时忽略空格和回车的特点。
|
6天前
|
存储 Serverless C语言
【C语言基础考研向】11 gets函数与puts函数及str系列字符串操作函数
本文介绍了C语言中的`gets`和`puts`函数,`gets`用于从标准输入读取字符串直至换行符,并自动添加字符串结束标志`\0`。`puts`则用于向标准输出打印字符串并自动换行。此外,文章还详细讲解了`str`系列字符串操作函数,包括统计字符串长度的`strlen`、复制字符串的`strcpy`、比较字符串的`strcmp`以及拼接字符串的`strcat`。通过示例代码展示了这些函数的具体应用及注意事项。
|
7天前
|
存储 人工智能 C语言
数据结构基础详解(C语言): 栈的括号匹配(实战)与栈的表达式求值&&特殊矩阵的压缩存储
本文首先介绍了栈的应用之一——括号匹配,利用栈的特性实现左右括号的匹配检测。接着详细描述了南京理工大学的一道编程题,要求判断输入字符串中的括号是否正确匹配,并给出了完整的代码示例。此外,还探讨了栈在表达式求值中的应用,包括中缀、后缀和前缀表达式的转换与计算方法。最后,文章介绍了矩阵的压缩存储技术,涵盖对称矩阵、三角矩阵及稀疏矩阵的不同压缩存储策略,提高存储效率。
|
7天前
|
C语言
数据结构基础详解(C语言):图的基本概念_无向图_有向图_子图_生成树_生成森林_完全图
本文介绍了图的基本概念,包括图的定义、无向图与有向图、简单图与多重图等,并解释了顶点度、路径、连通性等相关术语。此外还讨论了子图、生成树、带权图及几种特殊形态的图,如完全图和树等。通过这些概念,读者可以更好地理解图论的基础知识。
|
9天前
|
存储 算法 C语言
数据结构基础详解(C语言): 二叉树的遍历_线索二叉树_树的存储结构_树与森林详解
本文从二叉树遍历入手,详细介绍了先序、中序和后序遍历方法,并探讨了如何构建二叉树及线索二叉树的概念。接着,文章讲解了树和森林的存储结构,特别是如何将树与森林转换为二叉树形式,以便利用二叉树的遍历方法。最后,讨论了树和森林的遍历算法,包括先根、后根和层次遍历。通过这些内容,读者可以全面了解二叉树及其相关概念。
|
9天前
|
存储 C语言
数据结构基础详解(C语言): 树与二叉树的应用_哈夫曼树与哈夫曼曼编码_并查集_二叉排序树_平衡二叉树
本文详细介绍了树与二叉树的应用,涵盖哈夫曼树与哈夫曼编码、并查集以及二叉排序树等内容。首先讲解了哈夫曼树的构造方法及其在数据压缩中的应用;接着介绍了并查集的基本概念、存储结构及优化方法;随后探讨了二叉排序树的定义、查找、插入和删除操作;最后阐述了平衡二叉树的概念及其在保证树平衡状态下的插入和删除操作。通过本文,读者可以全面了解树与二叉树在实际问题中的应用技巧和优化策略。
|
9天前
|
存储 算法 C语言
C语言手撕数据结构代码_顺序表_静态存储_动态存储
本文介绍了基于静态和动态存储的顺序表操作实现,涵盖创建、删除、插入、合并、求交集与差集、逆置及循环移动等常见操作。通过详细的C语言代码示例,展示了如何高效地处理顺序表数据结构的各种问题。
|
4月前
|
存储 编译器 C语言
在C语言中的数组和字符串
在C语言中的数组和字符串
|
2月前
|
安全 C语言
C语言8 数组与字符串
C语言8 数组与字符串
20 0
|
存储 机器学习/深度学习 Linux
【C语言】语言篇——数组和字符串
【C语言】语言篇——数组和字符串
46 0