您的位置:首页 > 其它

链表解决约瑟夫环问题

2016-05-11 00:14 465 查看
现在用链表解决约瑟夫环问题,链表与数组的区别在于,链表的出列是删除结点,而数组并没有真正删除元素,只是标记为不存在。

上代码:

[cpp] view
plain copy

#include<stdio.h>

#include<stdlib.h>

#define MAX 10

typedef struct node V_NODE;

struct node{

int id;

struct node *next;

};

V_NODE *create_link(int n)

{

V_NODE *head = NULL;

V_NODE *p = NULL;

head = p =malloc(sizeof(V_NODE));

if(p == NULL)

{

perror("malloc");

exit(1);

}

p->id = 1;

p->next = NULL;

int i =0;

for(i = 1;i<n;i++)

{

p->next= malloc(sizeof(V_NODE));

if(p->next== NULL)

{

perror("malloc");

exit(1);

}

p->next->id = i+1;

p->next->next= NULL;

p = p->next;

}

p->next= head;

return p;

}

void print_link(V_NODE *head,int n)

{

int i =0;

for(i=0;i<n;i++)

{

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

head = head->next;

}

printf("\n");

}

void circle_game(V_NODE *rear)

{

V_NODE *head = rear->next;

V_NODE *p = head;

int counter = 0;

int interval = 4;

while(p->next!=p)

{

counter++;

if(counter==interval)

{

counter = 0;

printf("%8d(out)\n",p->id);

rear->next = p->next;

free(p);

p = rear->next;

}

else

{

printf("%8d",p->id);

p=p->next;

rear=rear->next;

}

}

printf("%8d left!\n",p->id);

}

int main(void)

{

V_NODE *rear = NULL;

int n = 10;

rear = create_link(n);

print_link(rear->next,n);

circle_game(rear);

return 0;

}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: