欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > > 文章正文

【数据结构】算法4.2&4.3 串连接Concat&求子串SubString,算法4.2

来源: javaer 分享于  点击 38767 次 点评:135

【数据结构】算法4.2&4.3 串连接Concat&求子串SubString,算法4.2


/*  串的定长顺序存储表示  */
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

#define MAXSIZE 40
#define MAXSTRLEN 6 //最大字符串
typedef int Status;
typedef char SString[MAXSIZE+1];
//此处声明的SString[maxsize+1]虽是数组,在SubString中作为指针使用,

//因位是指针,SString[0]存放实际数组的地址,使用时不用加*或&,直接传入数组的值

/*******************************声明部分****************************************/
Status StrAssign(SString *T,char *chars);
//生成一个其值等于chars的串T  第一个元素为字符串长度
Status SubString(SString Sub, SString T,int pos,int len);
//用Sub返回串T的第pos个字符起长度为len的子串
Status Concat(SString T,SString S1,SString S2);
//用T返回由S1和S2连接而成的新串

/*Status SubString(SString Sub, SString T,int pos,int len)*/
int StrCompare(SString S,SString T);
int StrLength(SString S);
int StrEmpty(SString S);
Status StrCopy(SString S,SString *T);
Status ClearString(SString S);

/*******************************函数部分****************************************/

Status StrAssign(SString *T,char *chars)
{
    int i,ct;
    for(i = 0;i <= MAXSIZE; i++)
        (*T)[i] = '\0';    //全部清零

    (*T)[0] = strlen(chars);
    for(ct = 1;*chars != '\0';ct++,chars++){
        (*T)[ct] = *chars;
    }
    return OK;
}

Status SubString(SString Sub, SString T,int pos,int len)
{
    if(pos<1 || pos>T[0] || len<0 || len>T[0]-pos+1)
        return ERROR;

    int ct,cnt;
    for(ct = 1,cnt = pos;cnt <= len+pos;ct++,cnt++){
        Sub[ct]=T[cnt];
    }
    Sub[0] = len+1;
    return OK;
}
/*
Status SubString(SString Sub, SString T,int pos,int len)
{
    if(pos<1 || pos>T[0] || len<0 || len>T[0]-pos+1)
        return ERROR;
    int i ;
    for(i = 1;i<=len;i++)
        Sub[i] = T[pos+i-1];
    Sub[0] = len;
    return OK;
}
*/
Status Concat(SString T,SString S1,SString S2)
{
    int count,i;
    int uncut;
    //情况一:若不用截断,直接复制S1和S2到T中
    if(S1[0]+S2[0] <= MAXSTRLEN){
        T[0] = S1[0] + S2[0];
        for(count = 1;count <= S1[0];count++){   //复制S1的值到T中
            T[count] = S1[count];
        }
        for(count = S1[0]+1,i = 1;count <= T[0];count++,i++){ //复制S2的值到T中
            T[count] = S2[i];
        }
        uncut = TRUE;
    }//if

    //情况二:因为长度超出限制,需截断S2后面的子串
    else if( S1[0] < MAXSTRLEN){
        T[0] = MAXSTRLEN;
        for(count = 1;count <= S1[0];count++){   //复制S1的值到T中
            T[count] = S1[count];
        }
        for(count = S1[0]+1,i = 1;count <= T[0];count++,i++){ //复制截断的S2的值到T中
            T[count] = S2[i];
        }
        uncut = FALSE;
    }//else if

    //情况三:因为S1的长度已经达到最大长度,T只取S1
    else{
        T[0] = MAXSTRLEN;
        for(count = 1;count <= S1[0];count++){   //复制S1的值到T中
            T[count] = S1[count];
        }
    }//else
}

int StrCompare(SString S,SString T)
{
    int i = 1;
    while(i<=S[0] && i<= T[0]){
        if(S[i] == T[i])
            i++;
        else
            return S[i]- T[i];
    }
    return S[0] - T[0];
}

int StrLength(SString S)
{
    return S[0];
}

int StrEmpty(SString S)
{
    return S[0] == 0;
}

Status StrCopy(SString S,SString *T)
{
    int i;
    for(i = 0;i<=S[0];i++)
        (*T)[i] = S[i];
    return OK;
}

Status ClearString(SString S)
{
    S[0] = 0;
}
/*******************************主函数部分**************************************/
int main()
{
    SString T,S1,S2;
    //验证情况一
    /*char *chars1 = "abcd";
    char *chars2 = "e";*/


    //验证情况二
   /* char *chars1 = "abcd";
    char *chars2 = "efghijk";*/

    //验证情况三
    char *chars1 = "abcdef";
    char *chars2 = "efghijk";


    StrAssign(&S1,chars1);
    StrAssign(&S2,chars2);
    Concat(T,S1,S2);

    //打印T中的值
    int i;
    for(i = 1;i<=T[0];i++)
        printf("%c",T[i]);

    return 0;
}

相关文章

    暂无相关文章

用户点评