Document

2005年度
データ構造とアルゴリズム
第4回
「再帰的データ構造:リスト構造」
西尾 信彦 [email protected]
立命館大学情報理工学部
情報システム学科
typedefを覚えよう
•
•
•
•
自分でデータ型の名前をつけられる
struct xxxxxは長たらしい
typedef 既存の型名 新しい型名;
例えば、
– typedef struct _student student;
– typedef struct _list {
struct _list *next;
int data;
} *list, listelem;
リストの先頭と最後
• 先頭要素を指すポインタが必要
• リストの最後の要素はどこを指す?
– どこも指さない NULL
– 自分を指す
– (ダミーの)先頭要素を指す
リストへの要素の挿入と削除
• どちらもポインタを指し換えにより実現
• リストと対象要素を与えられて処理する
– それだけでは済まない
– 一つ前の要素も書き換えないと
• どこに入れるかで変わる処理
– 先頭かそれ以外で処理が違うのが気持ち悪い
– ダミーの先頭要素を用意すると解消する
二重リンクされたリスト
• 次の要素を指すだけでなく、前の要素も指
す
• 挿入や削除が対象要素だけでできる
• 処理は倍の手間
• 両端はどうする?
– ともにNULL
– 両端をつなげて循環リスト
リストで実現するデータ構造
• スタック
– LIFO Last In First Out
• キュー
– FIFO First In First Out
• デク DEQ
– Double Ended Queue
スタック
•
•
•
•
•
LIFOのデータ構造
Push:スタックに1つデータを積む
Pop:スタックから1つデータを取り出す
Top:スタックの一番上にあるデータを見る
スタックのデータ構造
– リストそのもの
• スタックへの操作を上記の3つに制限する
ことによってリストでスタックを実現する
キュー
• 待ち行列を表現するデータ構造
• FIFO 最初に並んだ人が最初にサービスさ
れる
• Empty:キューが空かどうか見る
• Enqueue:キューに1つデータを追加する
• Dequeue:キューから1つデータを取り出す
• Peek:キューの先頭のデータを見る
デク DEQ
• 先頭にも最後にもデータを追加、取り出し
できるデータ構造
– 二重リンクされたリストで作成
•
•
•
•
Unshift:リストの先頭にデータを追加
Push:リストの末尾にデータを追加
Shift:リストの先頭からデータを取り出す
Pop:リストの末尾からデータを取り出す