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

  

/*
总结:就是建立一个循环单链表,再按循环取余删除节点:
注意: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: ");
scanf("%d",&n);
creat(l,n);
printf("数到的数字是 m: ");
scanf("%d",&m);
select(l,m);

return 0;
}

原文地址:https://www.cnblogs.com/mykonons/p/5870359.html