双向链表和循环链表并用

双向链表和循环链表并用

双向链表使用前驱指针以及后继指针
循环链表就是尾指针指向头
约瑟夫环问题:n个人围成一个圈,指定一个数字v,从第一个人开始报数,每轮报到v的选手出局,由下一个人接着从头开始报,最后一个人是赢家。其中n>1,v>2。
下面是循环链表(单向)在约瑟夫环中的应用,测试数据只用了615,答案是546231,可能程序还有其他错误,望指正。
以下变量中:n是总人数,s是第几个人,最后一个程序默认s是1,v是指定数字即循环次数;

#include <stdio.h>
#include<malloc.h>
/*单向的话需要两个指针,双向的话,一个指针就够了*/
struct s{
int m;
struct s*next;};
int count=0;
struct s*create(int n)
{
    struct s*p,*phead,*pend;
    p=((struct s*)malloc(sizeof(struct s)));
    p->m=count+1;
    while(count<n)
    {
        if(count==0)
        {
            phead=p;
            pend=p;
            pend->next=NULL;
            count ++;
        }
        else
        {
            pend->next=p;
            pend=p;
            pend->next=NULL;
            count ++;
        }
         p=((struct s*)malloc(sizeof(struct s)));
        p->m=count+1;
    }
    pend->next=phead;
    return phead;
}
int main(void)
{
    struct s*p,*p0;
    int n,s,v,a[100],j,i;
    scanf("%d%d%d",&n,&s,&v);
    p=create(n);
    p0=p;
    for(i=0;i<(s+v-3);i++)
        p0=p0->next;
    p=p0->next;
    a[j]=p->m;j++;
    p0->next=p->next;
    while(n>1)
    {
        i=0;
        while(i<v-1){p0=p0->next;i++;}
        p=p0->next;
        a[j]=p->m;j++;
        p0->next=p->next;
        p=p0->next;
        n--;
    }
    for(i=0;i<j;i++)
        printf("%d ",a[i]);
}

下面是循环链表(双向)在约瑟夫环的应用,测试数据只用了615,答案是546231,程序可能还有其他错误,若有不当请指正

#include<stdio.h>
#include<malloc.h>
struct s
{
int m;
struct s*prior;
struct s*next;
};
int count=0;
struct s*create(int n)
{
    struct s*p,*phead,*pend;
    p=((struct s*)malloc(sizeof(struct s)));
    p->m=count+1;
    while(count<n)
    {
        if(count==0)
        {
            pend=p;
            phead=p;
            p->next=NULL;
            p->prior=NULL;
            count++;
        }
        else
        {
            pend->next=p;
            p->prior=pend;
            pend=p;
            pend->next=NULL;
            count ++;
        }
       p=((struct s*)malloc(sizeof(struct s)));
    p->m=count+1;
    }
    pend->next=phead;
    phead->prior=pend;
    return phead;
}
int main(void)
{
    int n,s,v,a[100]={0},j=0,i;
    struct s*p;
    scanf("%d%d%d",&n,&s,&v);
    p=create(n);
    while(n>0)
    {
        i=0;
        while(i<v-1)
        {  i++;
        p=p->next;
        }
        a[j]=p->m;j++;
    p->prior->next=p->next;
    p->next->prior=p->prior;/*双向链表删除一个节点时,修改后继指针的时候也要把前驱指针给修改了*/
    p=p->next;
    n--;
    }
    for(i=0;i<j;i++)
    {
        printf("%d",a[i]);
    }
}

下面是没有链表的循环程序,个人认为还比较简单,不用链表也没有十分繁琐,主要涉及到数组中的坐标问题,其余的不是很复杂
测试数据只有615,答案是546231,若有不当请指正

#include<stdio.h>
void del(int a[],int n,int i);

int main(void)
{

    int n,s,m,i,j=0,c,t;
    int a[100]={0},b[100]={0};

    scanf("%d%d%d",&n,&s,&m);
    t=n;
    for(i=0;i<n;i++)
    {
        a[i]=i+1;
    }
    for(c=m+s-2;j<t;j++)
    {
        c=c%n;
        b[j]=a[c];
        del(a,t,c);
        n--;
        c=c+m-1;
    }

    for(i=0;i<t;i++)
    {
        printf("%2d\n",b[i]);
    }
    return 0;

}
void del(int a[],int n,int i)
{
    for(;i<n-1;i++)
    {
        a[i]=a[i+1];
    }
}

注,数组删除元素:
1.字符数组删除元素每次删除一个到了末尾让\0往上补,\0也不会显示出来,以此达到删除的目的
2.整形数组删除时示例如下
输入 12345678
删除45
得到结果(若全部输出)
为12367888,最后的数字一定会赘余,因此要控制输出元素个数
如果输出的元素个数为6,则为123678,可以达到删除元素的目的。

Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值