约瑟夫问题c语言

Python013

约瑟夫问题c语言,第1张

1、约瑟夫问题:Joseph问题的一种描述是:编号为1、2、……、n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个人开始顺时针方向自1开始顺序报数,报到m时停止报数,报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。2、例程:#include #include typedef int ElemTypetypedef struct LNode{ElemType dataint numstruct LNode *next}LNode,*LinkListvoid CreateList_L(LinkList *L,int n){ int i=0ElemType eLinkList p,q*L=(LinkList)malloc(sizeof(LNode))(*L)->next=NULL(*L)->data=nq=*Lwhile(i data=ep->num=i+1p->next=NULLq->next=pq=pi++}p->next=(*L)->next}void PrintList(LinkList L){ int i=0LinkList pp=L->nextwhile(i data){printf("%5d",p->data)p=p->nexti++}printf("\n")}void Put(LinkList *L){ int i,mLinkList p,qprintf("input a number:\n")scanf("%d",&m)q=(*L)->nextwhile((*L)->data){for(i=0i next}printf("%5d",q->num)m=q->datap->next=q->nextfree(q)q=p->next(*L)->data=(*L)->data-1}}void main(){LinkList Lint aprintf("请输入人数:")scanf("%d",&a)printf("请输入密码:")CreateList_L(&L,a)printf("您输入的数字为:\n")PrintList(L)Put(&L)}

我这有个类似的,你根据你的需求改一下就可以了

—————————————————————————

#include<stdio.h>

#include<malloc.h>

typedef

struct

tagRing_t

{

int

Num

struct

tagRing_t

*pnext

}Ring_t

int

InitRing(Ring_t

**pstRing)

{

*pstRing

=

(Ring_t

*)malloc(sizeof(Ring_t))

if

(NULL

==

*pstRing)

{

return

0

}

(*pstRing)->Num

=

1

(*pstRing)->pnext

=

*pstRing

return

1

}

int

CreateRing(Ring_t

**pstRing,

int

iNum)

{

int

i

=

0

Ring_t

*pstTemp

=

NULL,

*pst

=

NULL

if

(iNum

<

1)

{

return

0

}

pstTemp

=

*pstRing

for

(i

=

0

i

<

iNum

i++)

{

if

(0

==

i)

{

(*pstRing)->Num

=

1

}

else

{

pst

=

(Ring_t

*)malloc(sizeof(Ring_t))

if

(NULL

==

pst)

{

return

0

}

pst->Num

=

i

+

1

pstTemp->pnext

=

pst

pst->pnext

=

*pstRing

pstTemp

=

pstTemp->pnext

}

}

return

1

}

int

DeleteNode(Ring_t

**pstRing,

int

s,

int

iNum)

{

int

i

=

0

Ring_t

*pstTemp

=

*pstRing,

*pst

=

NULL

while

(pstTemp->pnext

!=

*pstRing)

{

pstTemp

=

pstTemp->pnext

}

for

(i

=

1

i

<

s

i++)

{

pstTemp

=

pstTemp->pnext

}

while

(pstTemp->pnext

!=

pstTemp)

{

for

(i

=

1

i

<

iNum

i++)

{

pstTemp

=

pstTemp->pnext

}

pst

=

pstTemp->pnext

pstTemp->pnext

=

pst->pnext

printf("

%d

",

pst->Num)

free

(pst)

pst

=

NULL

}

printf("

%d\n",

pstTemp->Num)

free

(pstTemp)

pstTemp

=

NULL

return

1

}

int

main()

{

Ring_t

*pstRing

=

NULL

int

n

=

0,

s

=

0,

m

=

0

InitRing(&pstRing)

printf("请输入n,

s

m的值:")

scanf("%d

%d

%d",

&n,

&s,

&m)

CreateRing(&pstRing,

n)

printf("出列顺序为:

")

DeleteNode(&pstRing,

s,

m)

return

1

}

正好之前写过基础的约瑟夫环,稍作修改就可以满足你的题目

#include <stdio.h>

#include <stdlib.h>

typedef struct _node {

    int id

    int key

    struct _node *next

} Linklist

int main() {

int n, m

scanf("%d %d", &n, &m)

int i, count = 0

Linklist *head = (Linklist*)malloc(sizeof(Linklist)), *tail = head

head->id = 1

scanf("%d", &head->key)

head->next = head

for(i = 2 i <= n i++) {

Linklist *p = (Linklist*)malloc(sizeof(Linklist))

p->id = i

scanf("%d", &p->key)

p->next = head

tail->next = p

tail = p

}

while(head != tail) {

if(++count % m) {

tail = head

} else {

    m = head->key

    count = 0

printf("%d ", head->id)

tail->next = head->next

free(head)

}

head = tail->next

}

printf("%d\n", head->id)

free(head)

return 0

}