| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1175 人关注过本帖
标题:初学者的问题
只看楼主 加入收藏
adminmaster
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2010-1-18
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:11 
初学者的问题
13个人围成一圈,从第一个人开始顺序报号1、2、3。凡报到3者退出圈子。找到最后留在圈子的人原来的序号。

老谭书上的一个题,我自己写了一段程序,但是运行结果不对。用的TC 2.01版本,求达人解答!!

# include "malloc.h"
# define NULL 0
# define LEN sizeof(struct student)

struct student
{
int num;
struct student *next;

};

int n;

struct student *creat()
{
struct student *head;
struct student *p1,*p2;
n=0;
p1=p2=( struct student * )malloc(LEN);
scanf("%ld", &p1->num);

head=NULL;
while(p1->num!=14)
{
   n=n+1;
   if(n==1) head=p1;
   else p2->next=p1;
   p2=p1;
   p1=(struct student *) malloc(LEN);
   scanf("%ld",&p1->num);
   }

p2->next=head;
return (head);
}



struct student *del(struct student *head )

{
struct student *p1,*p2;

p1=head;
n=0;
while(p1->next==NULL)
{
   n=n+1;
   p2=p1;
   p1=p1->next;

   if(n==3){p2->next=p1->next;p1=p1->next;n=0;}


   }
   return(p2);
}


int main()
{

   printf("%ld", del(creat()));
   return 0;
   }
搜索更多相关主题的帖子: next include 
2010-01-18 23:26
广陵绝唱
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:29
帖 子:3607
专家分:1709
注 册:2008-2-15
收藏
得分:0 
您已经建立了一个循环链表,为什么还要判断指针是否为空呢?在你的程序基础上改了一下,结果没验证.

程序代码:
# include <stdio.h>
# define NULL 0
# define LEN sizeof(struct student)

struct student
{
    int num;
    struct student *next;
};

int n;

struct student *creat()
{
    struct student *head;
    struct student *p1,*p2;
    n=0;
    p1=p2=( struct student * )malloc(LEN);
    p1->num=n+1;

    head=NULL;
    while(p1->num!=14)
    {
        n=n+1;
        if(n==1)
            head=p1;
        else
            p2->next=p1;
        p2=p1;
        p1=(struct student *) malloc(LEN);
        p1->num=n+1;
    }

    p2->next=head;
    return (head);
}



int del(struct student *head )

{
    struct student *p1,*p2,*tmp;
    int j=1;
    p1=head;
    while(n)//你的退出循环的条件不对
    {
        p2=p1;
        p1=p1->next;

        if(j++%3==0)
        {
            p2->next=p1->next;
            tmp=p1;
            p1=p1->next;
            if(--n)
                free(tmp);
        }


    }
    j=p2->num;
    free(p2);

    return(j);
}


int main()
{
    struct student *p;

    p=creat();
    printf("%ld", del(p));

    return 0;
}


2010-01-19 01:05
adminmaster
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2010-1-18
收藏
得分:0 
谢谢楼上的指教。
判断指针为空的目的是确定运行 del()之后 链表里面只剩最后一个节点。
你帮我修改的程序里面creat()为什么没有scanf()语句呢?还有就是你的del()函数里的while(n)里的N是个循环什么条件?
我运行你的程序得得结果是67305477。。。结果不对吧。
2010-01-19 14:16
广陵绝唱
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:29
帖 子:3607
专家分:1709
注 册:2008-2-15
收藏
得分:0 
1,循环链表指针不可能为空,所以判断是否剩一个节点的简单办法就是用变量;

2,while(n) 的意思为循环结束条件为 n 值为假;

3,一个一个输入太麻烦,所以就直接给它们赋值了;

4,至于结果,我现在没时间,一会看看是否有时间.

5,空间申请之后也得释放,一定要记住;

6,祝您学 C 愉快.
2010-01-19 15:08
广陵绝唱
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:29
帖 子:3607
专家分:1709
注 册:2008-2-15
收藏
得分:0 
    不知道楼主用的什么编译器,我的 GCC 能出正常结果.不过我的结果是错的,发现了一处错误,现已更正.


程序代码:
# include <stdio.h>
# define NULL 0
# define LEN sizeof(struct student)

struct student
{
    int num;
    struct student *next;
};

int n;

struct student *creat()
{
    struct student *head;
    struct student *p1,*p2;
    n=0;
    p1=p2=( struct student * )malloc(LEN);
    p1->num=n+1;

    head=NULL;
    while(p1->num!=14)
    {
        n=n+1;
        if(n==1)
            head=p1;
        else
            p2->next=p1;
        p2=p1;
        p1=(struct student *) malloc(LEN);
        p1->num=n+1;
    }

    p2->next=head;
    return (head);
}



int del(struct student *head )

{
    struct student *p1,*p2,*tmp;
    int j=1;
    p1=head;
    while(n>1)//你的退出循环的条件不对
    {
        if(j++%3==0)
        {
            p2->next=p1->next;
            tmp=p1;
            p1=p1->next;
            if(--n)
                free(tmp);
        }
        p2=p1;
        p1=p1->next;
    }
    j=p2->num;
    free(p2);

    return(j);
}


int main()
{
    struct student *p;

    p=creat();
    printf("%ld", del(p));

    return 0;
}

2010-01-19 22:28
adminmaster
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2010-1-18
收藏
得分:0 
我用的TC2.01。。。
哪种编译器好些?
2010-01-19 22:50
adminmaster
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2010-1-18
收藏
得分:0 
算了,不考虑这个了。我用TC 2.01得出的结果还是有问题。
不过还是很感谢帮助

2010-01-19 22:57
广陵绝唱
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:29
帖 子:3607
专家分:1709
注 册:2008-2-15
收藏
得分:20 
终于找出是什么问题了,问题出在你最后输出的是 %ld 型,而函数返回值为 int 型.现把问题更正,如下代码,在 win-tc 2.0 中结果正确.

程序代码:
# include <stdio.h>
#include<malloc.h>
# define NULL 0
# define LEN sizeof(struct student)

struct student
{
    int num;
    struct student *next;
};

int n;

struct student *creat()
{
    struct student *head;
    struct student *p1,*p2;
    n=0;
    p1=p2=( struct student * )malloc(LEN);
    p1->num=n+1;

    head=NULL;
    while(p1->num!=14)
    {
        n=n+1;
        if(n==1)
            head=p1;
        else
            p2->next=p1;
        p2=p1;
        p1=(struct student *) malloc(LEN);
        p1->num=n+1;
    }

    p2->next=head;
    return (head);
}



int del(struct student *head )

{
    struct student *p1,*p2,*tmp;
    int j=1;
    p1=head;
    while(n>1)
    {
        if(j++%3==0)
        {
            p2->next=p1->next;
            tmp=p1;
            p1=p1->next;
            if(--n)
                free(tmp);
        }
        p2=p1;
        p1=p1->next;
    }
    j=p2->num;
    free(p2);

    return(j);
}


int main()
{
    struct student *p;

    p=creat();
    printf("%d", del(p));
    getchar();
    return 0;
}
2010-01-20 01:48
你们都要疼我哦
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:火星
等 级:贵宾
威 望:49
帖 子:1296
专家分:2746
注 册:2008-7-13
收藏
得分:0 
广陵绝响版主真热心。楼主不要轻易算了啊,

小妹,哥哥看你骨骼清奇,绝非凡人,将来必成大业,不如这样,你先把裤裤脱了,待哥哥为你开启灵窍,然后我们一起努力钻研如何
2010-01-20 02:17
hqdvista
Rank: 1
等 级:新手上路
帖 子:5
专家分:2
注 册:2009-11-24
收藏
得分:0 
这个题这么麻烦。。。晕。。。还得用上链表的说。。。
2010-01-20 10:49
快速回复:初学者的问题
数据加载中...
 
   



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

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