• 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("
    ");
        }
    }
    //在原字符串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("出来了
    "); index = i - T.length+1; return index; }
                }
                else{
                    Hl = key = 0;
                }
                printf("i=%d,str是%c,T是%c,核对T的第%d个字符,已满足字符数%d
    ", i, str.ch[i], T.ch[key], key, Hl);
            }
        }
        return index;
    }
  • 相关阅读:
    In Java, how do I read/convert an InputStream to a String? Stack Overflow
    IFrame自动更改大小
    [置顶] 获取服务器上格式为JSON和XML两种格式的信息的小程序
    Qt VS MFC
    [技术分享]使用 UAG 发布 RemoteAPP
    linux2.6.32在mini2440开发板上移植(11)之配置USB外设
    MFC控件(2):Text_Edit_Control
    CentOS 6.4 安装 Oracle 10g2 备记
    sql lite 二个数据库之间的表进行复制
    变量和函数的定义和声明
  • 原文地址:https://www.cnblogs.com/xin1998/p/7746373.html
Copyright © 2020-2023  润新知