在上一章中,我们对比了顺序表和链表,知道,链表其实是由若干个含结点构成,其结点包括信息域和指针域。形成一个单向链接线性表。类似如下结构
而根据单链表结构结合实际问题又延伸出来静态链表,双向链表,循环链表这三种主要链表形式。
-
从定义和数据结构对比
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->rearp) Q->rear=NULL; //如果被删除的头结点是队列里 唯一的结点 ,即尾指针指向头结点,则清空rear;
free§; //清除p;
Q->size–; //每删除一个头结点,队列属性size减一;
return OK;
}
(单链表的python实现)
这里进行操作之前,静态链表需要进行可用空间初始化。 是所有的链表都需要还是静态链表需要???
-
拓展-关于链表的应用实例
用循环链表求解约瑟夫问题
约瑟夫问题:
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来实现