zoukankan      html  css  js  c++  java
  • 动态字符串的存储结构的实现

    /**
    *毕竟这只是简单的串的链式存储结构,不过不同的对象操作不一样
    *在此为了简化操作,很多菜单啊,选择结构之类的都省去了,这些都可以在之前的一些链表的基本的错中
    *可以得到的仔细的结果,链表的操作是特别的重要的 ,尤其是链表的存储结构链式存储结构涉及到开辟空间
    *地址的传递,指针等操作,所以在此有必要仔细研究这些,这是我系统的重新对数据结构重新编写一遍的结果
    *纯属于个人的理解和分析的结果
    */

    效果:

    代码:
    /**
    *链式的串存储结构的实现
    *
    */
    #include <iostream>
    #include <malloc.h>
    #include <string.h>
    using namespace std;
    /**
    *串的动态数组结构体的定义
    */
    typedef struct{
    char *str;
    int maxLength;
    int length;
    }DString ;
    /**
    *初始化操作
    */
    DString * Initiate(DString *s,int max,char *string){
    int i ;
    s = (DString *)malloc(sizeof(DString));
    s->str = (char *)malloc(sizeof(char)*max );//申请动态数组空间
    s->maxLength = max;//置动态数组 最大个数
    s->length= strlen(string);//置串当前的长度
    /**
    *对串进行赋初值,以免后期操作的麻烦。
    */
    for(i = 0; i< s->length;i++){
    s->str[i] = string[i];
    }
    cout<<"初始化完成!"<<endl;
    return s;
    }
    /**
    *
    *插入子串的操作
    */
    int Insert(DString *s,int pos,DString *T){

    char *p;
    if(pos <0 || pos> s->length){
    cout<<"参数pos出错!"<<endl;
    return 0;
    }else{
    if(s->length +T->length>s->maxLength){
    /**
    *此时我们必须重新申请空间,以致于不会溢出
    */

    p = (char *)realloc(s->str,(s->length+ T->length)*sizeof(char));
    if(p == NULL){
    cout<<"内存空间不足!"<<endl;
    return 0;
    }
    }
    for(int i = s->length- 1;i>= pos;i--){
    s->str[i + T->length] = s->str[i];
    }
    for(int i = 0 ;i <T->length ;i++){
    s->str[pos + i]= T->str[i];
    }
    s->length = s->length + T->length;
    cout<<"插入成功!"<<endl;
    return 1;
    }
    return 0;
    }
    /**
    *删除子串操作
    *
    */
    int Delete(DString *s,int pos,int len){
    if(s->length<= 0){
    cout<<"数组中未放入任何字符!无数据可删!"<<endl;
    return 0;
    }else if(pos <0 || pos + len >s->length ||len < 0){
    cout<<"参数pos或len不合法!"<<endl;
    return 0 ;
    }else{
    for(int i = pos + len ;i< s->length ;i++){
    s->str[i -len] =s->str[i];
    }
    s->length = s->length - len;
    return 1;
    }
    }

    /**
    *取子串操作
    *
    */
    int SubString(DString *s,int pos,int len ,DString *T){
    if(pos <0 ||len < 0|| pos +len > s->length){
    cout<<"参数Len和pos 错误!"<<endl;
    return 0;
    }else{
    for(int i = 0;i < len ;i++){
    T->str[i] =s->str[pos + i];
    }
    T->length =len;
    return 1;
    }
    }
    void outPut(DString *s){
    cout<<"字符串:"<<endl;
    for(int i = 0; i<s->length ;i++){
    cout<<s->str[i];
    }
    cout<<endl;
    }

    /**
    *撤销操作来释放数组空间
    *
    */
    void Destroy(DString *s){
    free(s->str);
    s->maxLength = 0;
    s->length = 0;
    cout<<"撤销成功!"<<endl;
    }
    /**
    *功能模块已经写完了
    *现在写主函数来测功能
    */
    int main(){
    DString *p;
    DString *T;
    DString *p1;
    //初始化操作
    //cout<<"p="<<p<<"p1="<<p1<<endl;

    cout<<"初始化操作:"<<endl;
    p = Initiate(p,100,"Data");
    p1 =Initiate(p1,50,"Struture ");
    T = Initiate(T,50,"");
    outPut(p);
    outPut(p1);
    cout<<endl;
    //插入操作
    cout<<"插入操作!"<<endl;

    Insert(p,0,p1);
    cout<<"输出操作:"<<endl;
    outPut(p);

    //取子串操作
    cout<<"取子串操作:"<<endl;
    SubString(p,0,12 ,T);
    cout<<"输出所取得串:"<<endl;
    outPut(T);
    //删除操作
    cout<<"删除操作!"<<endl;
    Delete(p,0,5);
    outPut(p);
    //释放内存空间
    cout<<"释放内存操作:"<<endl;
    Destroy(p);
    return 0;
    }

  • 相关阅读:
    超300程序员受益入职的面试经验
    【修真院“正直”系列之三】【修真神界】【修行卷】【第一章】修真院入场券
    Js的同步异步以及回调函数
    Bootstrap栅格布局使用
    为什么程序员的工资比其他行业高这么多?
    Java培训机构可靠吗?
    get 与 post的区别?application json 与form表单的区别?
    谈谈以前端角度出发做好SEO需要考虑什么?
    【修真院“纯洁”系列之十九】驱逐令
    Redis缓存穿透和缓存雪崩以及解决方案
  • 原文地址:https://www.cnblogs.com/qpxv/p/3765529.html
Copyright © 2011-2022 走看看