1.単一リンクリスト:線形リストのチェーンストレージ。
1)機能:任意のストレージユニットのセットを使用してデータ要素を格納し(ストレージユニットは連続的または不連続にすることができます)、論理的に隣接する要素のストレージ位置は必ずしも隣接していません。
2)ノードには2つのフィールドが含まれます。データフィールド(データ要素情報を格納)とポインターフィールド(直接の後続ストレージの場所を格納)です。
3)ポインターまたはチェーン:ポインターフィールドに格納されている情報。
2.ヘッドポインター:リンクリストの最初のノードの格納場所リンクリスト全体へのアクセスは、ヘッドポインターから開始する必要があります。
3.ヘッドノード:単一リンクリストの最初のノードの前にノードが接続され、そのデータフィールドには情報が格納されない場合がありますが、追加情報が格納される場合があります。ポインターフィールドが空の場合、線形テーブルは空のテーブルです。
ヘッドノードを導入する利点:
1)リンクリストの最初の位置での操作を、リストの他の位置での操作と一致させます。
2)空のテーブルと空でないテーブルの処理は一貫しています。
4.単一リンクリストのノードのタイプ
typedef struct LNode {
int data;
struct LNode * next;
} LNode、*リンクリスト;
5.
単一リンクリストLNode * s、* p、* q;
Linklist L;
int i、temp;
1)ノードのコードフラグメントを挿入します。
p = GetElem(L、i-1);
s-> next = p-> next;
p-> next = s;
2)* sノードを* pの前のコードフラグメントに挿入すると、時間の複雑さはO( 1)。
s-> next = p-> next;
p-> next = s;
temp = p-> data;
p-> data = s-> data;
s-> data = temp;
3)ノードのコードフラグメントを削除し、 、時間の複雑さはO(n)です。
p = GetElem(L、i-1);
q = p-> next;
p-> next = q-> next;
free(q);
4)ノードを削除* p、時間の複雑さはO(1)。
q = p->次;
p->データ= p->次- >データ;
p->次= q->次;
フリー(q);
6.ヘッド挿入メソッドを使用して単一リンクリストを確立し、テーブルの末尾からテーブルのヘッドに逆方向に単一リンクリストLを確立し、毎回ヘッドノードの後に要素を挿入します。時間の複雑さはO(n)です。
Linklist list_headinsert(Linklist&L)
{
LNode * s;
int x;
L =(Linklist)malloc(sizeof(LNode));
L-> data = NULL;
scanf( "%d"、&x);
while(x!= 9999 )
{
s =(LNode *)malloc(sizeof(LNode));
s-> data = x;
s-> next = L-> next;
L-> next = s;
scanf( "%d"、&x);
}
return L;
}
7.末尾補間を使用して、単一リンクリストを作成します。テーブルの最後からテーブルの先頭まで、単一リンクリストが順方向に確立されます。毎回、要素がテーブルの最後に挿入され、時間の複雑度はO(n)です。
Linklist List_tailinsert(Linklist&L)
{
int x;
L =(Linklist)malloc(sizeof(LNode));
LNode * s、* r = L; // rはテーブルの終わりのポインターです。
scanf( "%d"、&x);
s =(LNode *)malloc(sizeof(LNode));
s-> data = x;
r-> next = s;
r = s;
scanf( "%d"、&x);
}
r-> next = NULL;
return L;
}
8.シリアル番号に従ってノードの値を検索し、一重リンクリストLのi番目の位置にあるノードポインターを取り出します。時間の複雑さはO(n)です。
LNode * GetElem(Linklist L、int i)
{
int j = 1;
LNode * p = L-> next;
if(i == 0)
{
return L;
}
if(i <1)
{
return NULL;
}
while( p && j <i)
{
p = p-> next;
j ++;
}
return p;
}
9.単一リンクリストLでデータフィールド値のノードポインターを見つけ、eに等しいL、時間の複雑さはO(n )。
LNode * LocateElem(リンクリストL、int e)
{
LNode * p = L-> next;
while(p!= NULL && p-> data!= e)
{
p = p-> next;
}
pを返します。
}
10.テーブルの長さを見つけ、時間の複雑さはO(n)です。
int listlength(LNode * p)
{
int len = 0;
while(p-> next!= NULL)
{
len ++;
p = p-> next;
}
return len;
}
11.循環単一リンクリスト:テーブルの最後のノードのポインターは、ヘッドノードを指します。
1)空の状態の判定:ヘッドノードのポインタがヘッドポインタを指している。
2)テーブルの最後で動作するようにヘッドポインターを設定します。時間の複雑さはO(n)です。
3)テールポインターをテーブルのテールとヘッドで動作するように設定します。時間の複雑さはO(1)です。
12.二重リンクリストノードには2つのポインターフィールドが含まれ、1つは先行ノードを指し、もう1つは後続ノードを指します。
13.二重リンクリストノードタイプ
typedef struct DNode {
int data;
struct DNode * previous、* next;
} DNode、* DLinklist;
14.二重リンクリスト
DNode * m、* k;
1)O(1)の時間複雑度を持つ操作セグメントを挿入します。
m->次= k->次; k->次-
>前= m;
m->前= k;
k->次= m;
2)操作セグメントを削除します。時間の複雑さはO(1)です。
m->次= k->次; k->次-
>前= m;
自由(k);
15.静的リンクリスト:配列を使用して、線形テーブルのチェーンストレージ構造を記述します。ポインターは、ノードの相対アドレス(配列添え字)であり、カーソルとも呼ばれます。
16.静的リンクリストの構造タイプ
#define maxsize 50
typedef struct {
int data;
int next;
} slinklist [maxsize];