zoukankan      html  css  js  c++  java
  • 第四章 串的基本操作【数据结构】

    运行截图。

    自己太久没有这样用过指针了,总是用不好~~

    下次自己申请了一个指针,就得初始化,不然在判断是否为空的操作下,会导致程序停止运行。(传说中的敲代码5分钟,debug2小时又被我碰上了,泪目)。

    #include<stdio.h>
    #include<string.h> 
    #include<stdlib.h>
    #include<malloc.h>
    #define ERROR 0
    #define OK 1
    #define MAXSIZE 1000
    typedef int Status;
    //------串的堆存储表示-------- 
    typedef struct{
        char *ch;//若是非空串,则按串长分配存储区,否则ch为NULL 
        int length;//串长度 
    }HString;
    //--------------------------------------基本操作的算法描述--------------------- 
    //生成一个其值等于串常量chars的串T 
    Status StrAssign(HString *T,char *chars)
    {
        int i,j;
        char *c;
        if(T->ch)
            free(T->ch);//释放T原有的存储空间 
        for(i = 0,c = chars;*c; c++,i++);//求chars串的长度 
        if(!i)
        {
            T->ch = NULL;
            T->length = 0;
        }
        else
        {
            T->ch = (char*)malloc(i*sizeof(char));
            if(!T->ch)
                exit(0);
            j = 0;
            while(j < i)
            {
                T->ch[j] = chars[j++];
            }
            T->length = i;
        }
        return OK;
    }
    //返回串S的长度
    int StrLength(HString S) 
    {
        return S.length;
    }
    //若S>T,返回值>0;若S==T,返回值=0;若S<T,返回值<0 
    int StrCompare(HString S,HString T)
    {
        for(int i = 0;i < S.length &&i< T.length ;i ++)
            if(S.ch[i]!=T.ch[i])
            {
                return S.ch[i] - T.ch[i];
            }
                
        return S.length - T.length ;
    }
    //用T返回由s1和s2连接而成的新串
    Status Contact(HString &T,HString s1,HString s2)
    {
        if(T.ch)
            free(T.ch);//释放旧空间
         
        
    } 
    //清空串S 
    Status ClearString(HString &S)
    {
        if(S.ch)
        {
            free(S.ch);
            S.ch = NULL;
        }
        S.length = 0;
        return OK;
    }
    //连接串s1和串s2,用T返回 
    Status Concat(HString &T,HString s1,HString s2)
    {
        int i = 0,j;
        if(T.ch)
            free(T.ch);//释放旧空间 
        T.ch = (char*)malloc((s1.length + s2.length )*sizeof(char));
        if(!T.ch)
            exit(0);
        while(i < s1.length)
        {
            T.ch[i] = s1.ch[i++];
        }
        T.length = s1.length + s2.length ;
        j = 0;
        while(j < s2.length)
        {
            T.ch [i++] = s2.ch[j++];
        }
        return OK;
    }
    //返回串s的第pos个字符起长度为len的子串
    Status SubString(HString &sub,HString s,int pos,int len)
    {
        int i = 0;
        if(pos < 1||pos > s.length || len < 0||len > s.length -1)
            return ERROR;
        if(sub.ch)
            free(sub.ch);
        if(!len)//空子串 
        {
            sub.ch = NULL;
            sub.ch = 0;
        }
        else//完整子串 
        {
            sub.ch = (char*)malloc(len*sizeof(char));
            while(i < len)
            {
                sub.ch[i] = s.ch[pos+i-1];
                i++;
            }
            sub.length = len;
        }
        return OK;
    } 
    //在S串的第pos个字符前插入串T 
    Status StrInsert(HString &S,int pos,HString T)
    {
        if(pos < 0||pos > S.length-1)//pos 不合法 
            return ERROR;
        if(T.length)//T非空,则重新分配存储空间,插入T 
        {
            S.ch = (char*)realloc(S.ch, (S.length + T.length)*sizeof(char));
            if(!S.ch)
                exit(0);
            for(int i = S.length-1; i >= pos-1;i--)//为插入T 腾出位置 
                S.ch[i+T.length] = S.ch[i];
            for(int i = 0; i < T.length ; i ++)//插入T 
                S.ch[i+pos-1] = T.ch[i];
            S.length += T.length ;    
            S.ch[S.length] = '';
        }
        return OK;
    }
    int main()
    {
        char s1[MAXSIZE],s2[MAXSIZE];
        HString SS,T,sub,S1,S2;
        int flag,pos,len;
        printf("请输入串S1和串S2
    ");
        while(scanf("%s %s",s1,s2),s1[0]!='#'&&s2[0]!='#')
        {
            T.ch = SS.ch = NULL;
            StrAssign(&SS,s1);//创建串T
            StrAssign(&T,s2); //创建串S 
            printf("S串为:
    ");
            for(int i = 0;SS.ch[i]!='';i++)
                printf("%c",SS.ch[i]);
            printf("
    ");
            printf("T串为:
    ");
            for(int i = 0; T.ch[i]!='';i ++)
                printf("%c",T.ch[i]);
            printf("
    
    ");
            
            printf("S串的长度为%d
    
    ",StrLength(SS));
            
            flag = StrCompare(SS,T);//比较两串
            if(flag > 0)
                printf("S串>T串
    
    ");
            else if(flag == 0)
                printf("S串=T串
    
    ");
            else
                printf("S串<T串
    
    ");
            S1.ch = S2.ch = NULL;
            StrAssign(&S1,s1);//创建串S1 
            StrAssign(&S2,s2);//创建串S2 
            Concat(T,S1,S2);//将串s1和串s2连接
            printf("连接后的串T为:
    ");
            for(int i = 0;T.ch[i]!='';i++)
                printf("%c",T.ch[i]);
            printf("
    
    ");
            
            printf("请输入要在S中输出的子串的位置pos和长度
    "); 
            scanf("%d%d",&pos,&len);
            SubString(sub,SS,pos,len);//返回串s的第pos个字符起长度为len的子串 
            printf("子串为:
    ");
            for(int i = 0; sub.ch[i]!='';i ++)
                printf("%c",sub.ch[i]);
            printf("
    ");
            
            StrInsert(SS,pos,T);//在串S的第pos个位置前插入串T
            printf("在第%d个位置前入串T后的串S为:
    ",pos);
            for(int i = 0;SS.ch[i]!='';i++)
                 printf("%c",SS.ch[i]);
            printf("
    ");
            
            ClearString(SS);//清空串S
        }
        return 0;
     } 
  • 相关阅读:
    WIN8开启AHCI的方法终于得到解决。
    Androidx86入门之让你的Androidx86竖屏起来
    Android软件去广告教程
    opencv 3 core组件进阶(2 ROI区域图像叠加&图像混合;分离颜色通道、多通道图像混合;图像对比度,亮度值调整)
    opencv 4 图像处理 (1 线性滤波,非线性滤波)
    opencv 3 core组件进阶(3 离散傅里叶变换;输入输出XML和YAML文件)
    php正则指定字符串内容preg_match函数之说明
    dedecms pagelist标签修改方法
    php后台多用户权限组思路与实现程序代码
    php中获取文件后缀名多种方法
  • 原文地址:https://www.cnblogs.com/hellocheng/p/7799601.html
Copyright © 2011-2022 走看看