Pythonデータ構造とアルゴリズムのチェーンテーブル定義と用法例詳しく【単一チェーンテーブル、循環チェーンテーブル】
4002 ワード
この例では、Pythonデータ構造とアルゴリズムのチェーンテーブルの定義と使い方について説明します.皆さんの参考にしてください.具体的には以下の通りです.
ここでは、以下の説明を行います.
(1)チェーンテーブルノードの定義からクラス方式で,オブジェクト向けの考え方でチェーンテーブルの設計を行う.
(2)チェーンテーブルクラス挿入や削除などのメンバ関数を実現する際に考慮すべき境界条件,prepend(ヘッダ挿入),pop(ヘッダ削除),append(テール挿入),pop_Last(末尾削除)
2.1挿入:
空のチェーンテーブルのチェーンテーブルの長さは1で末尾に挿入されます
2.2削除
空のチェーンテーブルのチェーンテーブルの長さは1で末尾の要素を削除します
(3)単一チェーンテーブルから単一チェーンテーブルへのバリエーション:
エンドノード付き単一チェーンテーブルループ単一チェーンテーブルデュアルチェーンテーブル
1.チェーンテーブルノードの定義
2.単一チェーンテーブルの実現
挿入、削除の実装、および考慮すべき境界条件を重点的に理解します.
簡単なまとめ:
(0)p.nextにアクセスできる.nextの前提はp.nextが空でないことです.(1)末尾挿入,チェーンテーブルが空でない場合,末尾ノードのポインタを必要とし,変更するだけである.(2)末尾削除,チェーンテーブル長が空でない場合,最後から2番目のノードのポインタのみを変更する必要がある.
単一チェーンテーブルの単純な変形:テールノードを持つ単一チェーンテーブル
頭の挿入、尾の挿入、尾の削除だけを書き直す必要があります.
単一チェーンテーブルのバリエーションたんれんされーぶるのへんたい:循環単一チェーンテーブルじゅんかんたんれんさーぶる
Pythonに関する詳細は、「Pythonデータ構造とアルゴリズムチュートリアル」、「Python Socketプログラミングテクニックまとめ」、「Python関数使用テクニックまとめ」、「Python文字列操作テクニックまとめ」、「Python入門と進級クラシックチュートリアル」、「Pythonファイルとディレクトリ操作テクニックまとめ」のトピックを参照してください.
ここではPythonプログラムの設計に役立つことを願っています.
ここでは、以下の説明を行います.
(1)チェーンテーブルノードの定義からクラス方式で,オブジェクト向けの考え方でチェーンテーブルの設計を行う.
(2)チェーンテーブルクラス挿入や削除などのメンバ関数を実現する際に考慮すべき境界条件,prepend(ヘッダ挿入),pop(ヘッダ削除),append(テール挿入),pop_Last(末尾削除)
2.1挿入:
空のチェーンテーブルのチェーンテーブルの長さは1で末尾に挿入されます
2.2削除
空のチェーンテーブルのチェーンテーブルの長さは1で末尾の要素を削除します
(3)単一チェーンテーブルから単一チェーンテーブルへのバリエーション:
エンドノード付き単一チェーンテーブルループ単一チェーンテーブルデュアルチェーンテーブル
1.チェーンテーブルノードの定義
class LNode:
def __init__(self, elem, next_=None):
self.elem = elem
self.next = next_
2.単一チェーンテーブルの実現
挿入、削除の実装、および考慮すべき境界条件を重点的に理解します.
class LinkedListUnderflow(ValueError):
pass
class LList:
def __init__(self):
self._head = None
def is_empty(self):
return self._head is None
def prepend(self, elem):
self._head = LNode(elem, self._head)
def pop(self):
if self._head is None:
raise LinkedListUnderflow('in pop')
e = self._head.elem
self._head = self._head.next
return e
def append(self, elem):
if self._head is None:
self._head = LNode(elem)
return
p = self._head
while p.next is not None:
p = p.next
p.next = LNode(elem)
def pop_last(self):
if self._head is None:
raise LinkedListUnderflow('in pop_last')
p = self._head
if p.next is None:
e = p.elem
self._head = None
return e
while p.next.next is not None:
p = p.next
e = p.next.elem
p.next = None
return e
簡単なまとめ:
(0)p.nextにアクセスできる.nextの前提はp.nextが空でないことです.(1)末尾挿入,チェーンテーブルが空でない場合,末尾ノードのポインタを必要とし,変更するだけである.(2)末尾削除,チェーンテーブル長が空でない場合,最後から2番目のノードのポインタのみを変更する必要がある.
単一チェーンテーブルの単純な変形:テールノードを持つ単一チェーンテーブル
class LList1(LList):
def __init__(self):
LList.__init__(self)
self._rear = None
...
頭の挿入、尾の挿入、尾の削除だけを書き直す必要があります.
def prepend(self, elem):
if self._head is None:
self._head = LNode(elem)
self._rear = self._head
else:
self._head = LNode(elem, self._head)
def append(self, elem):
if self._head is None:
self._head = LNode(elem)
self._rear = self._head
else:
self._rear.next = LNode(elem)
self._rear = self._rear.next
def pop_last(self):
if self._head is None:
raise LinkedListUnderflow('in pop_last')
p = self._head
if p.next is None:
e = p.elem
self._head = None
return e
while p.next.next is not None:
p = p.next
e = p.next.elem
self._rear = p
p.next = None
return e
単一チェーンテーブルのバリエーションたんれんされーぶるのへんたい:循環単一チェーンテーブルじゅんかんたんれんさーぶる
class LCList:
def __init__(self):
self._rear = None
def prepend(self, elem):
if self._rear is None:
self._rear = LNode(elem)
self._rear.next = self._rear
else:
self._rear.next = LNode(elem, self._rear.next)
def append(self, elem):
self.prepend(elem)
self_rear = self._rear.next
def pop(self):
if self._rear is None:
raise LinkedListUnderflow('in pop')
p = self._rear.next
if p is None:
self._rear = None
else:
self._rear.next = p.next
return p.elem
def printall(self):
if self._rear is None:
raise ...
p = self._rear.next
while True:
print(p.elem)
if p is self._rear:
break
p = p.next
Pythonに関する詳細は、「Pythonデータ構造とアルゴリズムチュートリアル」、「Python Socketプログラミングテクニックまとめ」、「Python関数使用テクニックまとめ」、「Python文字列操作テクニックまとめ」、「Python入門と進級クラシックチュートリアル」、「Pythonファイルとディレクトリ操作テクニックまとめ」のトピックを参照してください.
ここではPythonプログラムの設計に役立つことを願っています.