数据结构与算法---(二)链表多种形式对比总结

在上一章中,我们对比了顺序表和链表,知道,链表其实是由若干个含结点构成,其结点包括信息域和指针域。形成一个单向链接线性表。类似如下结构

而根据单链表结构结合实际问题又延伸出来静态链表,双向链表,循环链表这三种主要链表形式。

  1. 从定义和数据结构对比


    2.从基本操作对比(横着顺序)
    在这里插入图片描述

    单向循环列表
    //删除头结点的代码如下:(注意:删除操作的 初始条件 为 该队列 不为空)
    int Delete(QueueQ,intelem){
    Node*p;
    if(Q->size0) return ERROR; //如果队列为空,则返回0;
    p=Q->rear->next; //令p指向头结点,即 p = 尾指针的后继指针;
    *elem=p->data; //获取头结点的值;
    Q->rear->next=p->next; //将尾指针的后继指针 指向 头结点p的后继结点,从而达到将头结点从链表中删除的目的;
    if(Q->rear
    p) Q->rear=NULL; //如果被删除的头结点是队列里 唯一的结点 ,即尾指针指向头结点,则清空rear;
    free§; //清除p;
    Q->size–; //每删除一个头结点,队列属性size减一;
    return OK;
    }
    (单链表的python实现)
    这里进行操作之前,静态链表需要进行可用空间初始化。 是所有的链表都需要还是静态链表需要???

  2. 拓展-关于链表的应用实例

用循环链表求解约瑟夫问题
约瑟夫问题:
n个人围成一个圆圈,首先,第1个人从1开始,顺时针报数, 报到第m个人,令其出列。然后再从下一个人开始,从1顺时针报数,报到第m个人,再令其出列,…,如此下去, 直到圆圈中只剩一个人为止。此人即为优胜者。
算法基本思路?用什么数据结构?

#约瑟夫问题, 有n个人,从第m个开始报数,数到k的人出局,不断循环,直到剩下一个人即胜利,
#每次循环报数out一个编号,最后剩下的survivor便是游戏获胜者。

def joseph(n,m,k):
    if k==1:
        print("survive",n)
        return
    queue=list(range(1,n+1))  #因为range函数是从0开始计数
    while len(queue)!=1:
        death=(n+k-1)%len(queue)#要出列的号码
        for i in range(n-1): # 如果是全部都出列,是循环n次的,因为我们是要知道最后一个人,所以是n-1次
             print("out!",queue[death]) #f[n] = (f[n-1] + m)%n //m表示每次数到该数的人出列,n表示当前序列的总人数
             del queue[death] 
             death=(death+k-1)%len(queue)
             print("survivor",queue)

if __name__=='__main__':
    joseph(8,1,4)

多项式的代数计算


在这里插入图片描述

考虑用python来实现

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值