dedecms织梦内容管理系统    
首页 | java | C/C++ | PHP | 操作系统 | ajax | 脚本编程 | 安全技术 | 本站下载页 | 专题 | QQ群 | 测试中心 | 会员中心 | 积分规则
  当前位置:主页>C/C++>C/C++技术资料>文章内容
M个人,1到N报数出列问题
来源: 作者:

*/ --------------------------------------------------------------------------------------
*/ 出自: 编程中国  http://www.bc-cn.net
*/ 作者: josen0205        QQ:7007873
*/ 时间: 2007-10-23  编程论坛首发
*/ 声明: 尊重作者劳动,转载请保留本段文字
*/ --------------------------------------------------------------------------------------


/*************************************************************/
/*       M个人围成一圈,从1至N开始顺序循环报数                */
/*       每数到N的人出列,输出该数值,直至全部输出             */
/*************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

/* 循环链表结构 */
typedef struct Node{
    int data;
    struct Node *next;
}*LinkList;

/* 利用单向循环链表找到符合条件的节点,输出节点值并删除该节点 */
int CreateList(LinkList &L,int m); /* 将m个人1到m编号依次插入循环链表L中 */
int GetNode(LinkList &L,int n); /* 依次删除输出链表中符合要求的节点 */

int CreateList(LinkList &L,int m)
{
    int i=1;
    LinkList tmp,p;
    /* 给链表头指针分配内存 */
    L=(LinkList)malloc(sizeof(struct Node));    
    if(L==NULL)
    {
        printf("动态分配内存失败!");
        return -1;
    }
    p=L;
    for(i=1;i<=m;i++) /* 依次为节点分配内存,插入链表 */
    {
        tmp=(LinkList)malloc(sizeof(struct Node));
        if(tmp==NULL)
        {
            printf("动态分配内存失败!");
            return -1;
        }
        /* 将节点tmp插入链表 */
        tmp->data=i;
        p->next=tmp;
        p=tmp;
    }
    tmp->next=L->next; /* 最后一个节点next指针指向第一个节点 */
    return 0;
}

int GetNode(LinkList &L,int n)
{
    LinkList p,s;
    int i=0;
    p=L->next; /* p指向第一个节点 */
    while(p->next!=p) /* 链表中只有一个节点时终止 */
    {
        i++;
        if(i==n-1) /* 找到报数n的节点,输出节点值并删除节点,计数器i归位 */
        {
            s=p->next;
            p->next=p->next->next;
            printf("%d ",s->data);
            i=0;
            free(s);
        }
        p=p->next;
    }
    printf("%d ",p->data); /* 输出最后一个节点,并释放其内存 */
    free(p);
    free(L); /* 释放头节点内存 */
    return 0;
}

int main()
{
    int m,n;
    LinkList L;

    printf("Enter the total number of the person[m]:"); /* 总人数 */
    scanf("%d",&m);
    printf("Enter the number of get out[n]:");
    scanf("%d",&n);
    CreateList(L,m);
    printf("The out queue is:\n");
    GetNode(L,n);

    getch();
    return 0;
}


上一篇:用地址替代变量的讨论   下一篇:浅谈递归机制和非递归转换
[收藏] [推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
用户名: 新注册) 密码: 匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
 §最新评论
  热点文章
·C语言数组排序小结
·Python 与 C++ 程序的简单实例对
·c++ 数组与指针
·C++中的内存管理(new、delete、
·如何用C语言开发DSP嵌入式系统
·如何用C语言开发DSP嵌入式系统
·Linux下C语言编程
·学习arm的话先看哪本书?
·C++初学者应该关心的优秀图书一
·利用C语言小程序来解决大问题
·用C语言写PHP扩展的步骤
·用C语言扩展PHP功能
  相关文章
·用地址替代变量的讨论
·浅谈递归机制和非递归转换
·宏比函数实现在时间上的优越性探
·函数的可变参数详谈
·爱因斯坦难题的C语言程序设计
·输入一行字符 统计字符 C语言
·对const使用的理解
·C语言实现 恺撒加密法
·斐波那挈数列 C语言实现
·求最大数函数
·二维数组打印菱形 C语言
·static变量举例
  相关信息
copy right @ 百家拳软件项目研究室 2007 辽ICP备07011763