约瑟夫环问题 循环链表

来源:互联网 发布:字体管家mac版 编辑:程序博客网 时间:2024/05/01 10:46
#include <stdio.h>#include <stdlib.h>typedef struct node *link;struct node{int item ;link next;}; void josephus(int n, int m){int i ;link head = (link) malloc(sizeof (link) ), x = head ; head -> item = 1;head -> next = head ;for(i = 2 ; i <= n; i++){x = (x -> next   = (link)malloc(sizeof(link)));        x->item = i;        x->next = head ;    }    while(x != x -> next ){    printf("%d\n",x -> item );    for(i = 1 ; i < m ; i++ ) x = x -> next;    x -> next = x -> next -> next;n--;}printf("%d",x -> item );}main(){josephus(9,5);}



程序2:

list.h文件

typedef struct node* link;struct node {int item; link next;};typedef link Node;void initNodes(int);link newNode(int);void freeNode(link);void insertNext(link,link);link deleteNext(link);link Next(link);int Item(link);
主程序
<pre name="code" class="objc">#include <stdlib.h>#include <stdio.h>#include "list.h"link freelist;void initNodes(int n ){int i ;freelist =(link) malloc((n+1) * (sizeof *freelist));for (i = 0 ; i < n+1 ; i ++ ) freelist[i].next = &freelist[i+1] ;freelist[n].next = NULL;} link newNode(int i){link x = deleteNext(freelist) ;x -> item = i ;x -> next = x ;return x ;}void freeNode(link x){insertNext(freelist, x);}/********************* *在x节点后插入t节点。 *********************/void insertNext(link x,link t){t -> next = x -> next ;x -> next = t ;}//删除x节点后的一个节点 并返回删除掉的节点 link deleteNext(link x){link t = x -> next;x -> next = t -> next;return t;}link Next(link x){return x -> next;}int Item(link x){return x -> item ;}void josephus(int n, int m){int i ;Node head , x ; initNodes(n);for(i = 2, x = newNode(1); i <= n; i++){head = newNode(i);insertNext(x,head);x = head ;    }    while(x != Next(x) ){    printf("%d\n",x -> item );    for(i = 1 ; i < m ; i++ ) x = x -> next;    freeNode(deleteNext(x)) ;}printf("%d",Item(x) );}main(){josephus(9,5);}









程序运行结果


0 0
原创粉丝点击