Upload
shalom
View
57
Download
0
Embed Size (px)
DESCRIPTION
アルゴリズムと データ構造. 第 13 回 線形リスト. 線形リスト. リスト データが順序付けて並べられたデータ構造 最も単純なもの:線形リスト、連結リスト 単連結リスト、単方向リスト、一方向リストとも ノード(要素) 線形リスト上の個々のデータ 最初のノードは先頭ノード、最後のノードは末尾ノード 1 つ前のノードは先行ノード、 1 つ後のノードは後続ノード. 線形リスト. 線形リストの実現(配列版) 実現方法 用意した配列の先頭からデータを順次格納 後続ノードへの着目は添え字をインクリメント 問題点 - PowerPoint PPT Presentation
Citation preview
アルゴリズムとデータ構造
第 13 回線形リスト
線形リスト リスト
データが順序付けて並べられたデータ構造最も単純なもの:線形リスト、連結リスト
単連結リスト、単方向リスト、一方向リストともノード(要素)
線形リスト上の個々のデータ 最初のノードは先頭ノード、最後のノードは末尾ノード 1 つ前のノードは先行ノード、 1 つ後のノードは後続ノ
ード
線形リスト 線形リストの実現(配列版)
実現方法 用意した配列の先頭からデータを順次格納 後続ノードへの着目は添え字をインクリメント
問題点 データを挿入・削除する際、配列内の要素ブロック
を移動する必要あり あらかじめ用意した配列の要素数以上のデータは格
納できない
ポインタによる線形リスト 実現方法
本来のデータと、次のノードを示すポインタを用意
自分自身と同じ構造体型を指すポインタを含む構造体:自己参照構造体
データが追加される時点で動的にデータ格納用構造体を確保
確保した構造体を、次のノードを示すポインタで指す
ポインタによる線形リスト 自己参照構造体によるノードtypedef struct __node {
Menber data; /* データを格納する構造体 */
struct __node *next; /* 後続ノードへのポインタ */
} Node;
・ 後続ノードがない場合、 next は NULL
ポインタによる線形リスト List 型構造体typedef struct {
Node *head; /* 先頭ノードへのポインタ */
Node *crnt; /* 現在着目中のノードへのポインタ */
} List;
・ head は必須、データがない場合 NULL
・ crnt は便宜上用意、なくてもよい
ポインタによる線形リスト ノードの探索
線形探索でデータを探索 先頭ノードから目的値を持つノードを探索 探索すべき値と等しい要素を持つノードを見つけた
ら探索成功 探索すべき値が見つからず末尾までいったら探索失
敗
ポインタによる線形リスト ノードの探索
A
・N
・H
B
・N
C
・N
D
・N
E
・N
C を探索: G 成功失敗
ポインタによる線形リスト 先頭へのノードの挿入
新規ノードを生成後、ポインタの付け替え1. 現先頭ノードのポインタを保存2. 新規ノードを先頭ノードへ3. 新規ノードの後続ノードを、保存してあったポイ
ンタで置き換え
ポインタによる線形リスト 先頭へのノードの挿入
A
・N
・H
B
・N
C
・N
D
・N
E
・N
G
・N ・P
ポインタによる線形リスト 末尾へのノードの挿入
新規ノードを生成後、ポインタの付け替え1. head が NULL (データなし)なら先頭にノード挿
入2. head から、後続ノード( next )がない
( NULL )ノードまで探索3. 新規ノードを生成し、探索したノードの後続ノー
ドに接続
ポインタによる線形リスト 末尾へのノードの挿入
A
・N
・H
B
・N
C
・N
D
・N
E
・N
G
・N・P
ポインタによる線形リスト 先頭ノードの削除
先頭ノードを、先頭の後続ノードへ1. 現先頭ノードの後続ノードへのポインタを保存2. 先頭ノードを削除3. 保存してあったポインタを先頭ノードとして置き
換え
ポインタによる線形リスト 先頭ノードの削除
A
・N
・H
B
・N
C
・N
D
・N
E
・N
・P
ポインタによる線形リスト 末尾ノードの削除
末尾ノードの先行ノードに、後続ノードがない状態に1. ノードが 1 つだけなら先頭ノードの削除処理2. 末尾から 2 番目のノードを探索3. 末尾ノードを削除4. 末尾から 2 番目の後続ノード( next )をなし
( NULL )に更新
ポインタによる線形リスト 末尾ノードの削除
A
・N
・H
B
・N
C
・N
D
・N
E
・N
・Ptr・Pre
ポインタによる線形リスト 着目ノードの削除
着目ノードの先行ノードの後続ノードを、着目ノードの後続ノードに付け替え1. ノードが 1 つだけなら先頭ノードの削除処理2. 着目ノードの先行ノードを探索3. 探索したノードの後続ノードを着目ノードの後続
ノードに更新4. 着目ノードを削除
ポインタによる線形リスト 着目ノードの削除
A
・N
・H
B
・N
C
・N
D
・N
E
・N
・Ptr
ポインタによる線形リスト 全ノードの削除
線形リストが空になるまで先頭要素の削除の繰り返し
全ノードの表示先頭ノードから順に内容表示後続ノードがなくなったら終了
カーソルによる線形リスト 実現方法
配列を利用し、後続ノードが格納されている配列内の位置(添え字)を記憶:カーソル
カーソルを追うことで後続ノードをたどる カーソルが -1 になったら後続ノードなし
要素の追加や削除に伴う配列要素の移動不要 カーソルを付け替えることで追加や削除を実現
カーソルによる線形リスト カーソルによる線形リストの実現
A
・N
B
・N
C
・N
D
・N
E
・N
A BC DE
-1 4 03 2
0 1 2 3 4 5 6 7
カーソルによる線形リスト 配列内の空き要素
削除に伴う問題点 要素の削除があると、その部分の配列要素は未使
用 頻繁に削除が行われると配列がスカスカに
カーソルによる線形リスト 削除に伴う問題点
A
・N
B
・N
C
・N
D
・N
E
・N
A BC DE
-1 4 03 2
0 1 2 3 4 5 6 7
33
カーソルによる線形リスト フリーリスト
削除に伴い配列がスカスカになるのを防止削除が行われた際、削除された要素の添え字
を線形リストで管理:フリーリスト フリーリスト用の先頭ノードを用意( deleted ) 各ノードに、フリーリスト上の後続ノードも持た
せる( Dnext )挿入の際、フリーリストから使用
カーソルによる線形リスト フリーリスト
B CEA D
46 0 -1 7
0 1 2 3 4 5 6 7
5 1 -1n
Dn
G
2h
3Dh
G
-1 3
1
4
7
1
データの挿入データの削除
循環・重連結リスト 循環リスト
線形リストの末尾ノードが先頭ノードを指すリスト
重連結(双方向)リスト後続ノードへのポインタだけでなく、先行ノード
へのポインタも備えたリスト 循環・重連結リスト
循環リストと重連結リストの両方を併せ持つリスト
循環・重連結リスト 循環・重連結リストの実現
実現方法 本来のデータと、先行ノード、後続ノードを示す 2
つのポインタを備えたノードを用意リストの初期化
データがなくてもダミーとして 1 つノードを作成 ノードの追加や削除を円滑に行うため
循環・重連結リスト 循環・重連結リストの実現
ノードの探索 線形探索でデータを探索
ダミーノードの次のノードから目的値を持つノードを探索 探索すべき値と等しい要素を持つノードを見つけたら探索
成功 探索すべき値が見つからずダミーノードまで戻ったら探索
失敗
循環・重連結リスト 循環・重連結リストの実現ノードの探索
(ダミー)・N
・H
A
・N
B
・N
C
・N
D
・N
B を探索: G 成功失敗
・ P ・ P ・ P ・ P ・ P
循環・重連結リスト 循環・重連結リストの実現
ノードの挿入 新規ノードと、挿入すべき前後のノードでポインタ
の付け替え( 4 つ)先頭へのノードの挿入
ダミーノードの直後へノードを挿入末尾へのノードの挿入
ダミーノードの直前へノードを挿入
循環・重連結リスト 循環・重連結リストの実現ノードの挿入
A
・N
B
・N
C
・N
・ P ・ P ・ P
G
・N
・ P
循環・重連結リスト 循環・重連結リストの実現
ノードの削除 削除するノードの記憶域を開放し、前後のポインタ
を適宜付け替え先頭ノードの削除
ダミーノードの直後のノードを削除末尾ノードの削除
ダミーノードの直前のノードを削除
循環・重連結リスト 循環・重連結リストの実現ノードの削除
A
・N
B
・N
C
・N
・ P ・ P ・ P