理解することを教える記事-一連のデータ構造
①文字列型の定義
文字列の定義は、スタックやキューの定義よりもはるかに単純です。C言語で文字列を操作するための関数は多数あり、対応する関数ライブラリはstring.hです。読者の印象を深めるために、ストリングの開発背景を以下に示します。(要点ではありません。すでにある程度理解している場合はスキップできます)
コンピュータ上での非数値処理の対象は、基本的に文字列データです。以前のプログラミング言語では、
文字列は入力と出力の定数として表示されていました。言語処理プログラムの開発に伴い、文字列処理が登場しました。
このようにして、文字列はますます多くのプログラミング言語で変数型として表示され、
一連の文字列操作も生成されます。文字列は、一般的に略して文字列と呼ばれます。アセンブリおよび言語コンパイラでは、ソースプログラムとターゲット
プログラムはすべて文字列データです。トランザクション処理手順では、顧客の名前と住所、および商品の名前、原産地、仕様は、
通常、文字列として扱われます。もう1つの例は、情報検索システム、テキスト編集プログラム、質疑応答システム、自然言語
翻訳システム、音楽分析プログラムです。これらはすべて、処理オブジェクトとして文字列データを使用します。
しかし、現在使用しているコンピュータのハードウェア構造は、主に数値計算の必要性を反映しているため、
文字列データの処理は、整数や浮動小数点数の処理よりもはるかに複雑です。また、アプリケーションの種類によって、処理される
文字列の特性が異なります。文字列の処理を効果的に実現するには、状況に応じて適切な
ストレージ構造を使用する必要があります。この章では、いくつかの基本的な文字列操作操作といくつかの異なるストレージ構造について説明します。
文字列の説明については、これが教科書の定義です。単純ですが、読者はそれを注意深く読む必要があります。
②文字列の表現と実現
文字列の場合、文字配列に対するほとんどの操作は、C言語関数ライブラリの関数を使用して実行できます。以下は文字列に基づいており、構造と組み合わされており、string.hライブラリの組み込み関数には適用されません。作成者は、参照、調査、および使用のためにヒープ割り当ての操作アルゴリズムを実装しました。以下の教科書のスクリーンショットでは、擬似コードが関数の実装プロセスを詳細に説明しているため、後で繰り返すことはしません。
後の文字列のパターンマッチングアルゴリズムと最適化アルゴリズムについては、興味のある読者は自分で読んで学ぶことができます。以下は、上記のアルゴリズムの操作のスクリーンショットです。
最後にコード
#include<stdio.h>
#include<malloc.h>
#define LEN sizeof(struct string)
struct string{
char *ch;
int length;
};
int main()
{
char s1[5]="123",s2[5]="456";
struct string *string1,*string2,*string3,*string4;
struct string *StrAssign(char *chars); // 生成一个其值等于串常量的串str
int StrLength(struct string *str); // 返回str元素的个数,称为串的长度
int StrCompare(struct string *str1,struct string *str2); // 若str1大于str2,返回值>0;若str1大于str2,返回值<0;若相等,返回值=0
void ClearString(struct string *str); // 将str清为空串
struct string *Concat(struct string *str1,struct string *str2); // 将str1和str2合成新串
void SubString(struct string *str,struct string *str2,int pos,int len); // 用sub返回串str中第pos个字符起长度为len的字串
// 测试
string1 = StrAssign(s1); // 初始化string1,string2,并将其ch的值分别赋为s1和s2
string2 = StrAssign(s2);
string4 = StrAssign(s1); // 给string4的ch赋上初值
printf("%s\n",string1->ch); // 输出string1的ch字符串
printf("%d\n",StrCompare(string1,string2)); // 比较string1和string2的ch字符串的大小
string3 = Concat(string1,string2); // 连接string1和string2
printf("%s\n",string3->ch);
SubString(string3,string4,1,2); // 测试SubString函数
printf("%s\n",string4->ch);
ClearString(string1); // 将string1清为空串
return 0;
}
struct string *StrAssign(char *chars)
{
// 生成一个其值等于串常量的串str
struct string *str;
str = (struct string*)malloc(LEN);
int i;
for(i = 0;chars[i] != '\0';i++);
str->length = i;
str->ch = chars;
return str;
}
int StrLength(struct string *str)
{
// 返回str元素的个数,称为串的长度
return str->length;
}
int StrCompare(struct string *str1,struct string *str2)
{
// 若str1大于str2,返回值>0;若str1大于str2,返回值<0;若相等,返回值=0
int i;
for(i = 0;i < StrLength(str1) && i < StrLength(str2);i++){
if(str1->ch[i] != str2->ch[i]){
return str1->ch[i] - str2->ch[i];
}
}
return str1->ch[i] - str2->ch[i];
}
void ClearString(struct string *str)
{
// 将str清为空串
str->ch = "";
str->length = 0;
printf("clear over!\n");
}
struct string *Concat(struct string *str1,struct string *str2)
{
// 将str1和str2合成新串
struct string *str3;
int i,j;
str3 = (struct string*)malloc(LEN);
str3->ch = str1->ch;
str3->length = str1->length + str2->length;
for(i = str1->length,j = 0;j < str2->length;i++,j++){
str3->ch[i] = str2->ch[j];
}
str3->ch[i] = '\0';
return str3;
}
void SubString(struct string *str,struct string *str2,int pos,int len)
{
// 用sub返回串str中第pos个字符起长度为len的字串
int i,j;
for(i = pos,j = 0;i < pos + len;i++,j++){
str2->ch[j] = str->ch[i];
}
str2->ch[j] = '\0';
str2->length = len;
}