鱼C论坛

 找回密码
 立即注册
查看: 2479|回复: 1

[技术交流] python 数据结构之单链表的实现(别人的成果)

[复制链接]
发表于 2015-1-9 11:06:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 瞬秒爆加速 于 2015-1-9 11:12 编辑

原文地址:http://www.cnblogs.com/yupeng/p/3413763.html#3103095

链表的定义:

  链表(linked list)是由一组被称为结点的数据元素组成的数据结构,每个结点都包含结点本身的信息和指向下一个结点的地址。由于每个结点都包含了可以链接起来的地址信息,所以用一个变量就能够访问整个结点序列。也就是说,结点包含两部分信息:一部分用于存储数据元素的值,称为信息域;另一部分用于存储下一个数据元素地址的指针,称为指针域。链表中的第一个结点的地址存储在一个单独的结点中,称为头结点或首结点。链表中的最后一个结点没有后继元素,其指针域为空。  

如下图所示:


                               
登录/注册后可看大图


单链表的结构:


                               
登录/注册后可看大图

单链表的插入和删除示意图:


                               
登录/注册后可看大图



  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-

  3. class Node(object):
  4.     def __init__(self,val,p=0):
  5.         self.data = val
  6.         self.next = p

  7. class LinkList(object):
  8.     def __init__(self):
  9.         self.head = 0

  10.     def __getitem__(self, key):

  11.         if self.is_empty():
  12.             print 'linklist is empty.'
  13.             return

  14.         elif key <0  or key > self.getlength():
  15.             print 'the given key is error'
  16.             return

  17.         else:
  18.             return self.getitem(key)



  19.     def __setitem__(self, key, value):

  20.         if self.is_empty():
  21.             print 'linklist is empty.'
  22.             return

  23.         elif key <0  or key > self.getlength():
  24.             print 'the given key is error'
  25.             return

  26.         else:
  27.             self.delete(key)
  28.             return self.insert(key)

  29.     def initlist(self,data):

  30.         self.head = Node(data[0])

  31.         p = self.head

  32.         for i in data[1:]:
  33.             node = Node(i)
  34.             p.next = node
  35.             p = p.next

  36.     def getlength(self):

  37.         p =  self.head
  38.         length = 0
  39.         while p!=0:
  40.             length+=1
  41.             p = p.next

  42.         return length

  43.     def is_empty(self):

  44.         if self.getlength() ==0:
  45.             return True
  46.         else:
  47.             return False

  48.     def clear(self):

  49.         self.head = 0


  50.     def append(self,item):

  51.         q = Node(item)
  52.         if self.head ==0:
  53.             self.head = q
  54.         else:
  55.             p = self.head
  56.             while p.next!=0:
  57.                 p = p.next
  58.             p.next = q


  59.     def getitem(self,index):

  60.         if self.is_empty():
  61.             print 'Linklist is empty.'
  62.             return
  63.         j = 0
  64.         p = self.head

  65.         while p.next!=0 and j <index:
  66.             p = p.next
  67.             j+=1

  68.         if j ==index:
  69.             return p.data

  70.         else:

  71.             print 'target is not exist!'

  72.     def insert(self,index,item):

  73.         if self.is_empty() or index<0 or index >self.getlength():
  74.             print 'Linklist is empty.'
  75.             return

  76.         if index ==0:
  77.             q = Node(item,self.head)

  78.             self.head = q

  79.         p = self.head
  80.         post  = self.head
  81.         j = 0
  82.         while p.next!=0 and j<index:
  83.             post = p
  84.             p = p.next
  85.             j+=1

  86.         if index ==j:
  87.             q = Node(item,p)
  88.             post.next = q
  89.             q.next = p


  90.     def delete(self,index):

  91.         if self.is_empty() or index<0 or index >self.getlength():
  92.             print 'Linklist is empty.'
  93.             return

  94.         if index ==0:
  95.             q = Node(item,self.head)

  96.             self.head = q

  97.         p = self.head
  98.         post  = self.head
  99.         j = 0
  100.         while p.next!=0 and j<index:
  101.             post = p
  102.             p = p.next
  103.             j+=1

  104.         if index ==j:
  105.             post.next = p.next

  106.     def index(self,value):

  107.         if self.is_empty():
  108.             print 'Linklist is empty.'
  109.             return

  110.         p = self.head
  111.         i = 0
  112.         while p.next!=0 and not p.data ==value:
  113.             p = p.next
  114.             i+=1

  115.         if p.data == value:
  116.             return i
  117.         else:
  118.             return -1


  119. l = LinkList()
  120. l.initlist([1,2,3,4,5])
  121. print l.getitem(4)
  122. l.append(6)
  123. print l.getitem(5)

  124. l.insert(4,40)
  125. print l.getitem(3)
  126. print l.getitem(4)
  127. print l.getitem(5)

  128. l.delete(5)
  129. print l.getitem(5)

  130. l.index(5)
复制代码



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-1-9 16:28:04 | 显示全部楼层
好长~C语言默默飘过~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-28 16:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表