串的定长顺序存储结构

串的定长顺序存储结构

这种结构如果操作中出现序列长度超过上界MAXSTRSIZE的情况时会导致截尾情况,而一般这在实际使用中不是想得到的。

#include <stdio.h>
#include <stdlib.h>

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

typedef int Status;

#define MAXSTRSIZE 255  /* 串的最大长度 */
typedef unsigned char SString[MAXSTRSIZE+1];


/* 生成一个其值等于chars的串T */
Status StrAssign(SString T, char chars[])
{
    int i;
    for(i=0; i < MAXSTRSIZE && chars[i] != '\0'; i++) 
        T[i+1] = chars[i];
    T[0] = i;    
    if(i >= MAXSTRSIZE) 
        return FALSE;   /* 被截断了 */
    return TRUE;
}

/* 由串S复制得到串T */
Status StrCopy(SString T, SString S)
{
    int i;
    for(i=1; i<=S[0]; i++)
        T[i] = S[i];
    T[0] = i-1;
    if(i>MAXSTRSIZE)
        return FALSE;   /* 截断 */
    return TRUE; 
}

/* 比较S,T,若S>T返回值>0 ,若S=T,返回0,若S<T,返回值<0 */
int StrCompare(SString S, SString T)
{
    int i;
    for(i=1; i<=S[0] && i<=T[0] && S[i] == T[i]; i++)
        ;   /* 判断是否完全相等 */
    i--;
    if( i==T[0] && i==S[0]  ) 
        return 0;
    else 
        return S[i+1] - T[i+1];
}

/* 清空字符串 */
Status ClearStr(SString S)
{
    for(int i=1; i<=S[0]; i++)
        S[i] = 0;
    S[0] = 0;
    return OK;
}

// Status Index(SString S, SString T, int pos)
// {

// }

/* 打印串 */
Status PrintSString(SString T)
{
    for(int i=1; i<=T[0]; i++)  /* 从第一个字符到最后一个字符 */
        printf("%c",T[i]);
    printf("\n");
}

/* 返回串的长度 */
int StrLength(SString T)
{
    return T[0];
}

/* 从串种获取子串 */
Status SubString(SString Sub, SString S, int pos, int len)
{
    if(pos<1 || pos>S[0] || len<0 || len>S[0]-pos+1)
        return ERROR;
    for(int i=1,j=pos; i<=len; i++,j++)  
        Sub[i] = S[j];
    Sub[0] = len;
}

/* 将两个串连接到一个串上 */
Status Concat(SString T, SString S1, SString S2)
{
    int i;
    for(i=1; i <= MAXSTRSIZE && i <= S1[0]; i++) 
        T[i] = S1[i];
    T[0] = i-1;
    if(i > MAXSTRSIZE)
        return FALSE;  /* 只储存S1就截断了 */
    for(int j=1; i <= MAXSTRSIZE && j<= S2[0]; i++,j++)
        T[i] = S2[j];
    T[0] = i-1;
    if(i > MAXSTRSIZE)
        return FALSE;  /* 存了第一个,到第二个就截断了 */
    return TRUE;       /* 没有截断 */
}


int main()
{
    SString T,S1,S2;

    StrAssign(S1,"Hello World");
    StrAssign(S2,"Hello World");
    // PrintSString(T);
    
    printf("equ %d\n",StrCompare(S1,S2));

    // StrCopy(S1,T);
    PrintSString(S1);
    return 0;
}

posted @ 2019-10-06 16:31  wjundong  阅读(491)  评论(0编辑  收藏  举报