内容を明らかにします.チェーンのない神秘的なベールです.

1814 ワード

チェーンという概念はデータ構造の教室で使われていました.当時は清華厳蔚敏先生の編集長である「データ構造」教程を使っていました.チェーンノードはデータであると考えていました.
typedef struct tagNode {
TDataType data;
struct tagNode *pNext;
} TNode;
今思えば、その時は全く本の表面に留まっていましたが、ソースコード(linux、rtems、yaffs)を見てみると、チェーンノードにはまだデータを持たなくてもいいという形があります.
typedef struct tagNode {
struct tagNode *pNext;
struct tagNode *pPre;
} TNode;
上記のチェーンノードは、どのデータにも依存しません.このようにすれば、各チェーンで記憶する必要があるデータに対して、チェーンの操作を書いてもいいです.すべてのデータは同じチェーン操作を共有できます.このようなデータとは関係のないチェーンはどうやって共用されているかを見てみます.
typedef struct tagData {
.....
} TData;
このデータをチェーンでどうやって組織しますか?
typedef struct tagLinkData {
TNode node;
TData data;
} TLinkData;
 
typedef struct tagLinkData {
TData data;
TNode node;
} TLinkData;
上記の構造によってチェーンノードと関心のあるデータを関連付けることができます.チェーンノードはデータの先頭に置くこともできます.データの最後に置くこともできます.上述のように、私は一般的に使う時にデータの先頭に置くのです.このような便利さのために、データとは関係のないチェーンテーブルはどのように使うのかを説明します.チェーン1のように追加、削除、第一のノード取得などがあることを知っています.
1.チェーンの操作宣言は以下の通りであると仮定する.
void append(TNode *pList, const TNode *pNode);
void delete(TNode *pList, const TNode *pNode);
const TNode *getFirst(const TNode *pList);
TNode list;
2.  1 TLinkData list   
TLinkData dataapped(&list,(const TNode*)&data);
もしnodeがdataの最後に置くならば、ここの第二のパラメーターは変えて、(const TNode*)&data.node;
3.ノードpNodeをリストから削除する
delete(&list, pNode);
4.リストの第1のノードを取得し、そのconst TNode*pNode=get First(&list)を使用する.const TLinkData*plinkData=(const TLinkData*)pNode;const TDat&data=plinkData->data;
もしnodeがdataの最後に置くならば、第2行は直接このように転換することができなくて、pNodeの住所は1つのsizeof(TDaa)を減らさなければならなくて、最初の住所です.