基本的に、配列とは、共通の見出しまたは変数名でシーケンシャルなメモリ位置に格納されている一連の類似データオブジェクトです。
リンクリストは、各要素が次の要素にリンクされている一連の要素を含むデータ構造です。 リンクリストの要素には2つのフィールドがあります。 1つはデータフィールド、もう1つはリンクフィールドです。データフィールドには、格納および処理される実際の値が含まれています。 さらに、リンクフィールドは、リンクリスト内の次のデータ項目のアドレスを保持する。 特定のノードにアクセスするために使用されるアドレスはポインタと呼ばれます。
配列とリンクリストのもう1つの大きな違いは、配列は固定サイズであり、事前に宣言する必要があるという点です。ただし、リンクリストはサイズに制限されず、実行中の拡張と縮小は行われません。
比較表
比較基準 | アレイ | リンクリスト |
---|---|---|
基本 | これは、一定数のデータ項目の一貫したセットです。 | これは、可変数のデータ項目を含む順序付きセットです。 |
サイズ | 宣言時に指定します。 | 指定する必要はありません。 実行中に成長および縮小します。 |
ストレージ割り当て | 要素の位置はコンパイル時に割り当てられます。 | 要素位置は実行時に割り当てられます。 |
要素の順序 | 連続して保存 | ランダムに保存 |
要素にアクセスする | 直接アクセスまたはランダムアクセス。つまり、配列インデックスまたは添え字を指定します。 | 順次アクセス、つまりリストの最初のノードからポインタでトラバースします。 |
要素の挿入と削除 | シフトが必要なので、比較的遅くなります。 | より簡単、迅速、そして効率的 |
検索中 | 二分探索と線形探索 | 線形検索 |
必要メモリ | もっと少なく | もっと |
メモリ使用率 | 無効 | 効率的 |
配列の定義
配列は、一定数の同種の要素またはデータ項目のセットとして定義されます。 つまり、配列には、すべての整数、すべての浮動小数点数、またはすべての文字のいずれかのタイプのデータのみを含めることができます。 配列の宣言は次のとおりです。
int a [10];
ここで、intは、配列ストアが格納するデータ型または型要素を指定します。 “ a”は配列の名前、角括弧内に指定された数は配列が格納できる要素の数です。これは配列のサイズまたは長さとも呼ばれます。
配列について覚えておくべき概念のいくつかを見てみましょう。
- 配列の個々の要素は、配列名を記述し、その後に角括弧内に添字または添え字(配列内の要素の位置を決定する)を記述することによってアクセスできます。 たとえば、配列の5番目の要素を取得するには、ステートメントa [4]を書く必要があります。
- いずれにせよ、配列の要素は連続したメモリ位置に格納されます。
- 配列の最初の要素のインデックスはゼロ[0]です。 これは、最初と最後の要素がそれぞれ[0]と[9]として指定されることを意味します。
- 配列に格納できる要素の数、つまり配列のサイズまたはその長さは、次の式で与えられます。
(上限 - 下限)+ 1
上記の配列では、(9-0)+ 1 = 10になります。 ここで、0は配列の下限、9は配列の上限です。 - 配列はループを通じて読み書きできます。 1次元配列を読み取る場合、配列を読み取るために1つ、書き込み(印刷)するためにもう1つのループが必要です。次に例を示します。
a。 配列を読むために
(i = 0; i <= 9; i ++)の場合
{scanf(“%d”、&a [i]); }
b。 配列を書くために
(i = 0; i <= 9; i ++)の場合
{printf(“%d”、a [i]); } - 2次元配列の場合、それは2つのループを必要とし、同様にn次元配列はn個のループを必要とするであろう。
配列に対して実行される操作は次のとおりです。
- 配列の作成
- 配列をトラバースする
- 新しい要素の挿入
- 必須要素の削除
- 要素の修正
- 配列のマージ
例
次のプログラムは配列の読み書きを示しています。
#include
#include
void main ()
{
int a[10], i;
printf("Enter the array");
for ( i= 0; i <= 9; i++)
{
scanf ( "%d", &a[ i ] ) ;
}
printf( "Enter the array" );
for (i = 0 ; i <= 9 ; i++)
{
printf ( "%d\n", a[ i ] ) ;
}
getch ();
}
リンクリストの定義
リンクリストは、互いにリンクしているデータ要素の特定のリストです。 このすべての要素は、論理的な順序を表す次の要素を指しています。 各要素はノードと呼ばれ、2つの部分から構成されています。
次の要素を指す情報とPOINTERを格納するINFO部分。 あなたがアドレスを格納するためにあなたが知っているように、私たちはポインタと呼ばれるCのユニークなデータ構造を持っています。 したがって、リストの2番目のフィールドはポインタ型でなければなりません。
リンクリストの種類は、シングルリンクリスト、ダブルリンクリスト、循環リンクリスト、循環ダブルリンクリストです。
リンクリストで実行される操作は次のとおりです。
- 作り方
- トラバース
- 挿入
- 削除
- 検索中
- 連結
- 表示
例
次のコードは、リンクリストの作成方法を示しています。
struct node
{
int num;
stuct node *next;
}
start = NULL;
void create()
{
typedef struct node NODE;
NODE *p, *q;
char choice;
first = NULL;
do
{
p = (NODE *) malloc (sizeof (NODE));
printf ("Enter the data item\n");
scanf ("%d", & p -> num);
if (p == NULL)
{
q = start;
while (q -> next ! = NULL)
{ q = q -> next
}
p -> next = q -> next;
q -> = p;
}
else
{
p -> next = start;
start = p;
}
printf ("Do you want to continue (type y or n) ? \n");
scanf ("%c", &choice) ;
}
while ((choice == 'y') || (choice == 'Y'));
}
配列とリンクリストの主な違い
- 配列は、データ構造体が類似タイプのデータ要素の集まりを含むのに対し、リンクリストはノードと呼ばれる順序付けられていないリンク要素の集まりを含むと見なされます。
- 配列では、要素はインデックスに属します。つまり、4番目の要素に入りたい場合は、インデックスまたは角かっこ内の位置とともに変数名を記述する必要があります。
リンクリストでは、頭から始めて、4番目の要素に到達するまで作業を進めなければなりません。 - 要素配列へのアクセスは高速ですが、リンクリストは線形時間がかかるため、かなり遅くなります。
- 配列への挿入や削除などの操作は多くの時間がかかります。 一方、リンクリストでのこれらの操作のパフォーマンスは速いです。
- 配列は固定サイズです。 対照的に、リンクリストは動的かつ柔軟であり、そのサイズを拡大および縮小することができます。
- 配列では、メモリはコンパイル時に割り当てられ、リンクリストでは実行時または実行時に割り当てられます。
- 要素は連続して配列に格納されますが、リンクリストにはランダムに格納されます。
- 実際のデータが配列のインデックス内に格納されているため、メモリの必要量は少なくなります。 反対に、追加の次および前の参照要素を格納するため、リンクリストのメモリを増やす必要があります。
- さらに、メモリ使用率がアレイ内で非効率的です。 逆に、メモリ使用率はアレイ内で効率的です。
結論
配列リストとリンクリストは、データ構造の種類、アクセス方法、操作方法、メモリ要件、および使用率が異なります。 そして、その実装に対して特別な長所と短所があります。 したがって、必要に応じてどちらでも使用できます。