首页 > 其他分享 >9、串的堆分配方式

9、串的堆分配方式

时间:2024-09-27 08:50:23浏览次数:7  
标签:ch 方式 int HString pos len length 分配

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;
}

 

标签:ch,方式,int,HString,pos,len,length,分配
From: https://www.cnblogs.com/xpp3/p/18434952

相关文章

  • 三大硬核方式揭秘:Java如何与底层硬件和工业设备轻松通信!
    大家好,我是V哥,程序员聊天真是三句不到离不开技术啊,这不前两天跟一个哥们吃饭,他是我好多年前的学员了,一直保持着联系,现在都李总了,在做工业互联网相关的项目,真是只要Java学得好,能干一辈子,卷死的是那些半吊子。感谢李总给我分享了工业互联网项目的事情,收获很多,今天的内容来聊一......
  • 大型语言模型(LLM)将彻底改变软件工程师编写代码的方式
      每周跟踪AI热点新闻动向和震撼发展想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领域的领跑者。点击订阅,与未来同行!订阅:https://......
  • 进程和线程的区别;线程的多种创建方式;Thread 类及常见方法;线程的状态
    文章目录进程和线程的区别线程的创建方式继承Thread,重写run(创建单独的类/匿名内部类)实现Runnable,重写run(创建单独的类/匿名内部类)实现Callable,重写call(创建单独的类/匿名内部类)使用lambda表达式ThreadFactory线程工厂线程池Thread类及常见方法Thread的常见属性启动一......
  • 00 内存分配 -- 重点
    要确认是进行赋值,还是找到其中,有赋值为:重新开辟内存空间python将:-5~256为常用的数字(如果在范围类使用同一内存空间,这叫:python小数据池)如果大于这个数值,会重新进行开僻内存空间字符串:如果A1=‘’alexA2=‘alex,A1/A2等于同一个字符串,理应不是同一个内存地址,需要重......
  • 05 字典内存分配
    data_list=[]foriinrange(10):data={}data['user']=idata_list.append(data)print(data_list)#每个字典都不一样字典,列表内存指向图data={}foriinrange(10):data['user']=iprint(data)内存占用图......
  • 只用单链表的方式判断一个链表是否为回文链表
    思路寻找链表的中点:使用快慢指针的方法,快指针每次移动两步,慢指针每次移动一步。当快指针到达链表末尾时,慢指针正好位于链表的中间。反转后半部分链表:从中点开始反转链表的后半部分。比较前半部分和反转后的后半部分:逐一比较两个部分的节点值,如果所有对应的节点值都相同,则......
  • android 10 禁止通过adb命令的方式删除特定APK
    —a/frameworks/base/services/core/java/com/android/server/pm/PackageManagerShellCommand.java+++b/frameworks/base/services/core/java/com/android/server/pm/PackageManagerShellCommand.java@@-1636,84+1636,88@@classPackageManagerShellCommandextends......
  • 关于Pinia 使用setup方式书写 $reset方法失效问题
    在当我使用的时候踩到一个坑:当我在使用$reset想要重置state数据的时候,却报错了,经过排查发现是因为没有使用选项式进行编写代码关于$reset方法Pinia文档中只有简短的介绍:您可以通过调用 store 上的 $reset() 方法将状态重置到其初始值:conststore=useStore()store.$reset(......
  • C#|.net core 基础 - 深拷贝的五大类N种实现方式
    C#|.netcore基础-深拷贝的五大类N种实现方式 合集-C#|.netcore基础(6) 1.C#|.netcore基础-“hello”.IndexOf(“\0”,2)中的坑08-302.C#|.netcore基础-如何判断连续子序列09-033.C#|.netcore基础-值传递vs引用传递09-194.C#|.netcore基础-扩展数......
  • Swift解析json三种方式
    在Swift中解析本地JSON文件有多种形式,以下是其中几种常用的方式:使用Codable协议:使用Codable协议是Swift中解析JSON的推荐方式。首先,你需要定义一个对应的数据模型,该模型需要符合Codable协议。然后使用JSONDecoder对象将JSON数据解析为对应的数据模型对象。......