【データ構造】文字列(文字列のシーケンシャルストレージとブロックチェーンストレージ)

記事のディレクトリ


序文

文字列(文字列)は、データ要素が1文字のみで構成される特殊な線形テーブルです。通常の状況では、処理される非数値データオブジェクトは文字列データであることがよくあります。たとえば、トランザクション処理では、顧客の名前、住所、および商品の出所は通常、文字列として扱われます。通常、「文字列全体」が処理オブジェクトです。


1つは、文字列の定義です。

文字列の定義:

文字列は、0個以上の任意の文字で構成される文字のシーケンスです。

通常、次のように記録されます:s = "a1、a2、a3、...、an"

  • sは文字列の名前であり、二重引用符で囲まれた値は文字列値です。
  • 文字列内の文字数nは、文字列の長さと呼ばれます。
  • ゼロ文字の文字列はヌル文字列と呼ばれ、文字列の長さは0で、∅で表されます。

スペース文字列:1つ以上のスペースで構成される文字列。

サブストリングとメインストリング:ストリング内の連続する文字で構成されるサブシーケンスは、ストリングのサブストリングと呼ばれます。部分文字列を含む文字列は、メイン文字列と呼ばれます。

部分文字列の位置:メイン文字列の部分文字列の最初の文字のシリアル番号。

文字列は等しい:2つの文字列の長さは等しく、対応する位置の文字は同じです。


第二に、文字列のストレージ構造

1.文字列のシーケンシャルストレージ構造

文字列のシーケンシャルストレージ構造は、連続したアドレスを持つメモリセルのセットを使用して文字シーケンスを格納します。事前定義されたサイズに従って、定義された文字列変数ごとに固定長のストレージ領域が割り当てられます。通常、固定長の配列で定義されます。

 文字列の実際の長さは、事前定義された長さの範囲内で任意に指定でき、事前定義された長さを超える文字列値は破棄されます。これは「切り捨て」と呼ばれます。 

2.文字列の固定長シーケンシャルストレージと操作

/*定义方法1*/
#define MAXSIZE 255
typedef char SString[MAXSIZE+1];//0号单元存放串的长度

//定义方法2
/*
typedef struct
{
    char data[MAXSIZE];
    int curlen;
}SeqString;
SeqString s;
*/

/*串连接*/
/*
假设S1,S2,T都是SString型的串变量,串T是由串S1联结串S2得到。
基于S1和S2长度的不同情况,串T可能有3种情况:
(1)S1[0]+S2[0]=<MAXSIZE
(2)S1[0]<MAXSIZE,S1[0]+S2[0]>MAXSIZE,则S2被部分截断
(3)S1[0]>=MAXSIZE,则只包含S1
*/
int Concat(SString &T,SString S1,SString S2)
{
    int flag=1;//标志是否截断,1表示没截断,0表示截断
    int j,k;
    j=1,k=1;
    if(S1[0]+S2[0]=<MAXSIZE){
        while(S1[j]!='\0'){
            T[k++]=S1[j++];
        }
        j=1;
        while(S2[j]!='\0'){
            T[k++]=S2[j++];
        }
        T[0]=S1[0]+S2[0];
    }
    else if(S1[0]<MAXSIZE){
        while(S1[j]!='\0'){
            T[k++]=S1[j++];
        }
        j=1;
        while(k<MAXSIZE){
            T[k++]=S2[j++];
        }
        T[0]=MAXSIZE;
        flag=0;
    }
    else{
         while(S1[j]!='\0'){
            T[k++]=S1[j++];
        }
        T[0]=MAXSIZE;
        flag=0;
    }
    return flag;
}

3.ストリングのブロックチェーンストレージ構造

文字列の連鎖ストレージ構造は線形テーブルに似ていますが、文字列構造の特殊性により、構造内の各要素データは文字です。リンクリストを使用して文字列値を格納するだけの場合、1つのノードが1つの文字に対応します。 、その後、スペースの無駄がたくさんあります。したがって、1つのノードに1つの文字を格納するか、複数の文字を格納することを検討できます。最後のノードがいっぱいでない場合は、「#」またはその他の文字列以外の値の文字を使用して完了できます。

#define CHUNKSIZE 80 //定义块的大小
typedef struct chunk{
    char ch[CHUNKSIZE];
    struct chunk *next;
}chunk;

typedef struct{
    chunk *head,*tail;//串的头指针和尾指针
    int curlen;    //串的当前长度
}LString;

通常の状況では、文字列を操作する場合、最初から最後まで順番にスキャンするだけでよく、文字列値の二重リンクリストを確立する必要はありません。

テールポインタを設定する目的は接続操作を容易にすることですが、接続時に最初の文字列の最後にある無効な文字を処理する必要があることに注意してください。 

保管密度:

 

おすすめ

転載: blog.csdn.net/Jacky_Feng/article/details/108601074