| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 516 人关注过本帖
标题:使用单向循环表编制程序
只看楼主 加入收藏
陈颖洁
Rank: 1
来 自:江苏省
等 级:新手上路
帖 子:4
专家分:0
注 册:2011-4-1
结帖率:50%
收藏
 问题点数:0 回复次数:1 
使用单向循环表编制程序
设计一个程序求出约瑟夫环的出列顺序。约瑟夫环问题的一种描述是:编号为1,2,...,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一人开始重新从1报数,如此下去,直至所有人全部出列止。例如n=7,7个人的密码集资为:3,1,7,2,4,8,4,m的初值取6,则正确的出列顺序应为6,1,4,7,2,3,5。要求使用单向循环链表模拟出列过程。
搜索更多相关主题的帖子: 顺时针 约瑟夫 正整数 
2011-04-07 20:39
loveshuang
Rank: 9Rank: 9Rank: 9
来 自:湖北武汉
等 级:蜘蛛侠
帖 子:270
专家分:1198
注 册:2010-11-14
收藏
得分:0 
#include <stdio.h>
#include <malloc.h>
typedef struct LNode{
     int number;
     int password;
     struct LNode *next;
}linklist;

   
void insert(linklist *q,int n, linklist *head)
{  
    int i;
    for( i=1; i<n; ++i ){
        linklist *p;
        p=(linklist*)malloc(sizeof(linklist));
        scanf("%d%d",&p->number,&p->password);
        q->next=p;
        q=p;
    }
    q->next=head;
}


void Delete(linklist *head,int m)
{
     linklist *q,*p;
     q=head;
     m--;
     while(q->next!=q)//判断是否只有一个结点了
     {
         while( m-1 )//循环到要删除结点的前一个
         {
             q=q->next;
             m--;
         }
         printf("%d\t",q->next->number);
         m=q->next->password;
         q->next=q->next->next;
     }
     printf("%d\n",q->number);
}


void main()
{
     linklist *head,*q;
     int m,n,i;
     printf("The first password is :");
     scanf("%d",&m);
     printf("The total number is:");
     scanf("%d",&n);
     if(n>30||n<0)
         printf("Error!");
     head=(linklist*)malloc(sizeof(linklist));
     head->next=NULL;
     scanf("%d%d",&head->number,&head->password);
     q=head;
     insert(q,n,head);//改成在末尾追加插入,你的中间插入顺序就反了
     Delete(head,m);
}
2011-04-09 01:49
快速回复:使用单向循环表编制程序
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015775 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved