首页 > 其他分享 >顺序串的实现及应用

顺序串的实现及应用

时间:2023-03-14 19:55:05浏览次数:32  
标签:Status ... 顺序 实现 S2 S1 应用 SString define

  • 本文记录顺序串的数据结构定义及基本操作的算法描述,并对算法进行简单应用。
  • 采用C语言实现。


源程序

//SString.c
#include <stdio.h>
#include <string.h>

/* 状态码 */
#define TRUE        1   // 真/是
#define FALSE       0   // 假/否
#define OK          1   // 通过/成功
#define ERROR       0   // 错误/失败

/* 状态码类型 */
typedef int Status;

/* 宏定义 */
#define MAXSTRLEN 10                                 // 顺序串的最大串长

/* 串的顺序存储类型定义 */
typedef unsigned char SString[MAXSTRLEN + 1];         // 0号单元存放串的长度

/* 函数声明 */
Status StrAssign(SString T, const char* chars);       //构造一个值为chars的串T		
Status Concat(SString T, SString S1, SString S2);	  //用T返回由S1和S2联结而成的新串。若未截断,则返回TRUE,否则返回FALSE
void PrintElem(SString S);		                      // 测试函数,打印字符串

/* 函数定义 */
void PrintElem(SString S) {
    int i;
    
    for(i = 1; i <= S[0]; i++) {
        printf("%c", S[i]);
    }
    
    printf("\n");
}

Status StrAssign(SString T, const char* chars) {
    int i, len;
    
    len = (int) strlen(chars);
    
    // chars过长
    if(len > MAXSTRLEN) {
        return ERROR;
    }
    
    T[0] = len;
    for(i = 1; i <= len; i++) {
        T[i] = chars[i - 1];
    }
    
    return OK;
}

Status Concat(SString T, SString S1, SString S2) {
    int i;
    int uncut;  // 新串是否完整
    
    // 完全不需要裁剪
    if(S1[0] + S2[0] <= MAXSTRLEN) {
        // 复制S1到T中
        for(i = 1; i <= S1[0]; i++) {
            T[i] = S1[i];
        }
        
        // 复制S2到T中
        for(i = S1[0] + 1; i <= S1[0] + S2[0]; i++) {
            T[i] = S2[i - S1[0]];
        }
        
        // 设置新长度
        T[0] = S1[0] + S2[0];
        
        // 未裁剪,完整
        uncut = TRUE;
        
        // 需要裁剪S2
    } else if(S1[0] <= MAXSTRLEN) {
        // 复制S1到T中
        for(i = 1; i <= S1[0]; i++) {
            T[i] = S1[i];
        }
        
        // 将S2的一部分复制到T中
        for(i = S1[0] + 1; i <= MAXSTRLEN; i++) {
            T[i] = S2[i - S1[0]];
        }
        
        // 设置新长度
        T[0] = MAXSTRLEN;
        
        uncut = FALSE;
        
        // 只需要复制S1的一部分
    } else {
        // 连同长度信息一起复制
        for(i = 0; i <= MAXSTRLEN; i++) {
            T[i] = S1[i];
        }
        
        uncut = FALSE;
    }
    
    return uncut;
}

int main() {
    printf("████████ Concat \n");
    {
        SString Tmp1, Tmp2, Tmp3, Tmp4, S1, S2, S3, S4, S5, S6, S7, S8;
        
        StrAssign(S1, "+++++");
        StrAssign(S2, "-----");
        
        printf("█ 联接S1和S2形成 Tmp1 ...\n");
        Concat(Tmp1, S1, S2);
        printf("█ Tmp1 = ");
        PrintElem(Tmp1);

		StrAssign(S3, "+++++++");
        StrAssign(S4, "-----");
        
        printf("█ 联接S3和S4形成 Tmp2 ...\n");
        Concat(Tmp2, S3, S4);
        printf("█ Tmp2 = ");
        PrintElem(Tmp2);

		StrAssign(S5, "+++++");
        StrAssign(S6, "-------");
        
        printf("█ 联接S5和S6形成 Tmp3 ...\n");
        Concat(Tmp3, S5, S6);
        printf("█ Tmp3 = ");
        PrintElem(Tmp3);

		StrAssign(S7, "+++++++");
        StrAssign(S8, "-------");
        
        printf("█ 联接S7和S8形成 Tmp4 ...\n");
        Concat(Tmp4, S7, S8);
        printf("█ Tmp4 = ");
        PrintElem(Tmp4);
    }
    
    return 0;
}


运行结果

████████ Concat
█ 联接S1和S2形成 Tmp1 ...
█ Tmp1 = +++++-----
█ 联接S3和S4形成 Tmp2 ...
█ Tmp2 = +++++++---
█ 联接S5和S6形成 Tmp3 ...
█ Tmp3 = +++++-----
█ 联接S7和S8形成 Tmp4 ...
█ Tmp4 = +++++++---

标签:Status,...,顺序,实现,S2,S1,应用,SString,define
From: https://www.cnblogs.com/crossoverpptx/p/17216103.html

相关文章