基于C的堆串实现

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define True 1
#define False 0
#define Overflow 0
/*堆串结构体*/
typedef struct
{
    char *ch;
    int len;
}HString;
/*堆串初始化函数*/
void InitHString(HString *s)
{
    s->ch = NULL;
    s->len = 0;
}
/*堆串赋值函数*/
int StrAssign(HString *s,char *tval)
{
    int len;
    int i = 0;
    //判断s是否已有内容,有则释放
    if(s->ch!=NULL)
        free(s->ch);
    //判断赋值的内容是否为空,为空则不赋值
    len = strlen(tval);
    if(len==0)
    {
        s->ch = NULL;
        s->len = 0;
    }
    else
    {
        s->ch = (char *)malloc(len*sizeof(char));
        //刚申请的空间如果是空的话,即说明申请失败。
        //即溢出
        if(!s->ch)
            exit(Overflow);
        //赋值
        for(i=0;i<len;i++)
        {
            s->ch[i] = tval[i];
        }
        s->len = len;
    }

    return True;
}
/*读字符串*/
void ReadHString(HString *s)
{
    int i;
    for(i=0;i<s->len;i++)
    {
        printf("%c",s->ch[i]);
    }
    printf("\n");
}
/*读字符串长度*/
int HStringlen(HString *s)
{
    return s->len;
}
/*判断字符串是否为空*/
int IsEmpty(HString *s)
{
    if(s->len==0)
        return True;
    else
        return False;
}
/*字符串链接*/
int HStringConcat(HString *s,HString t1,HString t2)
{
    int i;
    //如果s->ch存在值,释放
    if(s->ch)
        free(s->ch);
    s->ch = (char *)malloc((t1.len+t2.len)*sizeof(char));
    if(!s->ch)
        return Overflow;
    for(i=0;i<(t1.len);i++)
    {
        s->ch[i] = t1.ch[i];
    }
    for(i=0;i<t2.len;i++)
    {
        s->ch[i+t1.len] = t2.ch[i];
    }
    s->len = t1.len+t2.len;
    return True;
}
/*删除函数*/
int HStringDelte(HString *s,int pos,int len)
{
    int i;
    if(pos<0||pos>s->len)
    {
        printf("删除位置错误!");
        return False;
    }
    if(pos+len>s->len)
    {
        printf("删除位置超出范围!");
        return False;
    }
    for(i=0;i<len;i++)
    {
        s->ch[i+pos+1] = s->ch[i+pos+1+len];
    }
    s->len -= len;
    //掌握realloc函数的用法
    s->ch = (char *)realloc(s->ch,s->len*sizeof(char));
    if(!s->ch)
        return Overflow;
    return True;
}
/*插入函数*/
int HStringInsert(HString *s,int pos,HString t)
{
    int i;
    s->len += t.len;
    s->ch = (char *)realloc(s->ch,s->len*sizeof(char));
    //移位
    for(i=s->len-1;i>(s->len-pos-1);i--)
    {
        s->ch[i] = s->ch[i-t.len];
    }
    //赋值
    for(i=pos;i<t.len+pos;i++)
    {
        s->ch[i] = t.ch[i-pos];
    }
    return True;
}
int main()
{
    HString s,t;
    InitHString(&s);
    char *t1 = "abcd";
    StrAssign(&s,t1);
    ReadHString(&s);
    //t
    InitHString(&t);
    char *t2 = "efgh";
    StrAssign(&t,t2);
    ReadHString(&t);
    //插入
    HStringInsert(&s,2,t);
    ReadHString(&s);
    return 0;
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容