レッスン11 - 二重リンクリスト
1.制限の単一のリスト
(1)単一リンクリストノードの次のノードポインタに一点のみ。
(2)データ要素の単一のリストを直接その前駆要素にアクセスすることができません。
lは要素の単一のリストは、非常に時間のかかる操作でアクセスをリバース!
LEN = LinkList_Length(リスト)。
以下のための(I = lenの-1; LEN> = 0; I--)
{
LinkListNode * P = LinkList_Get(リスト、I);
//要素のpのデータ要素にアクセスします
}
二重リンクリストの2の定義
その前の前駆症状を指す単一のリストポインタを追加するノードで。
3.二重にリンクされたリストは、すべての操作の単一のリストを持っています
(1)リストを作成します。
(2)リストの破壊。
(3)リストの長さを取得します。
(4)クリアリスト。
(5)第一の操作要素POSを得ます。
(6)位置posに要素を挿入します。
(7)位置pを削除します。
4.双方向リンクリスト挿入
電流 - >次=ノード。
ノード - >次=次回。
ネクスト>予備=ノード。
ノード - >前=現在;
5.二重にリンクされたリストの削除
電流>次=次回。
ネクスト> =現在;
6.新しいオペレーティング・二重リンクリスト
(1)カーソルデータ要素の現在のポイントを得ます。
(2)リストの最初のデータ要素にカーソルポイントをリセットします。
(3)リストの次のデータ要素を指すようにカーソルを移動します。
(4)データ要素のリンクされたリストを指すようにカーソルを移動します。
(5)を直接リストを削除するデータ要素を指定します。
DLinkListNode * DLinkList_DeleteNode(DLinkList *リスト、DLinkListNode *ノード)。
DLinkListNode * DLinkList_Reset(DLinkList *リスト)。
DLinkListNode * DLinkList_Current(DLinkList *リスト)。
DLinkListNode * DLinkList_Next(DLinkList *リスト)。
DLinkListNode * DLinkList_Pre(DLinkList *リスト)。
DLinkList.h
#ifndefの_DLINKLIST_H_
#define _DLINKLIST_H_
空DLinkListのtypedef。
typedefは構造体_tag_DLinkListNode DLinkListNode。
構造体_tag_DLinkListNode
{
DLinkListNode *次の;
DLinkListNode *のために、
}。
DLinkList * DLinkList_Create();
空DLinkList_Destroy(DLinkList *リスト)。
DLinkList_Clear(DLinkList *リスト)を無効に。
int型DLinkList_Length(DLinkList *リスト)。
int型DLinkList_Insert(DLinkList *リスト、DLinkListNode *ノード、int型のPOS);
DLinkListNode * DLinkList_Get(DLinkList *リスト、int型のPOS);
DLinkListNode * DLinkList_Delete(DLinkList *リスト、int型のPOS);
DLinkListNode * DLinkList_DeleteNode(DLinkList *リスト、DLinkListNode *ノード)。
DLinkListNode * DLinkList_Reset(DLinkList *リスト)。
DLinkListNode * DLinkList_Current(DLinkList *リスト)。
DLinkListNode * DLinkList_Next(DLinkList *リスト)。
DLinkListNode * DLinkList_Pre(DLinkList *リスト)。
#endifの
DLinkList.c
書式#include <stdio.hに>
書式#include <malloc.hを>
#include "DLinkList.h"
typedefは構造体_tag_DLinkList
{
DLinkListNodeヘッダ。
DLinkListNode *スライダー。
int型の長さ。
} TDLinkList。
DLinkList * DLinkList_Create()// O(1)
{
TDLinkList * RET =(TDLinkList *)はmalloc(はsizeof(TDLinkList))。
(RET!= NULL)の場合
{
ret->長さ= 0。
ret-> header.next = NULL;
ret-> header.pre = NULL;
方向>スライダー= NULL;
}
右を返します。
}
空DLinkList_Destroy(DLinkList *リスト)// O(1)
{
無料(リスト);
}
空DLinkList_Clear(DLinkList *リスト)// O(1)
{
TDLinkList * SLIST =(TDLinkList *)リスト。
(SLIST!= NULL)の場合
{
sList->長さ= 0。
sList-> header.next = NULL;
sList-> header.pre = NULL;
sList->スライダー= NULL;
}
}
int型DLinkList_Length(DLinkList *リスト)// O(1)
{
TDLinkList * SLIST =(TDLinkList *)リスト。
int型RET = -1;
(SLIST!= NULL)の場合
{
RET = sList->長さ。
}
右を返します。
}
int型DLinkList_Insert(DLinkList *リスト、DLinkListNode *ノード、int型のPOS)// O(n)は、
{
TDLinkList * SLIST =(TDLinkList *)リスト。
int型RET =(!SLIST = NULL)&&(POS> = 0)&&(ノード= NULL!)。
int型私= 0;
(RET)の場合
{
DLinkListNode *電流=(DLinkListNode *)SLIST。
DLinkListNode *次回= NULL;
(I = 0;(私は<POSを)&&(電流 - >次= NULL);!私は++)のために
{
現在=の電流>次。
}
次の=の電流>次。
電流 - >次=ノード。
ノード - >次=次回。
(次回!= NULL)の場合
{
ネクスト>予備=ノード。
}
ノード - >前=現在;
(sList->長さ== 0)場合
{
ノード - >前= NULL;
sList->スライダー=ノード。
}
sList->長++;
}
右を返します。
}
DLinkListNode * DLinkList_Get(DLinkList *リスト、int型のPOS)// O(n)は、
{
TDLinkList * SLIST =(TDLinkList *)リスト。
DLinkListNode *右= NULL;
int型私= 0;
もし((SLIST!= NULL)&&(0 <= POS)&&(POS <sList->長))
{
DLinkListNode *電流=(DLinkListNode *)SLIST。
用(i = 0; iはPOSを<; iは++)
{
現在=の電流>次。
}
RET =の電流>次。
}
右を返します。
}
DLinkListNode * DLinkList_Delete(DLinkList *リスト、int型のPOS)// O(n)は、
{
TDLinkList * SLIST =(TDLinkList *)リスト。
DLinkListNode *右= NULL;
int型私= 0;
もし((SLIST!= NULL)&&(0 <= POS)&&(POS <sList->長))
{
DLinkListNode *電流=(DLinkListNode *)SLIST。
DLinkListNode *次回= NULL;
用(i = 0; iはPOSを<; iは++)
{
現在=の電流>次。
}
RET =の電流>次。
次回= ret->次。
電流>次=次回。
(次回!= NULL)の場合
{
ネクスト>前=現在;
もし(現在==(DLinkListNode *)SLIST)
{
ネクスト>前= NULL;
}
}
もし(sList-> ==右のスライダ)
{
sList->スライダー=次回。
}
sList-> length--。
}
右を返します。
}
DLinkListNode * DLinkList_DeleteNode(DLinkList *リスト、DLinkListNode *ノード)
{
TDLinkList * SLIST =(TDLinkList *)リスト。
DLinkListNode *右= NULL;
int型私= 0;
(SLIST!= NULL)の場合
{
DLinkListNode *電流=(DLinkListNode *)SLIST。
(; I <sList->長さ; I ++はI = 0)のための
{
IF(電流 - >次==ノード)
{
RET =の電流>次。
ブレーク;
}
現在=の電流>次。
}
(RET!= NULL)の場合
{
DLinkList_Delete(SLIST、I);
}
}
右を返します。
}
DLinkListNode * DLinkList_Reset(DLinkList *リスト)
{
TDLinkList * SLIST =(TDLinkList *)リスト。
DLinkListNode *右= NULL;
(SLIST!= NULL)の場合
{
sList->スライダー= sList-> header.next。
K = sList->スライダー。
}
右を返します。
}
DLinkListNode * DLinkList_Current(DLinkList *リスト)
{
TDLinkList * SLIST =(TDLinkList *)リスト。
DLinkListNode *右= NULL;
(SLIST!= NULL)の場合
{
K = sList->スライダー。
}
右を返します。
}
DLinkListNode * DLinkList_Next(DLinkList *リスト)
{
TDLinkList * SLIST =(TDLinkList *)リスト。
DLinkListNode *右= NULL;
もし((SLIST!= NULL)&&(sList->スライダー!= NULL))
{
K = sList->スライダー。
sList->スライダー= ret->次。
}
右を返します。
}
DLinkListNode * DLinkList_Pre(DLinkList *リスト)
{
TDLinkList * SLIST =(TDLinkList *)リスト。
DLinkListNode *右= NULL;
もし((SLIST!= NULL)&&(sList->スライダー!= NULL))
{
K = sList->スライダー。
sList->方向スライダー=>前;
}
右を返します。
}
main.cの
書式#include <stdio.hに>
書式#include <stdlib.h>に含ま
#include "DLinkList.h"
/ * / *コンソールpauserを使用してこのプログラムを実行したり、独自のgetchは、システム(「一時停止」)、または入力ループを追加
構造体の値
{
DLinkListNodeヘッダ。
テレビで;
}。
(int型ARGC、チャー*のARGV [])INT主
{
int型私= 0;
DLinkList *リスト= DLinkList_Create();
構造体バリュー* PV = NULL;
構造体の値V1、
構造体の値V2。
構造体の値V3。
構造体の値V4。
構造体の値V5;
v1.v = 1。
v2.v = 2。
v3.v = 3。
v4.v = 4。
v5.v = 5;
DLinkList_Insert(リスト、(DLinkListNode *)&V1、DLinkList_Length(リスト));
DLinkList_Insert(リスト、(DLinkListNode *)&V2、DLinkList_Length(リスト));
DLinkList_Insert(リスト、(DLinkListNode *)&V3、DLinkList_Length(リスト));
DLinkList_Insert(リスト、(DLinkListNode *)&V4、DLinkList_Length(リスト));
DLinkList_Insert(リスト、(DLinkListNode *)&V5、DLinkList_Length(リスト));
以下のための(I = 0; i)がDLinkList_Length(リスト<;私は++します)
{
PV =(構造体バリュー*)DLinkList_Get(リスト、I);
printf( "%d個の\ n" は、PV-> V);
}
printf( "\ n")を。
DLinkList_Delete(リスト、DLinkList_Length(リスト)-1)。
DLinkList_Delete(リスト、0);
以下のための(I = 0; i)がDLinkList_Length(リスト<;私は++します)
{
PV =(構造体バリュー*)DLinkList_Next(リスト);
printf( "%d個の\ n" は、PV-> V);
}
printf( "\ n")を。
DLinkList_Reset(リスト);
DLinkList_Next(リスト);
PV =(構造体バリュー*)DLinkList_Current(リスト);
printf( "%d個の\ n" は、PV-> V);
DLinkList_DeleteNode(リスト、(DLinkListNode *)PV)。
PV =(構造体バリュー*)DLinkList_Current(リスト);
printf( "%d個の\ n" は、PV-> V);
DLinkList_Pre(リスト);
PV =(構造体バリュー*)DLinkList_Current(リスト);
printf( "%d個の\ n" は、PV-> V);
printf( "長さ:%dは\ nを"、DLinkList_Length(リスト));
DLinkList_Destroy(リスト);
0を返します。
}
概要
前任者に単一のリストポインタ点に基づいて、L二重連結リストが増加しました。
L関数は、二重リンクリストは完全に単一のリストの使用を置き換えることができます。
L循環リスト次に、予備動作が効率的と電流とすることができます。
リスト内のすべての要素をトラバースリットル。