约瑟夫环问题(带头节点)

Posted mykonons

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了约瑟夫环问题(带头节点)相关的知识,希望对你有一定的参考价值。

  

/*
总结:就是建立一个循环单链表,再按循环取余删除节点:
注意:1.未给指针变量s分配动态内存时,让其等于别的分配内存的指针(q)相当于
把 s指向其内存,并不能建立链接。
2.此链表带头节点
遇到问题 :1.在选择人的时候遇到了阻碍(不知如何选)

               2.设置头节点,循环(难点)


*/#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
static int count;
typedef struct node
{
int num;
struct node *next;
}lnode,*linklist;

linklist creat(linklist l,int n)
{
linklist p,s,q;
int i; count=n;
p=(linklist)malloc(sizeof(lnode));
p->next=NULL;
l->next=p;
p->num=1;
s=p;
for(i=2;i<=n;i++)
{
q=(linklist)malloc(sizeof(lnode));
q->num=i;
s->next=q;
s=q;
}
s->next=l->next;
return l;


}

void select(linklist l,int m)
{
linklist p,q,s;
int i,j,t=0;
p=l;
for(i=0;i<count;i++)//输出八个值
{
for(j=1;j<m;j++)//指针右移
{
p=p->next;
}
q=p->next;
printf("%d ",q->num);
p->next=q->next;//注意赋值和链接的区别 和next有关;
free(q);//注意:删除节点1后,从节点5开始;
}

}


int main()
{
linklist l,s;
l=(linklist)malloc(sizeof(lnode));
int n,m;
printf("请输入人数 n:\n");
scanf("%d",&n);
creat(l,n);
printf("数到的数字是 m:\n");
scanf("%d",&m);
select(l,m);

return 0;
}

以上是关于约瑟夫环问题(带头节点)的主要内容,如果未能解决你的问题,请参考以下文章

Java数据结构之单向环形链表(解决Josephu约瑟夫环问题)

JAVA实现: 使用单链表实现约瑟夫环(约瑟夫问题)

循环链表实现约瑟夫环

C-约瑟夫环

Java循环链表实现约瑟夫环(搬运)

约瑟夫环小结(线段树)