基本データ構造——単一チェーンテーブル
本文概要:基本データ構造シリーズ説明の単鎖表(付源コード)
1.チェーンテーブル構造の紹介
チェーンテーブルの各ノードには、次の2つの部分が含まれます.
(1)データ部:ノードのデータを保存する
(2)アドレス部:次のノードアドレスを保存する
チェーンテーブルのヘッダポインタは、チェーンテーブル構造の最初のノードを指し、最後のノードまで順次、最後のノードのアドレス部分には一般的に空のポインタNULLが配置される.
チェーンテーブル構造では,ポインタによりノードの論理的隣接が実現されるが,論理的に隣接するノードはメモリにおいて必ずしも隣接していないため,チェーンテーブルを使用する際に予め1つの記憶空間を割り当てる必要はなく,プログラマはmalloc関数によりノードの記憶空間を動的に割り当て,あるノードを削除する際にfree関数で空間を解放する.
チェーンテーブル構造の欠点は、各ノードにポインタ変数を追加的に格納する必要があるため、ストレージスペースを浪費することである.
チェーンテーブルには単鎖テーブル、双方向チェーンテーブル、循環チェーンテーブルなどいくつかの種類があり、本文は主に単鎖テーブルの関連操作を説明する.
2.チェーンテーブルおよびデータ要素タイプの定義
本プログラムの機能は,学生情報を単一チェーンテーブルで格納することであり,学生情報には,学号key,氏名name,年齢ageが含まれる.学生情報はデータ要素タイプData,チェーンテーブルデータ構造CLType,CLType内でデータ部分をDataタイプ変数で表し,チェーンテーブル構造のポインタで次のノードを指す.
3.ノードの追加
ノードを追加すると、チェーンテーブルの末尾にノードが追加されます.手順は次のとおりです.
(1)メモリ領域を割り当て、追加するノードを保存する.
(2)先頭ポインタheadからチェックを開始し、最後のノードを見つける.
(3)表末尾ノードのアドレスを新規ノードアドレスに設定する.
(4)新規ノードのアドレスをNULLに設定する.
プログラムはmallocを使用して新しいノードのメモリ領域を申請します.
4.ヘッド接点の挿入
チェーンテーブルの先頭にノードを挿入するには、次の手順に従います.
(1)メモリ領域を割り当て、新規ノードを保存する.
(2)新規ノードをheadが指すノードに向ける.
(3)headを新規ノードに向ける.
5.ノードの検索
キーワードkeyでノードを検索しstrcmp関数を使用して検索を比較し、見つけたらそのノードポインタを返します.
6.接点を挿入
チェーンテーブルにノードを挿入するには、次の手順に従います.
(1)メモリ領域を割り当て、新しいノードを保存する.
(2)挿入する場所を見つける;
(3)挿入されたノードは挿入位置が指すノードを指し,挿入位置は新規ノードを指す.
このプログラムでは、キーワードを使用して挿入する場所を見つけます.
7.ノードの削除
チェーンテーブルからノードを削除するには、次の手順に従います.
(1)削除するターゲットノードを見つける;
(2)このノードの前のノードを後のノードに向ける.
(3)このノードを削除する.
8.チェーンテーブルの長さを計算する
チェーンテーブルはメモリに連続的に格納されていないため、チェーンテーブルの長さを計算するにはチェーンテーブル全体を巡回する必要があります.
9.すべてのノードを表示
本明細書のソースコード:単一チェーンテーブル操作.cpp
1.チェーンテーブル構造の紹介
チェーンテーブルの各ノードには、次の2つの部分が含まれます.
(1)データ部:ノードのデータを保存する
(2)アドレス部:次のノードアドレスを保存する
チェーンテーブルのヘッダポインタは、チェーンテーブル構造の最初のノードを指し、最後のノードまで順次、最後のノードのアドレス部分には一般的に空のポインタNULLが配置される.
チェーンテーブル構造では,ポインタによりノードの論理的隣接が実現されるが,論理的に隣接するノードはメモリにおいて必ずしも隣接していないため,チェーンテーブルを使用する際に予め1つの記憶空間を割り当てる必要はなく,プログラマはmalloc関数によりノードの記憶空間を動的に割り当て,あるノードを削除する際にfree関数で空間を解放する.
チェーンテーブル構造の欠点は、各ノードにポインタ変数を追加的に格納する必要があるため、ストレージスペースを浪費することである.
チェーンテーブルには単鎖テーブル、双方向チェーンテーブル、循環チェーンテーブルなどいくつかの種類があり、本文は主に単鎖テーブルの関連操作を説明する.
2.チェーンテーブルおよびデータ要素タイプの定義
本プログラムの機能は,学生情報を単一チェーンテーブルで格納することであり,学生情報には,学号key,氏名name,年齢ageが含まれる.学生情報はデータ要素タイプData,チェーンテーブルデータ構造CLType,CLType内でデータ部分をDataタイプ変数で表し,チェーンテーブル構造のポインタで次のノードを指す.
typedef struct
{
char key[10];
char name[15];
int age;
}Data;
typedef struct Node
{
Data nodeData;
struct Node *nextNode;
}CLType;
3.ノードの追加
ノードを追加すると、チェーンテーブルの末尾にノードが追加されます.手順は次のとおりです.
(1)メモリ領域を割り当て、追加するノードを保存する.
(2)先頭ポインタheadからチェックを開始し、最後のノードを見つける.
(3)表末尾ノードのアドレスを新規ノードアドレスに設定する.
(4)新規ノードのアドレスをNULLに設定する.
プログラムはmallocを使用して新しいノードのメモリ領域を申請します.
CLType *CLAddEnd(CLType *head,Data nodeData)
{
CLType *node,*temp;
if(!(node=(CLType*)malloc(sizeof(CLType))))
{
printf(" !
");
return NULL;
}
else
{
node->nodeData=nodeData;
node->nextNode=NULL;
if(head=NULL)
{
head=node;
return head;
}
temp=head;
while(temp!=NULL)
{
temp=temp->nextNode;
}
temp->nextNode=node;
return head;
}
}
4.ヘッド接点の挿入
チェーンテーブルの先頭にノードを挿入するには、次の手順に従います.
(1)メモリ領域を割り当て、新規ノードを保存する.
(2)新規ノードをheadが指すノードに向ける.
(3)headを新規ノードに向ける.
CLType *CLAddFist(CLType *head,Data nodeData)
{
CLType *node;
if(!(node=(CLType *)malloc(sizeof(CLType))))
{
printf(" !
");
return NULL;
}
else
{
node->nodeData=nodeData;
node->nextNode=head;
head=node;
return head;
}
}
5.ノードの検索
キーワードkeyでノードを検索しstrcmp関数を使用して検索を比較し、見つけたらそのノードポインタを返します.
CLType *CLFindNode(CLType *head,char *key)
{
CLType *temp;
temp=head;
while(temp)
{
if(strcmp(temp->nodeData.key,key)==0)
{
return temp;
}
temp=temp->nextNode;
}
return NULL;
}
6.接点を挿入
チェーンテーブルにノードを挿入するには、次の手順に従います.
(1)メモリ領域を割り当て、新しいノードを保存する.
(2)挿入する場所を見つける;
(3)挿入されたノードは挿入位置が指すノードを指し,挿入位置は新規ノードを指す.
このプログラムでは、キーワードを使用して挿入する場所を見つけます.
CLType *CLInsertNode(CLType *head,char *key,Data nodeData)
{
CLType *node,*temp;
if(!(node=(CLType *)malloc(sizeof(CLType))))
{
printf(" !
");
return 0;
}
node->nodeData=nodeData;
temp=CLFindNode(head,key);
if(temp)
{
node->nextNode=temp->nextNode;
temp->nextNode=node;
}
else
{
printf(" !
");
free(node);
}
return head;
}
7.ノードの削除
チェーンテーブルからノードを削除するには、次の手順に従います.
(1)削除するターゲットノードを見つける;
(2)このノードの前のノードを後のノードに向ける.
(3)このノードを削除する.
int CLDeleteNode(CLType *head,char *key)
{
CLType *node,*temp;
temp=head;
node=head;
while(temp)
{
if(strcmp(temp->nodeData.key,key)==0)
{
node->nextNode=temp->nextNode;
free(temp);
return 1;
}
else
{
node=temp;
temp=temp->nextNode;
}
}
return 0;
}
8.チェーンテーブルの長さを計算する
チェーンテーブルはメモリに連続的に格納されていないため、チェーンテーブルの長さを計算するにはチェーンテーブル全体を巡回する必要があります.
int CLLength(CLType *head)
{
int len=0;
CLType *temp;
temp=head;
while(temp)
{
len++;
temp=temp->nextNode;
}
return len;
}
9.すべてのノードを表示
void CLAllNode(CLType *head)
{
CLType *temp;
Data nodeData;
temp=head;
printf(" %d 。 :
",CLLength(head));
while(temp)
{
nodeData=temp->nodeData;
printf(" (%s,%s,%d)
",nodeData.key,nodeData.name,nodeData.age);
temp=temp->nextNode;
}
}
本明細書のソースコード:単一チェーンテーブル操作.cpp