9、串的堆分配方式

news/2024/9/27 9:03:57

1、代码实现

#include<stdio.h>
#include<malloc.h>
#include<assert.h>
#include<string.h>typedef struct HeapString{char* ch;int length;
}HString;//初始化 
void initHString(HString* S){S->ch = NULL;S->length = 0;
}//赋值 
void strAssign(HString* S,char *str){int len = strlen(str);int i = 0;//如果之前已经分配过空间,要先释放掉 if(S->ch != NULL){free(S->ch); } S->ch = (char*)malloc(sizeof(char) * len);assert(S->ch != NULL);for(i;i < len;i++){S->ch[i] = str[i];}S->length = len;
}//打印
void printString(HString *S){int i = 0;for(i = 0;i < S->length;i++){printf("%c",S->ch[i]);}printf("\n");
}//拷贝
void strCopy(HString *S,HString *T){if(S->ch != NULL){free(S->ch);}int len = T->length;S->ch = (char*)malloc(sizeof(char) * len);assert(S->ch != NULL);int i = 0;for(i;i < len;i++){S->ch[i] = T->ch[i];}S->length = len;
} //判空
int strEmpty(HString *S) {return S->length == 0;
}//比较
int strCompare(HString *S,HString *T){if(S->length == 0 && T->length == 0)return;int result = 0;int i = 0;int j = 0;while(i < S->length && j < T->length){if(S->ch[i] > T->ch[j]){return 1;} else if(S->ch[i] < T->ch[j]){return -1;} else {i++;j++;}}if(i < S->length)result = 1;if(j < T->length)result = -1;return result;
} int StrLength(HString* S){return S->length; 
}void strConcat(HString *T,HString *s1,HString *s2){if(T->ch != NULL)free(T->ch);int len1 = s1->length;int len2 = s2->length;T->ch = (char*)malloc(sizeof(char) * (len1 + len2));assert(T->ch != NULL);int i = 0;for(i = 0;i < len1;i++){T->ch[i] = s1->ch[i];}int j = 0;for(j;j < len2;j++){T->ch[i + j] = s2->ch[j];}T->length = len1 + len2; 
}void subString(HString *S,HString *sub,int pos,int len){if(pos < 0 || pos > S->length || len <= 0 || len > S->length - pos)return;if(sub->ch != NULL)free(sub->ch);sub->ch = (char*)malloc(sizeof(char) * len);assert(sub->ch != NULL);int i = 0;for(i;i < len;i++){sub->ch[i] = S->ch[pos + i];}sub->length = len;
}void strInsert(HString *S,int pos,HString *T){if(T->length == 0)return;if(pos < 0 || pos > S->length)return;char* ch = (char*)realloc(S->ch,sizeof(char) * (S->length + T->length));assert(ch != NULL);S->ch = ch;//先挪数据,从S的最后一个字符开始挪动,挪动距离为T的长度 int i = S->length - 1;for(i;i >= pos;i--){S->ch[i + T->length] = S->ch[i];} for(i = 0;i < T->length;i++){S->ch[pos + i] = T->ch[i];}S->length += T->length;
}void strDelete(HString *S,int pos,int len){if(pos < 0 || pos > S->length)return;if(len <= 0 || len > S->length - pos)return;int i = 0;for(i;i < len;i++){S->ch[pos + i] = S->ch[pos + i + len];}}void strClear(HString *S){S->length = 0;if(S->ch != NULL)free(S->ch);S->ch = NULL;
}
int main(){HString S;initHString(&S);strAssign(&S,"abcdefg");HString T;initHString(&T);strAssign(&T,"123");int res = strCompare(&S,&T);HString Y;initHString(&Y);
//    strConcat(&Y,&S,&T);
//    subString(&S,&Y,2,3);strInsert(&S,2,&T);
//    printString(&Y);printString(&S);return 0;
}#include<stdio.h>
#include<malloc.h>
#include<assert.h>
#include<string.h>typedef struct HeapString{char* ch;int length;
}HString;//初始化 
void initHString(HString* S){S->ch = NULL;S->length = 0;
}//赋值 
void strAssign(HString* S,char *str){int len = strlen(str);int i = 0;//如果之前已经分配过空间,要先释放掉 if(S->ch != NULL){free(S->ch); } S->ch = (char*)malloc(sizeof(char) * len);assert(S->ch != NULL);for(i;i < len;i++){S->ch[i] = str[i];}S->length = len;
}//打印
void printString(HString *S){int i = 0;for(i = 0;i < S->length;i++){printf("%c",S->ch[i]);}printf("\n");
}//拷贝
void strCopy(HString *S,HString *T){if(S->ch != NULL){free(S->ch);}int len = T->length;S->ch = (char*)malloc(sizeof(char) * len);assert(S->ch != NULL);int i = 0;for(i;i < len;i++){S->ch[i] = T->ch[i];}S->length = len;
} //判空
int strEmpty(HString *S) {return S->length == 0;
}//比较
int strCompare(HString *S,HString *T){if(S->length == 0 && T->length == 0)return;int result = 0;int i = 0;int j = 0;while(i < S->length && j < T->length){if(S->ch[i] > T->ch[j]){return 1;} else if(S->ch[i] < T->ch[j]){return -1;} else {i++;j++;}}if(i < S->length)result = 1;if(j < T->length)result = -1;return result;
} int StrLength(HString* S){return S->length; 
}void strConcat(HString *T,HString *s1,HString *s2){if(T->ch != NULL)free(T->ch);int len1 = s1->length;int len2 = s2->length;T->ch = (char*)malloc(sizeof(char) * (len1 + len2));assert(T->ch != NULL);int i = 0;for(i = 0;i < len1;i++){T->ch[i] = s1->ch[i];}int j = 0;for(j;j < len2;j++){T->ch[i + j] = s2->ch[j];}T->length = len1 + len2; 
}void subString(HString *S,HString *sub,int pos,int len){if(pos < 0 || pos > S->length || len <= 0 || len > S->length - pos)return;if(sub->ch != NULL)free(sub->ch);sub->ch = (char*)malloc(sizeof(char) * len);assert(sub->ch != NULL);int i = 0;for(i;i < len;i++){sub->ch[i] = S->ch[pos + i];}sub->length = len;
}void strInsert(HString *S,int pos,HString *T){if(T->length == 0)return;if(pos < 0 || pos > S->length)return;char* ch = (char*)realloc(S->ch,sizeof(char) * (S->length + T->length));assert(ch != NULL);S->ch = ch;//先挪数据,从S的最后一个字符开始挪动,挪动距离为T的长度 int i = S->length - 1;for(i;i >= pos;i--){S->ch[i + T->length] = S->ch[i];} for(i = 0;i < T->length;i++){S->ch[pos + i] = T->ch[i];}S->length += T->length;
}void strDelete(HString *S,int pos,int len){if(pos < 0 || pos > S->length)return;if(len <= 0 || len > S->length - pos)return;int i = 0;for(i;i < len;i++){S->ch[pos + i] = S->ch[pos + i + len];}}void strClear(HString *S){S->length = 0;if(S->ch != NULL)free(S->ch);S->ch = NULL;
}
int main(){HString S;initHString(&S);strAssign(&S,"abcdefg");HString T;initHString(&T);strAssign(&T,"123");int res = strCompare(&S,&T);HString Y;initHString(&Y);
//    strConcat(&Y,&S,&T);
//    subString(&S,&Y,2,3);strInsert(&S,2,&T);
//    printString(&Y);printString(&S);return 0;
}

 

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

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

相关文章

救园倒计时:救园最后4天

救园目的:园子这三年困难阶段靠贷款维持,救园是为了还掉贷款,度过难关。救园方式: 终身会员计划,会员,捐助,周边。救园之后,一边增加收入来源,一边加快推进园子的商业化救园进展 截止9月27日 08:55终身会员:终身VIP会员名额还剩37个,终身VIP会员名额还剩130个 会员总…

将对象的属性为数值型的转换为String

将对象的属性为数值型的转换为String 1、新建一个类 //注意:此处为待转换的类型,return true 不好用,必须将待转换的类型一一列出using Newtonsoft.Json;namespace WinFormsApp1.Common {public class ToStringConverter : JsonConverter{public override bool CanConvert(T…

《HelloGitHub》第 102 期

兴趣是最好的老师,HelloGitHub 让你对编程感兴趣!简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。github.com/521xueweihan/HelloGitHub这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等,涵盖多种编程语言 Python、Java、Go、C/C++、Swift...让你在短…

弹幕树洞项目功能新增篇

项目地址 项目后端地址:https://github.com/ZyPLJ/ZYTteeHole项目前端页面地址:ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue目前项目测试访问地址:http://tree.pljzy.top/ 注意是http,输成https就访问到博客里面去了。系列文章📖.NET Core搭配V…

Cisco Secure Firewall Threat Defense 7.6.0 发布下载,新增功能概览

Cisco Secure Firewall Threat Defense 7.6.0 发布下载,新增功能概览Cisco Secure Firewall Threat Defense 7.6.0 发布下载,新增功能概览 Firepower Threat Defense (FTD) Software Release 7.6.0 Firepower 1100/3100/4100/4200/9300 Security Appliance 请访问原文链接:h…

【译】通过新的 WinUI 工作负荷和模板改进,深入原生 Windows 开发

我们创建了一个新的 Windows Dev Center 页面,简化了我们的 Getting Started with WinUI 文档,并与 Visual Studio 合作来改善开发人员在工作负荷和模板方面的体验。在 Build 2024 上,WinUI 团队宣布将重新关注 WinUI,将其作为我们推荐的原生 Windows 应用开发的首要应用开…

Windows10永久拒绝升级Win11

一、使用组策略阻止升级到windows11 需要专业版或企业版的Windows 10才能访问组策略编辑器。以下是操作步骤:单击开始菜单,输入gpedit.msc,打开本地组策略编辑器。 导航到“计算机配置”>“管理模板”>“Windows组件”>“Windows更新”>“适用于企业的Windows更…

arcgis怎样把面图层按另一面图层分割

摘自https://jingyan.baidu.com/article/6079ad0e9b5c8428fe86db70.htmlarcgis的桌面软件 主要应用于空间数据处理和管理,工作中往往会遇到要批量分割大量的面状数据,并且要按照其所处面的关系赋值。1、打开ArcMap软件,把两个面图层都加载到视图区域内,如下图2、在工具栏中…