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;
    }

  • 相关阅读:
    A Simple Problem with Integers poj 3468 多树状数组解决区间修改问题。
    Fliptile 开关问题 poj 3279
    Face The Right Way 一道不错的尺取法和标记法题目。 poj 3276
    Aggressive cows 二分不仅仅是查找
    Cable master(二分题 注意精度)
    B. Pasha and String
    Intervals poj 1201 差分约束系统
    UITextField的快速基本使用代码块
    将UIImage转换成圆形图片image
    color转成image对象
  • 原文地址:https://www.cnblogs.com/qpxv/p/3765529.html
Copyright © 2011-2022 走看看