链表解决约瑟夫环问题
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;
}
上代码:
[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;
}
相关文章推荐
- C++作业5
- NYOJ 195飞翔(动态规划)
- 图论之邻接表的数组实现
- c++实验5-数组分离
- C++课后作业5
- MapReduce排序输出
- BFS算法经典 Knight moves
- (一)初识Android
- Jsp
- PHP环境搭建
- c++第5次作业
- Flume与Kafka集成
- NYOJ 737 石子合并(一)
- adb进程端口被占用
- 四月小结:遗憾和选择
- 笔试面试题三
- Provisioning Services 7.8 入门系列教程之十一 通过版本控制自动更新虚拟磁盘
- Provisioning Services 7.8 入门系列教程之十一 通过版本控制自动更新虚拟磁盘
- Provisioning Services 7.8 入门系列教程之十一 通过版本控制自动更新虚拟磁盘
- C++作业5—数组选择/求和/字符串