循环链表

简介:

单向循环链表:

空表:L->next = L。

与单链表的联系:判断表尾的方法不同:单链表用p==NULL;循环链表用p==L。

双向循环链表:一个结点包含指向后继(next) 和指向前驱(prior) 两个指针,两个方向又分别构成循环链表。

双向循环链表的插入和删除:

1.p之后插入s
s->next = p->next;
p->next = s;
s->prior = p;
s->next->prior = s;

2.p之前插入s
s->prior= p->prior;
p->prior = s;
s->next = p;
s->prior->next = s;

3.删除p之后继s
s = p->next;
p->next = s->next;
p->next->prior = p;

4.删除p
p->prior->next= p->next;
p->next->prior= p->prior;

一道题目:循环链表解决Josephus环问题

题目:n个人围成一圈,从第一个开始顺序报数1,2,3,凡是报到3 者退出圈子,最后剩下的就是胜利者。

参考代码:

复制代码
#include <iostream>   
using namespace std;  
  
typedef struct Node  
{  
    int data;  
    struct Node *next;  
}Node,*List;  
  
List Creatlist(int n)  
{  
    List head,p;  
    int i;  
    head=(Node*)malloc(sizeof(Node));  
    if(!head)  
    {  
        cout<<"memory allocation error!\n";  
        exit(1);  
    }  
    head->data=1; head->next=head;  
    for(i=n;i>1;--i)  
    {  
        p=(Node*)malloc(sizeof(Node));  
        if(!p)  
        {  
            cout<<"memory allocation error!\n";  
            exit(1);  
        }  
        p->data=i; p->next=head->next; head->next=p;   
    }  
    return head;  
}  
  
void Output(List head)  
{  
    List p=head;  
    do  
    {  
        cout<<p->data<<" ";  
        p=p->next;  
    }while(p!=head);  
    cout<<endl;  
}  
  
void Play(List head,int n,int m) //第一种方法   
{  
    List p,q;  
    int c,k;  
    p=head; c=1; k=n;  
    while(k>1)  
    {  
        if(c==m-1)  
        {  
            q=p->next; p->next=q->next;  
            cout<<q->data<<" ";  
            free(q);  
            c=0; --k;  
        }  
        else {c++; p=p->next;}  
    }  
    cout<<"The winner is "<<p->data;  
    cout<<endl;  
}  
  
void Josephus(List h,int n,int m)//第二种方法   
{  
    Node* p=h,*pre=NULL;  
    int i,j;  
    for(i=0;i<n-1;++i)  
    {  
        for(j=1;j<m;++j)  
        {  
            pre=p;  
            p=p->next;  
        }  
        cout<<"The out number is"<<p->data<<endl;  
        pre->next=p->next; free(p);  
        p=pre->next;  
    }  
    cout<<"The winner is "<<p->data<<endl;  
}  
  
int main()  
{  
    List head;  
    int n,m;  
    cout<<"Input the n and m :";  
    cin>>n>>m;  
    head=Creatlist(n);  
    Output(head);  
    Josephus(head,n,m);  
  
    return 0;  
}  
复制代码

 

作者: 阿凡卢
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
http://www.cnblogs.com/luxiaoxun/archive/2012/08/03/2622359.html
相关文章
|
24天前
|
存储 算法 C语言
线性表,双向链表,静态链表,循环链表(约瑟夫环)(上)
线性表,双向链表,静态链表,循环链表(约瑟夫环)
39 5
|
24天前
|
存储 C语言
线性表,双向链表,静态链表,循环链表(约瑟夫环)(下)
线性表,双向链表,静态链表,循环链表(约瑟夫环)
32 6
|
2月前
|
C语言 C++
【c++】用c++实现带头双向循环链表
【c++】用c++实现带头双向循环链表
|
2月前
|
存储
带头双向循环链表
带头双向循环链表
31 0
|
4月前
|
存储
带头双向循环链表的实现
带头双向循环链表的实现
|
4月前
单链表的实现
单链表的实现
|
4月前
|
存储 算法 搜索推荐
双向循环链表
双向循环链表是一种链式存储结构,每个节点包含两个指针,分别指向其前驱和后继。相比于单向链表,双向循环链表在需要频繁插入和删除节点时能够更高效地操作,
19 1
|
5月前
|
Python
循环链表
循环链表是一种链表的变种,它的最后一个节点的指针指向第一个节点,形成了一个环状结构。循环链表的特点包括:可以高效地实现正向和反向遍历,但是插入和删除操作相对较为复杂。
49 6
|
10月前
|
存储
【链表】双向循环链表的实现
【链表】双向循环链表的实现
60 0
|
10月前
|
存储
【双向带头循环链表】
在链表中有八大形式,如下图:其中,最为重要的两种结构为最简单的单向不带头不循环链表和双向带头循环链表。 单链表前面的文章已经介绍过,本篇文章重点介绍双向带头循环链表。 带头双向循环链表:结构最复杂,一般用在单独存储数据。实际中使用的链表数据结构,都是带头双向循环链表。 另外这个结构虽然结构复杂,但是使用代码实现以后会发现结构会带来很多优势,实现反而简单了,后面我们代码实现了就知道了。