原创 约瑟环问题

2011-10-6 16:55 2187 12 12 分类: MCU/ 嵌入式

/*//////////////////////////////////////////////////////////////////////////////
文件名:循环链表

功能实现:
有2个循环单链表,头指针分别是head1和head2,实现算法将链表
head2连接在head1之后,连接后的链表仍然是循环链表的形式

时间:2011年10月5日
修改时间:2011年10月6日
//////////////////////////////////////////////////////////////////////////////*/
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>

///////////////////////////////////////////////////////////////////////////////
#define ListSize 100


///////////////////////////////////////////////////////////////////////////////
typedef int Datatype;


///////////////////////////////////////////////////////////////////////////////
typedef struct Node
{
 Datatype data;
 struct Node SIZE: 14pt">/*//////////////////////////////////////////////////////////////////////////////
函数名:       Josephus
函数功能:    在长度为n的循环链表中,从k个人开始报数,数到
m的人出列

入口参数: (LinkList head, int n, int m, int k)
出口参数: 
//////////////////////////////////////////////////////////////////////////////*/
void Josephus(LinkList head, int n, int m, int k)
{
 ListNode *p,*q;
 int i;
 p=head;

 /*先找到编号为k的人*/
 for(i=1; i<k; i++)/*从第k个人开始报数*/
  {
   q=p;
   p=p->next;
  }
 /*此时p指向第k个结点*/
 
 while(p->next != p)/*这个是判断是否只剩下一个结点*/
  {
  /*找出报数m的人*/
   for(i=1; i<m; i++)/*数到m的人出列*/
    {
     q=p;
     p=p->next;
    }
   /*此时p指向数到m的结点*/
   /*此时q指向的是m的前驱结点,p指向的是第m个结点*/
   
   q->next = p->next;/*这步就是将m的前驱结点指针域指向
   m的后继结点*/
   printf("%4d",p->data);/*打印出出列的数据*/
   free(p);/*释放出列的结点空间*/
   p=q->next;/*指向下一个结点,重新开始报数*/
  }
 printf("%4d\n", p->data);
 
}

 

/*//////////////////////////////////////////////////////////////////////////////
函数名:       CreateCycList
函数功能:   宏定义和单链表定义
入口参数: int n
出口参数: 
//////////////////////////////////////////////////////////////////////////////*/
LinkList CreateCycList(int n)
{
 LinkList head=NULL;
 ListNode *s, *r;
 int i;

 for(i = 1; i <= n; i ++ )
  {
   s = (ListNode *)malloc(sizeof(ListNode));
   s->data = i;
   s->next = NULL;
   if(head == NULL)
    head = s;
   else
    r->next = s;/*本节点指针域指向下一个结点*/
   r = s;/*临时指针指向下一个结点*/
  }
 r->next = head;/*最后一个结点的指针域指向头结点形成环*/
 return head;/*返回头结点的地址*/
}

/*//////////////////////////////////////////////////////////////////////////////
函数名:       main()
函数功能:   主函数
入口参数: 
出口参数: 
//////////////////////////////////////////////////////////////////////////////*/
void main()
{
 LinkList h;
 int n,k,m;
 printf("输入环中人的个数n=");
 scanf("%d", & n);
 printf("输入开始报数的序号k=");
 scanf("%d", & k);
 printf("报数为m的人出列m=");
 scanf("%d", & m);
 h=CreateCycList(n);
 Josephus(h, n, m, k);
}

 

 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
12
关闭 站长推荐上一条 /3 下一条