1、链表和数组各自的特点
- 链表在插入和删除上性能优秀,而在查找上性能表现不足(查找第k项)
- 数组在能快速的找出第k项,但是在删除某项上性能不好,因为要移动数据。
//约瑟夫问题的一般形式:
//约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,
//最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的人的序号为5,4,6,2,3。最后剩下1号。
#include<stdio.h>
#include<stdlib.h>
//定义节点
typedef struct node *link; //link 相当于struck node *
struct node
{
int item;
link next;
};
int main(int argc,char *argv[])
{
int i,N = atoi(argv[1]),M = atoi(argv[2]);
link t = malloc(sizeof(link)),x = t; //t为头节点
t->item = 1; //对t的操作等于是对x节点的操作
t->next = t;
for(i = 2;i <= N;i++)
{
x = (x->next = malloc(sizeof(link)));
x->item = i;
x->next = t;
}
//当链表添加完成后,x位于链表的表位,x->next指向表头
while( x != x->next)
{
for(i = 1;i < M;i++) // 注意为什么i < M而不是i <= M
{
x = x->next;
}
link temper = x->next;
x->next = temper->next;
free(temper);
N--;
}
printf("%d\n",x->item);
printf("%d\n",N);
system("Pause");
return 0;
}