pythonバージョンのシングルチェーン表はコードを実現します。


今日はデータ構造の本を見ましたが、実はデータ構造には何種類もありません。線形表、配列、文字列、行列とスタックなどがあります。データ構造の理論は難しくないです。主に自分でこれらのデータ構造と対応する基本的な操作方法を書いてください。
このブログに線形表を書いてください。
線形表:順序表とチェーン表に分けられます。
一、順番表
順序表は表のデータに対して、住所も順番ですので、ランダムにアクセスできます。ただし、要素を挿入したり削除したりするときは、アドレスの連続性を満たすために、多くの要素位置を移動します。したがって、順序表の要素を挿入または削除する時間の複雑さはo(n)です。多くの場合、順序表を統合する際には、表の要素を先に並べ替えてから処理する必要があります。毎回最初から検索することは避けられます。
二、チェーン
チェーンは順序表のランダムアクセスの特徴を失ってしまいました。つまり毎回中から一つの要素を取って、初めから探し始めます。そうすると、時間がかかります。時間の複雑さはo(n)です。しかし、挿入と削除、二つのチェーンを連結する時に便利になりました。針を少しだけ修正すればいいです。
チェーンテーブルの各要素ノードは、データ部分と次のノードのポインタを含んでいます。一般的にチェーンの頭に先頭の結点が付いています。そして、頭の結点は普通はデータを保存しないで、長さなどの付加情報を保管しています。あるいは保存していません。
多くの言語にはポインタという概念がなく、行列の概念があります。例えば、javaとpython、javaの配列は定義配列のタイプを求めます。つまり、同じタイプのデータでなければなりません。pythonは要求されていません。だから、pythonのlistはチェーンの真正の意味にもっと近いです。この配列で記述された鎖は静的連鎖表と呼ばれている。静的チェーンを使って、このような言語に対してチェーンを記述するのはとても便利です。これらの言語はすべて内蔵類を提供してチェーンを処理しています。
このほかに、循環リンク表、双方向リンク表もあります。(前に検索できない問題を解決しましたが、針を修正する時はもっと多くの操作が必要です。)

# -*- coding=utf-8 -*-
#      Python      

class Node(object):
  def __init__(self, value, next=0):
    self.value = value
    self.next = next #   


class LinkedList(object):
  #        
  def __init__(self):
    self.head = 0 #   

  def __getitem__(self, key):
    if self.is_empty():
      print 'Linked list is empty.'
      return
    elif key < 0 or key > self.get_length():
      print 'The given key is wrong.'
      return
    else:
      return self.get_elem(key)

  def __setitem__(self, key, value):
    if self.is_empty():
      print 'Linked list is empty.'
      return
    elif key < 0 or key > self.get_length():
      print 'The given key is wrong.'
      return
    else:
      return self.set_elem(key, value)

  def init_list(self, data): #       data
    self.head = Node(data[0])
    p = self.head #        
    print p, self.head
    for i in data[1:]:
      p.next = Node(i) #            
      p = p.next #           
    print self.head.next.next

  def get_length(self):
    length = 0
    p = self.head
    while p != 0: # 0    Node       0  ,          ,       
      length += 1
      p = p.next
    return length

  def is_empty(self):
    if self.head == 0:
      return True
    else:
      return False

  def insert_node(self, index, value):
    if index < 0 or index > self.get_length():
      print 'Can not insert node into the linked list.'
    elif index == 0:
      temp = self.head
      self.head = Node(value, temp)
    else:
      p, post = self.head, self.head
      for i in xrange(index):
        post = p
        p = p.next
      temp = p
      post.next = Node(value, temp)

  def delete_node(self, index):
    if index < 0 or index > self.get_length()-1:
      print "Wrong index number to delete any node."
    elif self.is_empty():
      print "No node can be deleted."
    elif index == 0:
      temp = self.head
      self.head = temp.next
    elif index == self.get_length():
      p = self.head
      for i in xrange(self.get_length()-2):
        p = p.next
      p.next = 0
    else:
      p = self.head
      for i in xrange(index-1):
        p = p.next
      p.next = p.next.next

  def show_linked_list(self): #           
    if self.is_empty():
      print 'This is an empty linked list.'
    else:
      p, container = self.head, []
      for _ in xrange(self.get_length()-1):
        container.append(p.value)
        p = p.next
      container.append(p.value)
      print container

  def clear_linked_list(self): #      
    self.head = 0

  def get_elem(self, index):
    if self.is_empty():
      print "The linked list is empty. Can not get element."
    elif index < 0 or index > self.get_length()-1:
      print "Wrong index number to get any element."
    else:
      p = self.head
      for _ in xrange(index):
        p = p.next
      return p.value

  def set_elem(self, index, value):
    if self.is_empty():
      print "The linked list is empty. Can not set element."
    elif index < 0 or index > self.get_length()-1:
      print "Wrong index number to set element."
    else:
      p = self.head
      for _ in xrange(index):
        p = p.next
      p.value = value

  def get_index(self, value):
    p = self.head
    for i in xrange(self.get_length()):
      if p.value == value:
        return i
      else:
        p = p.next
    return -1


l = LinkedList()
print "The length of linked list now is: ", l.get_length()
print l.is_empty()
l.init_list([1, 5, 12, "fjd", 45, 999])
print "The length of linked list now is: ", l.get_length()
print l.is_empty()
l.insert_node(4, 100)
l.insert_node(6, "cecil")
l.show_linked_list()
print "The value of index 0 is: ", l.get_elem(0)
l.set_elem(0,1000)
l.show_linked_list()
print "the index of *** is: ", l.get_index(1009)
print "The length of linked list now is: ", l.get_length()
l.delete_node(3)
#l.clear_linked_list()
l.show_linked_list()
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。