アルゴリズムと データ構造

33
アアアアアアア アアアアア ア 13 ア アアアアア

Upload: shalom

Post on 23-Jan-2016

57 views

Category:

Documents


0 download

DESCRIPTION

アルゴリズムと データ構造. 第 13 回 線形リスト. 線形リスト. リスト データが順序付けて並べられたデータ構造 最も単純なもの:線形リスト、連結リスト 単連結リスト、単方向リスト、一方向リストとも ノード(要素) 線形リスト上の個々のデータ 最初のノードは先頭ノード、最後のノードは末尾ノード 1 つ前のノードは先行ノード、 1 つ後のノードは後続ノード. 線形リスト. 線形リストの実現(配列版) 実現方法 用意した配列の先頭からデータを順次格納 後続ノードへの着目は添え字をインクリメント 問題点 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: アルゴリズムと データ構造

アルゴリズムとデータ構造

第 13 回線形リスト

Page 2: アルゴリズムと データ構造

線形リスト リスト

データが順序付けて並べられたデータ構造最も単純なもの:線形リスト、連結リスト

単連結リスト、単方向リスト、一方向リストともノード(要素)

線形リスト上の個々のデータ 最初のノードは先頭ノード、最後のノードは末尾ノード 1 つ前のノードは先行ノード、 1 つ後のノードは後続ノ

ード

Page 3: アルゴリズムと データ構造

線形リスト 線形リストの実現(配列版)

実現方法 用意した配列の先頭からデータを順次格納 後続ノードへの着目は添え字をインクリメント

問題点 データを挿入・削除する際、配列内の要素ブロック

を移動する必要あり あらかじめ用意した配列の要素数以上のデータは格

納できない

Page 4: アルゴリズムと データ構造

ポインタによる線形リスト 実現方法

本来のデータと、次のノードを示すポインタを用意

自分自身と同じ構造体型を指すポインタを含む構造体:自己参照構造体

データが追加される時点で動的にデータ格納用構造体を確保

確保した構造体を、次のノードを示すポインタで指す

Page 5: アルゴリズムと データ構造

ポインタによる線形リスト 自己参照構造体によるノードtypedef struct __node {

Menber data; /* データを格納する構造体 */

struct __node *next; /* 後続ノードへのポインタ */

} Node;

・ 後続ノードがない場合、 next は NULL

Page 6: アルゴリズムと データ構造

ポインタによる線形リスト List 型構造体typedef struct {

Node *head; /* 先頭ノードへのポインタ */

Node *crnt; /* 現在着目中のノードへのポインタ */

} List;

・ head は必須、データがない場合 NULL

・ crnt は便宜上用意、なくてもよい

Page 7: アルゴリズムと データ構造

ポインタによる線形リスト ノードの探索

線形探索でデータを探索 先頭ノードから目的値を持つノードを探索 探索すべき値と等しい要素を持つノードを見つけた

ら探索成功 探索すべき値が見つからず末尾までいったら探索失

Page 8: アルゴリズムと データ構造

ポインタによる線形リスト ノードの探索

A

・N

・H

B

・N

C

・N

D

・N

E

・N

C を探索: G 成功失敗

Page 9: アルゴリズムと データ構造

ポインタによる線形リスト 先頭へのノードの挿入

新規ノードを生成後、ポインタの付け替え1. 現先頭ノードのポインタを保存2. 新規ノードを先頭ノードへ3. 新規ノードの後続ノードを、保存してあったポイ

ンタで置き換え

Page 10: アルゴリズムと データ構造

ポインタによる線形リスト 先頭へのノードの挿入

A

・N

・H

B

・N

C

・N

D

・N

E

・N

G

・N ・P

Page 11: アルゴリズムと データ構造

ポインタによる線形リスト 末尾へのノードの挿入

新規ノードを生成後、ポインタの付け替え1. head が NULL (データなし)なら先頭にノード挿

入2. head から、後続ノード( next )がない

( NULL )ノードまで探索3. 新規ノードを生成し、探索したノードの後続ノー

ドに接続

Page 12: アルゴリズムと データ構造

ポインタによる線形リスト 末尾へのノードの挿入

A

・N

・H

B

・N

C

・N

D

・N

E

・N

G

・N・P

Page 13: アルゴリズムと データ構造

ポインタによる線形リスト 先頭ノードの削除

先頭ノードを、先頭の後続ノードへ1. 現先頭ノードの後続ノードへのポインタを保存2. 先頭ノードを削除3. 保存してあったポインタを先頭ノードとして置き

換え

Page 14: アルゴリズムと データ構造

ポインタによる線形リスト 先頭ノードの削除

A

・N

・H

B

・N

C

・N

D

・N

E

・N

・P

Page 15: アルゴリズムと データ構造

ポインタによる線形リスト 末尾ノードの削除

末尾ノードの先行ノードに、後続ノードがない状態に1. ノードが 1 つだけなら先頭ノードの削除処理2. 末尾から 2 番目のノードを探索3. 末尾ノードを削除4. 末尾から 2 番目の後続ノード( next )をなし

( NULL )に更新

Page 16: アルゴリズムと データ構造

ポインタによる線形リスト 末尾ノードの削除

A

・N

・H

B

・N

C

・N

D

・N

E

・N

・Ptr・Pre

Page 17: アルゴリズムと データ構造

ポインタによる線形リスト 着目ノードの削除

着目ノードの先行ノードの後続ノードを、着目ノードの後続ノードに付け替え1. ノードが 1 つだけなら先頭ノードの削除処理2. 着目ノードの先行ノードを探索3. 探索したノードの後続ノードを着目ノードの後続

ノードに更新4. 着目ノードを削除

Page 18: アルゴリズムと データ構造

ポインタによる線形リスト 着目ノードの削除

A

・N

・H

B

・N

C

・N

D

・N

E

・N

・Ptr

Page 19: アルゴリズムと データ構造

ポインタによる線形リスト 全ノードの削除

線形リストが空になるまで先頭要素の削除の繰り返し

全ノードの表示先頭ノードから順に内容表示後続ノードがなくなったら終了

Page 20: アルゴリズムと データ構造

カーソルによる線形リスト 実現方法

配列を利用し、後続ノードが格納されている配列内の位置(添え字)を記憶:カーソル

カーソルを追うことで後続ノードをたどる カーソルが -1 になったら後続ノードなし

要素の追加や削除に伴う配列要素の移動不要 カーソルを付け替えることで追加や削除を実現

Page 21: アルゴリズムと データ構造

カーソルによる線形リスト カーソルによる線形リストの実現

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

Page 22: アルゴリズムと データ構造

カーソルによる線形リスト 配列内の空き要素

削除に伴う問題点 要素の削除があると、その部分の配列要素は未使

用 頻繁に削除が行われると配列がスカスカに

Page 23: アルゴリズムと データ構造

カーソルによる線形リスト 削除に伴う問題点

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

Page 24: アルゴリズムと データ構造

カーソルによる線形リスト フリーリスト

削除に伴い配列がスカスカになるのを防止削除が行われた際、削除された要素の添え字

を線形リストで管理:フリーリスト フリーリスト用の先頭ノードを用意( deleted ) 各ノードに、フリーリスト上の後続ノードも持た

せる( Dnext )挿入の際、フリーリストから使用

Page 25: アルゴリズムと データ構造

カーソルによる線形リスト フリーリスト

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

データの挿入データの削除

Page 26: アルゴリズムと データ構造

循環・重連結リスト 循環リスト

線形リストの末尾ノードが先頭ノードを指すリスト

重連結(双方向)リスト後続ノードへのポインタだけでなく、先行ノード

へのポインタも備えたリスト 循環・重連結リスト

循環リストと重連結リストの両方を併せ持つリスト

Page 27: アルゴリズムと データ構造

循環・重連結リスト 循環・重連結リストの実現

実現方法 本来のデータと、先行ノード、後続ノードを示す 2

つのポインタを備えたノードを用意リストの初期化

データがなくてもダミーとして 1 つノードを作成 ノードの追加や削除を円滑に行うため

Page 28: アルゴリズムと データ構造

循環・重連結リスト 循環・重連結リストの実現

ノードの探索 線形探索でデータを探索

ダミーノードの次のノードから目的値を持つノードを探索 探索すべき値と等しい要素を持つノードを見つけたら探索

成功 探索すべき値が見つからずダミーノードまで戻ったら探索

失敗

Page 29: アルゴリズムと データ構造

循環・重連結リスト 循環・重連結リストの実現ノードの探索

(ダミー)・N

・H

A

・N

B

・N

C

・N

D

・N

B を探索: G 成功失敗

・ P ・ P ・ P ・ P ・ P

Page 30: アルゴリズムと データ構造

循環・重連結リスト 循環・重連結リストの実現

ノードの挿入 新規ノードと、挿入すべき前後のノードでポインタ

の付け替え( 4 つ)先頭へのノードの挿入

ダミーノードの直後へノードを挿入末尾へのノードの挿入

ダミーノードの直前へノードを挿入

Page 31: アルゴリズムと データ構造

循環・重連結リスト 循環・重連結リストの実現ノードの挿入

A

・N

B

・N

C

・N

・ P ・ P ・ P

G

・N

・ P

Page 32: アルゴリズムと データ構造

循環・重連結リスト 循環・重連結リストの実現

ノードの削除 削除するノードの記憶域を開放し、前後のポインタ

を適宜付け替え先頭ノードの削除

ダミーノードの直後のノードを削除末尾ノードの削除

ダミーノードの直前のノードを削除

Page 33: アルゴリズムと データ構造

循環・重連結リスト 循環・重連結リストの実現ノードの削除

A

・N

B

・N

C

・N

・ P ・ P ・ P