导航

链表

Posted on 2011-06-04 19:28  雨过天晴C#  阅读(199)  评论(0)    收藏  举报

1、链表和数组各自的特点

  1. 链表在插入和删除上性能优秀,而在查找上性能表现不足(查找第k项)
  2. 数组在能快速的找出第k项,但是在删除某项上性能不好,因为要移动数据。

2、约瑟夫问题

//约瑟夫问题的一般形式:
//约瑟夫问题是个有名的问题: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; 
}