就是能够用一根线串起来的数据结构
数组 (列表)
问:申请数组的前提条件是啥? a[12]?内存需要满足的条件?
答:a[3] = 首地址(1000) + 索引(3) * 类型长度(4) = 1012 --- 1015 (int类型为4字节)
问:数组首地址从哪获取?
答:数组首地址保存在数组名中
列表中的增(append)删(pop)改(update)查(for)
链表 (约瑟夫,丢手绢问题)
单链表的增删改查
# 梁山好汉排行榜 class Hero(): def __init__(self,no=None,name=None,nickname=None,pNext=None): self.no = no self.name = name self.nickname = nickname #这三个为值域 self.pNext = pNext # 指针域,存内存地址 def add(head,hero): ## head节点不能动,因此需要第三方的临时变量帮助head去遍历 cur = head while cur.pNext != None: ## 把下一个节点的内存地址付给cur, 那此时cur就指向下一个节点 cur = cur.pNext ## 当退出上述循环的时候,cur就已经指向尾节点 cur.pNext = hero def getAll(head): cur = head while cur.pNext != None: cur = cur.pNext print('编号是:%s,名称是:%s,外号是:%s'%(cur.no,cur.name,cur.nickname)) def delHero(head,no): cur = head while cur.pNext != None: if cur.pNext.no == no: break cur = cur.pNext cur.pNext = cur.pNext.pNext head = Hero() # 头结点 h1 = Hero(1,'松江','及时雨') add(head,h1) h2 = Hero(2,'卢俊义', 'xxx') add(head,h2) h3 = Hero(3, '西门庆', 'dsadsad') add(head,h3) getAll(head) delHero(head,2) print('***********') getAll(head)
用链表解决约瑟夫问题(了解)
设编号为1,2,… n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列
# 循环链表 class Child(object): first = None def __init__(self, no = None, pNext = None): self.no = no self.pNext = pNext def addChild(self, n=4): cur = None for i in range(n): child = Child(i + 1) if i == 0: self.first = child self.first.pNext = child cur = self.first else: cur.pNext = child child.pNext = self.first cur = cur.pNext def showChild(self): cur = self.first while cur.pNext != self.first: print("小孩的编号是:%d" % cur.no) cur = cur.pNext print("小孩的编号是: %d" % cur.no) def countChild(self, m, k): tail = self.first while tail.pNext != self.first: tail = tail.pNext # 出来后,已经是在first前面 # 从第几个人开始数 for i in range(k-1): tail = tail.pNext self.first = self.first.pNext # 数两下,就是让first和tail移动一次 # 数三下,就是让first和tail移动两次 while tail != self.first: # 当tail == first 说明只剩一个人 for i in range(m-1): tail = tail.pNext self.first = self.first.pNext self.first = self.first.pNext tail.pNext = self.first print("最后留在圈圈中的人是:%d" % tail.no) c = Child() c.addChild(4) c.showChild() c.countChild(3,2)