| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 634 人关注过本帖
标题:[求助]13个数字,隔2去1,输出最后剩下的数
只看楼主 加入收藏
liqingyang
Rank: 2
等 级:论坛游民
帖 子:47
专家分:39
注 册:2010-2-24
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:6 
[求助]13个数字,隔2去1,输出最后剩下的数
13人围一圈,从第1人开始报数,凡报到3者退出圈子,找出最后留在圈中的人原来的序号.

/*13个数字,隔2去1,输出最后剩下的数*/
#define    STU    struct stu
#define    LEN    sizeof(struct stu)
STU
{   
    int    num;
    STU*    next;
};/*申请结构链表*/
STU*    cart(int n)/*建立一个n个结点的链表*/
{
    int    i;
    STU    *head,*pd,*pf;
    for(i=1;i<=n;i++)
    {
        pd=(STU*)malloc(LEN);/*申请一块内存,用于存放一个结点*/
        pd->num=i;
        
        if(i==0)
            pf=head=pd;/*如果产生的是第一个结点,则head指向该结点*/
        else
            pf->next=pd;
        pd->next=NULL;
        pf=pd;
    }
    pf->next=head;
    return head;/*返回表头*/
}
void main()
{
    int    i,n;
    STU    *pl,*pt;
    printf("请输入链表成员的个数");
    scanf("%d",&n);
    pl=cart(n);
   
    while(pl->next != pl)/*链表中结点的个数不为1时*/
    {
        for(i=0;i<3;i++)
        {
            pt=pl;
            pl=pl->next;
        }
        pt->next=pl->next;
        free(pl);/*释放被删节点内存*/
    }
    printf("%d",pl->num);
   
    return;
}

编译提示:    Erroy:Undefined symbol 'NULL'    未定义的符号"NULL"

求各位指点是怎么回事?
搜索更多相关主题的帖子: 数字 输出 
2010-05-05 19:41
a910317930
Rank: 2
等 级:论坛游民
帖 子:5
专家分:17
注 册:2009-4-8
收藏
得分:2 
没有头文件
加上

#include "iostream.h"
#include "stdlib.h"
#include "stdio.h"


编译就能通过了   不过好像
cart()   有点问题   
不会链表
2010-05-05 20:56
liqingyang
Rank: 2
等 级:论坛游民
帖 子:47
专家分:39
注 册:2010-2-24
收藏
得分:0 
加上头文件
#include "stdlib.h"
#include "stdio.h"
编译通过了,但运行结果是0,晕.
2010-05-05 21:20
jcslt
Rank: 8Rank: 8
来 自:90-xx.com
等 级:蝙蝠侠
帖 子:251
专家分:975
注 册:2009-10-10
收藏
得分:0 
把你的cart()修改了下,代码如下:
程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define    STU    struct stu
#define    LEN    sizeof(struct stu)
STU
{
    int    num;
    STU*    next;
};/*申请结构链表*/
STU*    cart(int n)/*建立一个n个结点的环形单向链表*/
{
    int    i;
    STU    *head=NULL,*pd=NULL;
    if(0 != n)
    {
        pd=(STU *)malloc(n*sizeof(STU));
        memset(pd,0,n*sizeof(STU));
        head=pd;
        for(i=1;i<n;i++)
        {
            pd->num=i;
            pd->next=pd+1;
            pd=pd->next;
        }
        pd->num=n;
        pd->next=head;
    }
    return head;
}
int main()
{
    int    i,n;//m
    STU    *pl;// *pt;
    printf("请输入链表成员的个数:\n");
    scanf("%d",&n);
    //scanf("%d%d",&n,&m);n=13,m=3
    pl=cart(n);
    //pt=pl;
    while(pl->next != pl)/*链表中结点的个数不为1时*/
    {
        for(i=1;i<2;i++)//i<m-1
        {
            pl=pl->next;//取到报到m-1的结点
        }
        pl->next=pl->next->next;//删除报到m的那个结点
        pl=pl->next;            //
    }
    printf("%d\n",pl->num);
    free(pl); /*先输出后释放,释放被删节点内存*/
    return 0;
}

www.
2010-05-05 22:08
little樟
Rank: 1
等 级:新手上路
帖 子:14
专家分:7
注 册:2010-3-25
收藏
得分:5 
#include <stdio.h>
#define N 100
void main(){
    int a[N]={0},i,n;
    int *p;
    void qusan(int *p,int n);
    printf("总共有几个人(小于等于100):");
    scanf("%d",&n);
    p=a;
    qusan(p,n);
    for(i=0;i<n;i++){
        if(a[i]==0)break;}
    printf("剩下的是第%d个人\n",i+1);
}

void qusan(int *p,int n){
    int i,m=0,t;
    t=n;
    while(t>1){
        for(i=0;i<n;i++){
            if(*(p+i)==0)m++;
            if(m==3){*(p+i)=1;m=0;t--;}
        }
    }
}
            
   

            
        我的
2010-05-05 23:28
liqingyang
Rank: 2
等 级:论坛游民
帖 子:47
专家分:39
注 册:2010-2-24
收藏
得分:0 
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define    STU    struct stu
#define    LEN    sizeof(struct stu)
STU
{
    int    num;
    STU*    next;
};/*申请结构链表*/
STU*    cart(int n)/*建立一个n个结点的环形单向链表*/
{
    int    i;
    STU    *head=NULL,*pd=NULL;
    if(0 != n)  //这里为什么用if,怎么实现循环?这句话是什么意思?
    {
        pd=(STU *)malloc(n*sizeof(STU));//这句里的 n* 是什么意思?
        memset(pd,0,n*sizeof(STU));//这句话有什么作用?
        head=pd;
        for(i=1;i<n;i++)
        {
            pd->num=i;
            pd->next=pd+1;
            pd=pd->next;
        }
        pd->num=n;
        pd->next=head;
    }
    return head;
}
int main()
{
    int    i,n;//m
    STU    *pl;// *pt;
    printf("请输入链表成员的个数:\n");
    scanf("%d",&n);
    //scanf("%d%d",&n,&m);n=13,m=3
    pl=cart(n);
    //pt=pl;
    while(pl->next != pl)/*链表中结点的个数不为1时*/
    {
        for(i=1;i<2;i++)//i<m-1    //这句里为什么只循环一次?不是要求隔2去1吗?
        {
            pl=pl->next;//取到报到m-1的结点
        }
        pl->next=pl->next->next;//删除报到m的那个结点
        pl=pl->next;            //
    }
    printf("%d\n",pl->num);
    free(pl); /*先输出后释放,释放被删节点内存*/
    return 0;
}

求各位帮小弟解释一下上面红色标注语句的含义,初学看不懂,感激不尽..
2010-05-08 23:38
jcslt
Rank: 8Rank: 8
来 自:90-xx.com
等 级:蝙蝠侠
帖 子:251
专家分:975
注 册:2009-10-10
收藏
得分:13 
程序代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* 结构体和函数声明 */
typedef struct node
{
    int       n_num;
    struct node *next;
} node_t;

node_t *node_t_create(int n);

/*构造节点数量为 n 的环形单向链表*/
node_t * node_t_create(int n)//n>0,人为控制if(0!=n)可以去掉了
{
    node_t *p_ret   = NULL;//算是一种好习惯吧
    node_t *p_node  = NULL;
    int     n_idx   = 1;

    /* 分配 n 个连续的node_t空间*/
    p_node = (node_t *) malloc(n * sizeof(node_t));
    if (NULL == p_node)//确保内存空间申请成功
        return NULL;
    else
        memset(p_node,0, n * sizeof(node_t));//初始化
                                            //设置每一个结点的n_num为0
    /*for(int i=0;i<n;i++)
        (*(p_node+i)).n_num=0;*///相当于memset的功能
    p_ret = p_node;
    /*赋值数组1,2,3...构造链表*/
    for (; n_idx < n; n_idx++)
    {
        p_node->n_num = n_idx;
        p_node->next = p_node + 1;
        p_node = p_node->next;
    }
    p_node->n_num = n;
    p_node->next = p_ret;

    return p_ret;//返回头结点
}

int main()
{
    int     n, m;
    node_t *p_list, *p_iter;
    scanf("%d%d",&n,&m);

    /* 构造环形单向链表 */
    p_list = node_t_create(n);

    /* 循环取数 */
    p_iter = p_list;
    m %= n;
    while (p_iter != p_iter->next)
    {
        int i   = 1;

        /* 取到第 m-1 个节点 */
        for (; i < m - 1; i++)
        {
            p_iter = p_iter->next;
        }

        /* 输出第 m 个节点的值 */
        printf("%d\n", p_iter->next->n_num);

        /* 从链表中删除第 m 个节点 */
        p_iter->next = p_iter->next->next;
        p_iter = p_iter->next;
    }
    printf("%d\n", p_iter->n_num);
    free(p_list);
    return 0;
}

www.
2010-05-09 00:06
快速回复:[求助]13个数字,隔2去1,输出最后剩下的数
数据加载中...
 
   



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

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