データ構造基盤のリンクリスト(1)

線形テーブルは、非常に一般的なデータ構造であり、順次テーブルとリンクリストに分かれています。シーケンス表は先ほど紹介した「配列」の概念として簡単に理解できますが、次にリンクリストについて説明します。
通常の方法で配列を定義すると、コンピューターはメモリから連続したアドレスを取得して、指定された長さの配列を格納します。リンクリストは複数のノードで構成され(各ノードは要素を表します)、ノードは通常、メモリ内の格納場所は不連続です。さらに、リンクリストの2つのノードは通常、あるノードから別のノードを指すためにポインターを使用するため、リンクリストのノードは通常、データフィールドとポインターフィールドの2つの部分で構成されます。

struct node{
	typename data ;//数据域
	node* next; / /指针域
}
//补充一点小知识:很多同学老说这个“*”号到底放在哪呢,
//其实放哪都行,放在typename后面挨着也行,放在变量名前面挨着也行。

データフィールドはノードによって格納されるデータを格納し、ポインターフィールドは次のノードのアドレスを指します。これにより、ノードから始まり、ポインターによってリンクされたチェーン構造、つまりリンクリストが生成されます。リンクリストにヘッドノードがあるかどうかに応じて、リンクリストは先頭ノードのあるリンクリストと先頭ノードのないリンクリストに分けることができます。ヘッドノードは一般にヘッドと呼ばれ、そのデータフィールドデータはコンテンツを格納せず、次にポインターフィールドは最初のデータフィールドにコンテンツを持つノード(一般に最初のノードと呼ばれます)を指します。ほとんどの場合、ヘッドノードが使用されます。
ここに画像の説明を挿入
ここに画像の説明を挿入

malloc関数または新しい演算子を使用して、リンクリストノードにメモリ領域を割り当てる

上記では、リンクリストのノードタイプを定義する方法を既に知っていますが、次に、新しいノードを使用する必要があるたびに、対応するサイズのメモリ空間を新しいノードに一時的に割り当てます。C言語はmalloc関数を使用し、C ++はnew演算子を使用します。

malloc関数

malloc関数は、C言語のstdlib.hヘッダーファイルで動的メモリを適用するために使用される関数であり、その戻り値の型は、同じ変数型のポインターです。基本的な使用法は次のとおりです。

typename* p = (typename*)malloc(sizeof(typename));
//以下是申请一个int型变量和一个node型结构体变量为例:
int *p = (int*)malloc(sizeof(int));
node *p = (node*)malloc(sizeof(node));

この書き込みのロジックは次のとおりです。適用するメモリスペースのサイズ(つまり、sizeof(int))をmalloc関数のパラメーターとして受け取り、malloc関数がsizeof(int)スペースのメモリに適用され、このスペースを指すように戻ります。ポインタ。ただし、このポインターは現時点では未定義のポインターvoid *であるため、int ポインターにキャストする必要があるため、(node)はmallocの前に追加されます。このようにして、等号の右側でint ポインターが取得され、等号を割り当てることによってこのポインターがノードタイプポインター変数p に割り当てられ、ノードタイプのメモリ空間、つまりノードタイプの構造体変数が正常に適用されます。そして、ポインタpを介してアクセスします。アプリケーションが失敗すると、nullポインタNULLを返します。
一般的に言って、リンクリストノードを適用するだけでは失敗しません。通常、mallocを使用してより大きな動的配列に適用すると失敗します。
ここに画像の説明を挿入
この場合、mallocはnullポインターNULLを返し、それをpに割り当てます。
ここに画像の説明を挿入

メモリリークの問題

メモリリークとは、mallocとnewを使用して作成されたメモリ領域が使用後に解放されないため、プログラムが終了する前に常にメモリ領域を占有することです。これにより、一部の大規模なプログラムでメモリ消費が速すぎてメモリがなくなることがあります。割り当て可能。mallocおよびnewによって作成されたスペースを使用した後、それを解放する必要があります。
(1)free関数
free関数は、同じくstdlib.hにあるmalloc関数に対応します。解放するメモリ空間のポインタ変数(pを想定)をfreeパラメータに入力するだけです。

free(p);

フリー関数は主に2つの効果を実現します。ポインタ変数pが指すメモリ空間を解放します。ポインタ変数pを空のアドレスNULLにポイントします。フリー関数の実行後、ポインター変数p自体は消えず、空のアドレスNULLをポイントさせるだけで、元々ポイントしていたメモリが実際に解放されたことがわかります。
ここに画像の説明を挿入

19件の元の記事を公開 賞賛2 訪問数735

おすすめ

転載: blog.csdn.net/zan1763921822/article/details/105599239