顺序串的实现及应用

Posted crossoverpptx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了顺序串的实现及应用相关的知识,希望对你有一定的参考价值。

  • 本文记录顺序串的数据结构定义及基本操作的算法描述,并对算法进行简单应用。
  • 采用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 = +++++++---

以上是关于顺序串的实现及应用的主要内容,如果未能解决你的问题,请参考以下文章

数据结构学习笔记——串的基本知识(顺序存储结构实现串)

串的动态顺序存储代码

实现顺序串的各种模式匹配算法

第四章:1.串 -- 串类型定义及串的表示和实现

数据结构——串的相关算法实现

(王道408考研数据结构)第四章串-第一节:串的定义和基本操作及存储结构