データ構造の列の基本操作の実現(c言語)

16654 ワード

まず、シリアルのいくつかの概念を見てみましょう.文字列(シリアルと略称)は、リニアテーブルのデータ要素のタイプが常に文字性であり、文字列のデータオブジェクトが文字セットに制約されている特殊なリニアテーブルと見なすことができます.
列は、0文字以上の有限シーケンスです.一般的には、s="s 1 s 2 s 3....sn"と記す、ここで、sは列名であり、二重引用符で囲まれた文字列を列の値と呼び、si(1<=i<=n)は列の要素と呼ぶ、アルファベット、数字または他の文字であってもよい、列を構成する基本単位であり、文字の個数nは列の長さと呼ぶ.
1.列の定義:列は0つ以上の順序付きキューです.2.列の長さ:列の文字数を列の長さと呼びます.3.空白列:ゼロ文字からなる列を空白列と呼び、空白列には文字が含まれず、その長さはゼロです.4.サブストリング:ストリング内の任意の連続する文字からなるサブシーケンスを、ストリングのサブストリングと呼び、空のストリングは任意のストリングのサブストリングである.5.主列:子列を含む列に対応するものを主列と呼ぶ.シリアルの表示:シリアルには、シーケンス格納表示とチェーン格納表示の2つの表示形式があります.シーケンスストレージは、シリアルのシーケンスストレージ構造をシーケンスシリアルと略称し、シーケンスシリアル中の文字シーケンスが連続したメモリセルのセットに順次格納され、主にシーケンスシリアルを実現する方法が3つある.次に実装するコードはシーケンスストレージであり,シリアル長の実装:str.h
#pragma once
#define SIZE 20
typedef struct Str
{
    char elem[SIZE];//elem          
    int length;//       
}Str;

void StrAssign(Str *s, const char *chars);//    
void StrCpy(Str*s, Str*t);//   
int Getlength(Str *s);//      
void Clear(Str *s);//   s
bool Inset(Str *s,int pos,Str *t);//  s pos     t
void Show(Str *s) ;//   
int BF(Str *s,Str *sub,int pos);//  s      subsub         
bool DeletePos(Str* s,int pos,int len);//    pos      len     
bool Delete(Str *s,int pos,Str *t);//    pos       t
bool Replace(Str *s,Str *t,Str *v,int pos);// v   pos        t
bool RepIaceAll(Str *s,Str *t,Str *v);//  s     t   v  

ここでの列と文字列の違いは、文字列が「」終端で文字列の長さを判定し、列の中でlength値を与えて列の長さを直接記録することである.
str.c
#include"str.h"
#include
#include
#include
#include

void StrAssign(Str *s, const char *chars)//    
{
    assert(s != NULL);
    int len = strlen(chars);

    /*if(s->length
    s->length = len;
    for(int i = 0;is->elem[i] = chars[i];
    }
}

void StrCpy(Str*s, Str*t)//   
{
    for(int i = 0;ilength;i++)
    {
        s->elem[i] = t->elem[i];
    }
    s->length = t->length;
}

int Getlength(Str *s)//      
{
    return s->length ;
}

void Clear(Str *s)//   s
{
    s->length = 0;
}

bool SubStr(Str *sub,Str *s,int pos,int len)//       
{
    if(pos < 0 || len < 1||pos >=s->length||pos+len>s->length-1)
    {
        return false;
    }
    for(int i = pos;i<pos+len;i++)
    {
        sub->elem[i-pos] = s->elem[i];
    }
    sub->length = len;
    return true;
}

bool Inset(Str *s,int pos,Str *t)//  s pos     t
{
    assert(s!=NULL);
    assert(t!=NULL);
    if(pos<0||pos>s->length||pos+t->length>SIZE)
    {
        return false;
    }
    for(int i = s->length-1;i>=pos;i--)
    {
        s->elem[i+t->length] = s->elem[i];  
    }
    for(int j = 0;jlength;j++)
        {
            s->elem[j+pos] = t->elem[j];
        }
    s->length +=t->length;
    return true;
}
int BF(Str *s,Str *sub,int pos)//  s      subsub         
{
    if(pos<0||pos>s->length)
    {
        return -1;
    }

    int i = pos;
    int j = 0;

    int lens = s->length;
    int lensub = sub->length;

    while (i < lens && j < lensub)
    {
        if (s->elem[i] == sub->elem[j])
        {
            i++;
            j++;
        }
        else
        {
            i = i - j + 1;
            j = 0;
        }
    }
    if (j >= lensub)
        {
            return i - j;
        }
        else 
            return -1;
}

bool DeletePos(Str* s,int pos,int len)// pos      len   
{
    assert(s!=NULL);
    if(pos<0||pos+len>s->length||len<0)
    {
        return false;
    }
    //for(int i = pos;ipos;i++)
    for(int i = pos;i<s->length-len;i++)
    {
        s->elem[i] = s->elem[i+len];
    }
    s->length -= len;
    return true;
}

bool Delete(Str *s,int pos,Str *t)//    pos       t
{
    assert(s!=NULL);
    assert(t!=NULL);
    if(pos<0||pos>s->length||t->length>s->length)
    {
        return false;
    }
    int index = BF(s,t,pos);
    if(index < 0)
    {
        return false;
    }
    return DeletePos(s,index,t->length);
}
bool Replace(Str *s,Str *t,Str *v,int pos)// v   pos        t
{
    assert(s!=NULL);
    assert(t!=NULL);
    assert(v!=NULL);

    int index = BF(s,t,pos);
    if(index < 0)
    {
        return false;
    }
    DeletePos(s,index,t->length);
    return Inset(s,index,v);
}
bool RepIaceAll(Str *s,Str *t,Str *v)//  s     t   v  
{
    assert(s!=NULL);
    assert(t!=NULL);
    assert(v!=NULL);

    while(Replace(s,t,v,0));
    return true;
}
void Show(Str *s) //    
{
    for(int i=0;is);i++)
    {
        printf("%c",s->elem[i]); 
    }
    printf("
"
); } int main() { Str s; char *s1 = "abcdecdfcd"; StrAssign(&s, s1); Show(&s); Str t; char *t1 = "cd"; StrAssign(&t, t1); Show(&t); /* Inset(&s, 2, &t); Show(&s); Inset(&s, 7, &t); Show(&s);*/ /*int index = BF(&s,&t,0); printf("index = %d
"
,index);*/ /*DeletePos(&s,3,2); Show(&s);*/ /*Str v; char *v1 = "zkr"; StrAssign(&v, v1); Show(&v); Replace(&s,&t,&v,0); Show(&s);*/ Str v; char *v1 = "zkr"; StrAssign(&v, v1); Show(&v); RepIaceAll(&s,&t,&v); Show(&s); system("pause"); return 0; }