数据结构---串

一、串结构的定义 

字符串

1
2
char *str = "abcdef";
char str[7] = "abcdef"

 

空字符串

char *str = "       ";
char str[7] = " "

空串

1
2
char *str;
str[0] = '\0';

 

二、串结构之顺序存储实现

1、串头文件定义

复制代码
#ifndef __SSTRING_H__
#define __SSTRING_H__

#include "stdio.h"
#include "String.h"
#define MAXSTRLEN 20
#define u_char unsigned char
typedef u_char SString[MAXSTRLEN+1];
void InitString(SString S);
void StrAssign(SString S, const char str[]);
void StrCopy(SString Destination, SString Source);
bool StrEmpty(SString S);
int StrCompare(SString S, SString T);
int StrLength(SString S);
void StrConcat(SString T, SString s1, SString s2);
void SubString(SString S, SString sub, int pos, int len);
void StrInsert(SString S, int pos, SString T);
void StrDelete(SString S, int pos, int len);
void StrClear(SString S);
void PrintString(SString S);
//////////////////////////////////////////////////////
//void StrIndex(SString S, SString T, int pos);
//void StrReplace(SString S, SString T, SString V);
#endif
复制代码

 

2、串c文件定义

复制代码
#include "SString.h"

void InitString(SString S)
{
    S[0] = '\0';
}


void StrAssign(SString S, const char str[])
{
    int len = strlen(str);
    for (int i = 0; i < len; i++)
        S[i] = str[i];
    S[len] = '\0';
}
void StrCopy(SString Destination, SString Source)
{
    
    int len = StrLength(Source);
    for (int i = 0; i < len; i++)
    {
        Destination[i] = Source[i];
    }
    Destination[len] = '\0';
}
bool StrEmpty(SString S)
{
    return S[0] == '\0';
}
int StrCompare(SString S, SString T)
{
    int result = 0;
    while (*S != '\0' || *T != '\0')
    {
        result = *S - *T;
        if (result != 0)
            break;
        S++;
        T++;
    }
    if (result > 0)
        return 1;
    else if (result < 0)
        return -1;
    else
        return 0;
}
int StrLength(SString S)
{
    int len = 0;
    while (*S != '\0')
    {
        len++;
        S++;
    }
    return len;
}
void StrConcat(SString T, SString s1, SString s2)
{
    int s1_len = StrLength(s1);
    int s2_len = StrLength(s2);
    if (s1_len + s2_len <= MAXSTRLEN)
    {
        int i = 0, j = 0;
        for (i = 0; i < s1_len; i++)
            T[i] = s1[i];
        for (j = 0; j < s2_len; j++)
            T[j + i] = s2[j];
        T[s1_len + s2_len] = '\0';
    }
    else
    {
        int i = 0, j = 0;
        for (i=0; i < s1_len; i++)
            T[i] = s1[i];
        for (j = 0; j < MAXSTRLEN-s1_len; j++)
            T[j + i] = s2[j];
        T[MAXSTRLEN] = '\0';
    }
}
void SubString(SString S, SString sub, int pos, int len)
{
    int S_len = StrLength(S);
    if (pos < 0 || pos >= S_len || len < 0 || len > S_len)
    {
        printf("长度或者位置不对");
        return;
    }
        
    for (int i = 0; i < len; i++)
    {
        sub[i] = S[pos+i];
    }
    sub[len] = '\0';
}
void StrInsert(SString S, int pos, SString T)
{
    int s_len = StrLength(S);
    int t_len = StrLength(T);
    if (s_len + t_len <= MAXSTRLEN)
    {
        for (int i = s_len - 1; i >= pos; i--)
            S[t_len + i] = S[i];
        for (int j = 0; j < t_len; j++)
            S[pos + j] = T[j];
        S[s_len + t_len] = '\0';
    }
    else
    {
        t_len = MAXSTRLEN - s_len;
        for (int i = s_len - 1; i >= pos; i--)
            S[t_len + i] = S[i];
        for (int j = 0; j < t_len; j++)
            S[pos + j] = T[j];
        S[s_len + t_len] = '\0';
    }
}
void StrDelete(SString S, int pos, int len)
{
    
    int s_len = StrLength(S);
    for (int i = 0; i < s_len-pos-len; i++)
    {
        S[i+pos] = S[pos + i + len];
    }
    S[s_len-len] = '\0';
}
void StrClear(SString S)
{
    S[0] = '\0';
}
void PrintString(SString S)
{
    /*for (int i = 0; i < MAXSTRLEN; i++)
    {
        if (S[i] != '\0')
            printf("%c", S[i]);
        else
            break;
    }*/
    printf("%s\n", S);
}
复制代码

 

3、串测试Main文件定义

复制代码
#include "SString.h"

void main()
{
    /*SString S;
    SString T;
    InitString(S);
    InitString(T);
    const char *str = "xbcdef";
    StrAssign(S, str);
    StrCopy(T, S);
    PrintString(T);
    StrAssign(T, "abcdex");
    int res = StrCompare(S, T);
    printf("res=%d", res);

    SString Y;
    InitString(Y);
    StrAssign(S, "abcdex");
    StrAssign(T, "abcdex");
    StrConcat(Y, S, T);
    PrintString(S);
    PrintString(T);
    PrintString(Y);
    SString S1, SubStr;
    StrAssign(S1, "abcdex");
    InitString(SubStr);
    SubString(S1, SubStr, 5, 2);
    PrintString(SubStr);*/
    SString S;
    SString T;
    InitString(S);
    InitString(T);
    StrAssign(S, "abcefgh");
    StrAssign(T, "xyzuv");
    StrInsert(S,1,T);
    PrintString(S);
    StrDelete(S, 2,3);
    PrintString(S);
}
复制代码

 

二、串结构之堆存储实现

1、串头文件定义

复制代码
#ifndef __HSTRING_H__
#define __HSTRING_H__
#include "stdio.h"
#include "malloc.h"
#include "assert.h"
#include "string.h"
typedef struct HString
{
    char *ch;
    int length;
}HString;
void InitString(HString *S);
void StrAssign(HString* S, const char str[]);
void StrCopy(HString* Destination, HString* Source);
bool StrEmpty(HString* S);
int StrCompare(HString* S, HString* T);
int StrLength(HString* S);
void StrConcat(HString* T, HString* s1, HString* s2);
void SubString(HString* S, HString* sub, int pos, int len);
void StrInsert(HString* S, int pos, HString* T);
void StrDelete(HString* S, int pos, int len);
void StrClear(HString* S);
void PrintString(HString* S);
//////////////////////////////////////////////////////
//void StrIndex(HString* S, HString* T, int pos);
//void StrReplace(HString* S, HString* T, HString* V);
#endif
复制代码

 

2、串c文件定义

复制代码
#include "HString.h"

void InitString(HString *S)
{
    S->ch = NULL;
    S->length = 0;
}

void StrAssign(HString* S, const char str[])
{
    int len = strlen(str);
    if (S->ch != NULL)
        free(S->ch);
    S->ch = (char *)malloc(sizeof(char) * len);
    assert(S->ch != NULL);
    for (int i = 0; i < len; i++)
    {
        S->ch[i] = str[i];
    }
    S->length = len;
}

void StrCopy(HString* Destination, HString* Source)
{
    int len = StrLength(Source);
    if (Destination->ch != NULL)
        free(Destination->ch);
    Destination->ch = (char *)malloc(sizeof(char) * len);
    assert(Destination->ch != NULL);
    for (int i = 0; i < len; i++)
    {
        Destination->ch[i] = Source->ch[i];
    }
    Destination->length = len;
}


bool StrEmpty(HString* S)
{
    return S->length == 0;
}
int StrCompare(HString* S, HString* T)
{
    if (S->length == 0 && T->length == 0)
        return 0;
    int i = 0;
    while (i < S->length && i < T->length)
    {
        if ((S->ch[i] - T->ch[i]) > 0)
            return 1;
        else if ((S->ch[i] - T->ch[i]) < 0)
            return -1;
        else
            i++;
    }
    if (i == S->length && i == T->length)
        return 0;
    else if (i == T->length)
        return 1;
    else
        return -1;
}


int StrLength(HString* S)
{
    return S->length;
}


void StrConcat(HString* T, HString* s1, HString* s2)
{
    if (T->ch != NULL)
        free(T->ch);
    int s1_len = StrLength(s1);
    int s2_len = StrLength(s2);
    T->ch = (char *)malloc(sizeof(char) * (s1_len + s2_len));
    assert(T->ch != NULL);
    int i;
    for (i = 0; i < s1_len; i++)
        T->ch[i] = s1->ch[i];
    for (int j = 0; j < s2_len; j++)
        T->ch[i + j] = s2->ch[j];
    T->length = s1_len + s2_len;
}
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);
    for (int i = 0; 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;
    int i;
    for (i = S->length - 1; 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 = 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)
        return;
    for (int i = 0; i < len; i++)
    {
        S->ch[pos + i] = S->ch[pos+len + i];
    }
    S->length = S->length - T->length;
}
void StrClear(HString* S)
{
    S->length = 0;
    if (S->ch != NULL)
        free(S->ch);
    S->ch = NULL;
}
void PrintString(HString* S)
{
    for (int i = 0; i < S->length; i++)
    {
        printf("%c", S->ch[i]);
    }
    printf("\n");
}
复制代码

 

3、串测试Main文件定义

复制代码
#include "HString.h"

void main()
{
    HString S;
    HString sub;
    InitString(&S);
    InitString(&sub);
    StrAssign(&S, "abcdefg");
    SubString(&S, &sub, 2, 3);
    PrintString(&sub);
    PrintString(&S);
    HString T;
    InitString(&T);
    StrAssign(&T, "xyz");
    StrInsert(&S, 7, &T);
    PrintString(&S);
    /*StrCopy(&T, &S);
    PrintString(&T);
    StrAssign(&T, "abcd");
    int res = StrCompare(&S, &T);
    printf("res=%d\n", res);
    HString X;
    InitString(&X);
    StrConcat(&X, &S, &T);
    PrintString(&X);*/
}
复制代码

 

posted @   念经似的zzz  阅读(167)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· 因为Apifox不支持离线,我果断选择了Apipost!
点击右上角即可分享
微信分享提示