c语言实现基本的数据结构(六) 串

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


// TODO:  在此处引用程序需要的其他头文件

struct String{
    char* ch;
    int length;
};

bool Assign_String(String* str, char* chars);
bool Destroy_String(String* str);
bool Clear_String(String* str);
void Print_String(String str);
bool Insert_String(String* str, String T, int locate);
bool Copy_String(String* str, String T);
int Index_String(String str, String T);

//给字符串重新赋值
bool Assign_String(String* str,char* chars){
    if (str->ch) free(str->ch);
    int i;
    char* c;
    for (i = 0, c = chars; *c; c++, i++);//获取字符串长度
    if (!i) { str->ch = NULL; str->length = 0; return true; }
    else{
        str->ch = (char*)malloc(i*sizeof(char));
        for (int j = 0; j < i; j++){
            str->ch[j] = chars[j];
        }
        str->length = i;
        return true;
    }
}
//销毁字符串
bool Destroy_String(String* str){
    if (str)
    {
        free(str);
        str = NULL;
        return true;
    }
    else
        return false;
}
//清空字符串
bool Clear_String(String* str){
    while (str->length){
        str->ch[str->length] = NULL;
        str->length--;
    }
    return true;
}
//打印
void Print_String(String str){
    if (str.length)
    {
        for (int i = 0; i < str.length;i++)
        {
            printf("%c", str.ch[i]);
            
        }
        printf("\n");
    }
}
//在原字符串str的第locate个元素前插入子字符串T
bool Insert_String(String* str, String T, int locate){
    if (locate<0 || locate>str->length) return false;
    if (T.length){
        if (!(str->ch = (char*)realloc(str->ch,(str->length + T.length)*sizeof(char)))) exit(-1);
        for (int i = str->length - 1; i >= locate; i--)
            str->ch[i + T.length] = str->ch[i];
        for (int i = 0; i < T.length; i++)
            str->ch[locate + i] = T.ch[i];
        str->length += T.length;
    }
    return true;
}
//把T的值赋给str
bool Copy_String(String* str, String T){
    if (str->ch) free(str->ch);
    if (!&T) { str->ch = NULL; str->length = 0; return true; }
    else{
        str->ch = (char*)malloc(T.length*sizeof(char));
        for (int i = 0; i < T.length; i++){
            str->ch[i] = T.ch[i];
        }
        str->length = T.length;
    }
    return true;
}
//在原字符串str中搜索子字符串T的位置
//查找失败返回-1
//正常返回index为第一次出现T首字符的位置
int Index_String(String str, String T){
    int index = -1;
    int key = 0;
    int Hl = 0;
    if (T.length&&str.length>=T.length){
        for (int i = 0; i <= str.length - T.length; i++){
            if (str.ch[i] == T.ch[key]){
                key++;
                Hl++;
                if (Hl >= T.length) { printf("出来了\n"); index = i - T.length+1; return index; }
            }
            else{
                Hl = key = 0;
            }
            printf("i=%d,str是%c,T是%c,核对T的第%d个字符,已满足字符数%d\n", i, str.ch[i], T.ch[key], key, Hl);
        }
    }
    return index;
}

 

全部评论

相关推荐

美丽的查理斯不讲武德:包kpi的啊,感觉虾皮一点hc都没有
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务