循环链表解josephus问题

来源:互联网 发布:linux定时任务每15分钟 编辑:程序博客网 时间:2024/06/05 18:21
#include <stdio.h>#include <stdlib.h>typedef struct clink_node_tag{struct clink_node_tag *next;int id;}clink_node_t;typedef struct clink_tag{clink_node_t *head;clink_node_t *tail;int count;}clink_t;clink_node_t *clink_node_alloc(int n){clink_node_t *node = (clink_node_t *)malloc(sizeof(clink_node_t));node->next = NULL;node->id = n;return node;}clink_t *clink_init(clink_t *cl){if( cl == NULL ){cl = (clink_t *)malloc(sizeof(clink_t));cl->head = cl->tail = NULL;cl->count = 0;return cl;}}void clink_insert(clink_t *cl, clink_node_t *node){if( cl->count == 0 ){cl->head = cl->tail = node;cl->tail->next = cl->head;cl->count++;return;}cl->tail->next = node;cl->tail = node;cl->tail->next = cl->head;cl->count++;}int main(int argc, char *argv[]){int N = atoi(argv[1]);int M = atoi(argv[2]);fprintf(stderr, "N=%d, M=%d\n", N, M);int i;clink_t *clink = NULL;clink = clink_init( clink );clink_node_t *n;for(i=0; i<N; i++){n = clink_node_alloc(i+1);clink_insert(clink, n);}
/*
*用厄尔拉多塞舍法来解决
<pre name="code" class="cpp">
clink_t *p = clink->header;while( p->next != clink->header ){int i;for( i=1; i<M; i++ ){p = p->next;}clink_t *t = p->next;p->next = p->next->next;free(t);}

*/
if(clink->count == 1) return;clink_node_t *iter = clink->head;int count = 1;while(clink->count > 1){count++;if( count%M == 0){clink_node_t *tmp = iter->next;iter->next = iter->next->next;fprintf(stderr, "dequeu %d, %d\n", tmp->id, clink->count);free(tmp);clink->count--;}else{iter = iter->next;}}clink->head = clink->tail = iter;fprintf(stderr, "leader %d\n", iter->id);}

0 0
原创粉丝点击