数据结构

参考:http://lupython.gitee.io/

线性结构

就是能够用一根线串起来的数据结构

数据结构   线性结构(数组[列表] ,链表  单链表的增删改查**, 线性结构的应用   队列   栈[函数的调用**]),非线性结构  树

 数据结构   线性结构(数组[列表] ,链表  单链表的增删改查**, 线性结构的应用   队列   栈[函数的调用**]),非线性结构  树

数组 (列表)

问:申请数组的前提条件是啥? a[12]?内存需要满足的条件?

答:内存必须有一块连续的内存空间

int a[7] : 声明一个数组,这个数组的数组名是 a, 数组的大小是 7, 数组元素的类型是整型。 int a[7] = array(1,2,3,4,5,6,7)

问:如何申请内存?

答:C,C++语言,申请:mallco (28)。释放:free(28)

问:int a[7] = [1,2,3,4,5,6,7] a[3] = 4?

数据结构   线性结构(数组[列表] ,链表  单链表的增删改查**, 线性结构的应用   队列   栈[函数的调用**]),非线性结构  树

 答: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)
View Code

相关文章: