Pythonデータ構造とアルゴリズムのチェーンテーブル定義と用法例詳しく【単一チェーンテーブル、循環チェーンテーブル】

4002 ワード

この例では、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プログラムの設計に役立つことを願っています.