データ構造の列の基本操作の実現(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
ここでの列と文字列の違いは、文字列が「」終端で文字列の長さを判定し、列の中でlength値を与えて列の長さを直接記録することである.
str.c
列は、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 sub, sub
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 sub, sub
{
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;
}