C语言实现数据结构串(堆分配存储表示法)实例详解
发布时间 - 2026-01-11 02:14:34 点击率:次堆分配存储表示法

存储结构:
构建堆来存储字符串,本质上是顺序表
实现代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -2
#define STR_INIT_SIZE 100
#define STRINCREMENT 10
typedef int Status;
typedef struct
{
char *ch; //空串时指向NULL,非空串时按串长分配存储区
int length;
} HString;
Status InitString(HString *T) //初始化字符串
{
//指针指向NULL,长度为0即可
//p.s.申请内存空间的过程在赋值中完成
T->ch = NULL;
T->length = 0;
return OK;
}
Status StrAssign(HString *T, char *p) //字符串赋值
{
//1.判断T是否已有内容,有则释放
//2.判断赋值的内容是否为空,为空则不赋值
//3.根据长度向内存申请空间,遍历赋值给T,长度等于字符串长度
//p.s.在这里赋值不赋\0,在打印时通过长度来判断字符串结尾
int i, len = strlen(p);
if (T->ch)
free(T->ch);
if (!len)
{
T->ch = NULL;
T->length = 0;
return ERROR;
}
else
{
T->ch = (char *)malloc(len * sizeof(char));
if(!T->ch)
exit(OVERFLOW);
for (i = 0; i < len; ++i)
T->ch[i] = p[i];
T->length = len;
return OK;
}
}
Status StrPrint(HString T) //打印字符串
{
//通过长度判断打印的字符数
int i;
for (i = 0; i < T.length; ++i)
printf("%c", T.ch[i]);
printf("\n");
}
Status StrLength(HString T) //字符串长度
{
return T.length;
}
Status StrEmpty(HString T) //字符串判空
{
if (T.length == 0)
return TRUE;
else
return FALSE;
}
Status Concat(HString *T, HString S1, HString S2) //字符串联接
{
//1.申请长度为S1和S2之和的字符串空间
//2.先将S1的元素逐个赋值到T中
//3.再将S2的元素逐个赋值到T中
int i;
if (T->ch)
free(T->ch);
T->ch = (char *)malloc((S1.length + S2.length) * sizeof(char));
if (!T->ch)
exit(OVERFLOW);
for (i = 0; i < S1.length; ++i)
T->ch[i] = S1.ch[i];
for (i = 0; i < S2.length; ++i)
T->ch[i + S1.length] = S2.ch[i];
T->length = S1.length + S2.length;
return OK;
}
Status StrDelete(HString *T, int pos, int len) //删除字符串中某个位置固定长度的子串
{
//pos是字符串中的位置,删除包括pos的len长度
int i;
if (pos >= T->length)
return ERROR;
else if(pos + len > T->length)
len = T->length - pos + 1;
for (i = pos - 1; i < T->length - len; ++i)
T->ch[i] = T->ch[i + len];
T->length -= len;
T->ch = (char *)realloc(T->ch, T->length * sizeof(char));
if (!T->ch)
exit(OVERFLOW);
return OK;
}
Status StrInsert(HString *S, int pos, HString T)
{
//pos是字符串中的位置,插入时原来的元素(包括pos位)后移
int i, len;
--pos;
len = StrLength(T);
S->ch = (char *)realloc(S->ch, (S->length + len) * sizeof(char));
if (pos > S->length)
pos = S->length;
for (i = S->length - 1; i > pos - 1; --i)
S->ch[i + len] = S->ch[i];
for (i = 0; i < len; ++i)
S->ch[i + pos] = T.ch[i];
S->length += len;
if (!S->ch)
exit(OVERFLOW);
return OK;
}
Status Index(HString S, HString T, int pos) //在字符串S中索引位置pos之后的子串t
{
//同定长顺序存储表示法
//p.s.传入的pos是字符串的位置,从1开始
//p.s.初始状态下T为非空串
if (StrEmpty(T))
return ERROR;
int i = pos - 1, j = 0;
while(i < S.length && j < T.length)
{
if (S.ch[i] == T.ch[j])
{
++i;
++j;
}
else
{
i = i - j + 1;
j = 0;
}
}
if (j >= T.length)
return i - j + 1;
else
return 0;
}
Status Replace(HString *T, HString S1, HString S2) //将字符串T中等于S1的子串替换成为S2
{
//循环索引子串S1在字符串T中的位置(每次的位置从上一次位置后开始查找)
//从查找到的位置-1开始替换
//p.s.初始状态下S1为非空串
int pos = 0;
if (StrEmpty(S1))
return ERROR;
//当pos存在时循环,当全部索引完毕后pos为0
//将索引到的该位置对应的子串删除后再插入新的子串
do
{
pos = Index(*T, S1, pos);
if (pos)
{
StrDelete(T, pos, StrLength(S1));
StrInsert(T, pos, S2);
}
}
while(pos);
return OK;
}
Status SubString(HString *Sub, HString S, int pos, int len)
{
int i;
if (pos < 1 || len > S.length || len < 0 || len > S.length - pos + 1)
exit(OVERFLOW);
if (Sub->ch)
free(Sub->ch);
//如果查询的长度为0,则子串置空
if (len == 0)
{
Sub->ch = NULL;
Sub->length = 0;
}
else
{
Sub->ch = (char *)malloc(len * sizeof(char));
for (i = 0; i < len; ++i)
Sub->ch[i] = S.ch[pos + i - 1];
Sub->length = len;
}
return OK;
}
int main()
{
int pos;
HString t, s, r;
char *p = "Hello,String!", *q = "Bye,Bye!";
printf("String *p: %s\n", p);
InitString(&t);
StrAssign(&t, p);
printf("StrAssign... OK.\nString t : ");
StrPrint(t);
printf("------------------------------\n");
printf("StrLength... OK.\nString Length : %d\n", StrLength(t));
printf("StrEmpty... OK.\n");
if (StrEmpty(t))
printf("String is Empty.\n");
else
printf("String is not Empty.\n");
printf("------------------------------\n");
InitString(&s);
StrAssign(&s, q);
printf("String s : ");
StrPrint(s);
printf("------------------------------\n");
InitString(&r);
Concat(&r, t, s);
printf("Concat... OK.\n");
printf("String r : ");
StrPrint(r);
printf("------------------------------\n");
printf("StrDelete... OK.\n");
StrDelete(&r, 14, 4);
printf("String r : ");
StrPrint(r);
printf("------------------------------\n");
printf("StrInsert... OK.\n");
StrAssign(&t, "Bye,Bye,Bye!");
StrInsert(&r, 14, t);
printf("String r : ");
StrPrint(r);
printf("------------------------------\n");
StrAssign(&t, "ye");
printf("Index... ");
StrPrint(t);
pos = 1;
while(pos)
{
pos = Index(r, t, pos + 1);
if (!pos)
break;
printf("Position : %d\n", pos);
}
printf("------------------------------\n");
StrAssign(&t, "ye");
StrAssign(&s, "oo");
Replace(&r, t, s);
printf("Replace ye -> ooo ... OK.\n");
printf("String r : ");
StrPrint(r);
printf("------------------------------\n");
SubString(&t, r, 7, 4);
printf("SubString... OK.\n");
printf("String SubString : ");
StrPrint(t);
printf("------------------------------\n");
return OK;
}
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# C语言串
# 数据结构
# 串
# C语言数据结构之堆排序源代码
# 数据结构之堆详解
# C语言 数据结构堆排序顺序存储(升序)
# C++ 数据结构 堆排序的实现
# C#数据结构之最小堆的实现方法
# 数据结构之堆的具体使用
# 长度为
# 为空
# 定长
# 在这里
# 状态下
# 已有
# 遍历
# 希望能
# 谢谢大家
# 先将
# 再将
# 本质上
# 后移
# 完毕后
# struct
# Status
# char
# STRINCREMENT
# int
# typedef
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
制作旅游网站html,怎样注册旅游网站?
Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】
Laravel项目如何进行性能优化_Laravel应用性能分析与优化技巧大全
详解vue.js组件化开发实践
ChatGPT 4.0官网入口地址 ChatGPT在线体验官网
香港网站服务器数量如何影响SEO优化效果?
Laravel集合Collection怎么用_Laravel集合常用函数详解
如何获取免费开源的自助建站系统源码?
如何为不同团队 ID 动态生成多个非值班状态按钮
Laravel如何使用Gate和Policy进行授权?(权限控制)
百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭
国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?
php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】
Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】
宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程
js实现获取鼠标当前的位置
如何快速搭建个人网站并优化SEO?
如何在腾讯云服务器快速搭建个人网站?
如何在IIS中新建站点并配置端口与物理路径?
MySQL查询结果复制到新表的方法(更新、插入)
Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能
Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践
电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?
佛山企业网站制作公司有哪些,沟通100网上服务官网?
教你用AI润色文章,让你的文字表达更专业
Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程
Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】
详解jQuery中基本的动画方法
Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理
如何做网站制作流程,*游戏网站怎么搭建?
如何快速生成ASP一键建站模板并优化安全性?
nodejs redis 发布订阅机制封装实现方法及实例代码
如何在橙子建站上传落地页?操作指南详解
谷歌浏览器下载文件时中断怎么办 Google Chrome下载管理修复
zabbix利用python脚本发送报警邮件的方法
Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑
免费网站制作appp,免费制作app哪个平台好?
INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】
Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案
在centOS 7安装mysql 5.7的详细教程
教学论文网站制作软件有哪些,写论文用什么软件
?
Java解压缩zip - 解压缩多个文件或文件夹实例
Android中AutoCompleteTextView自动提示
Laravel如何使用withoutEvents方法临时禁用模型事件
高配服务器限时抢购:企业级配置与回收服务一站式优惠方案
Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践
高性价比服务器租赁——企业级配置与24小时运维服务
如何在IIS7中新建站点?详细步骤解析
Laravel中Service Container是做什么的_Laravel服务容器与依赖注入核心概念解析
Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】

