| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1391 人关注过本帖
标题:请教:约瑟夫环(用循环链表写的,但输出有错误,大家帮忙看看)
取消只看楼主 加入收藏
Alen0128
Rank: 4
等 级:业余侠客
帖 子:171
专家分:222
注 册:2009-12-26
结帖率:76.19%
收藏
已结贴  问题点数:10 回复次数:8 
请教:约瑟夫环(用循环链表写的,但输出有错误,大家帮忙看看)
这是我的代码(我输出的是人的编号):

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

typedef struct Node
{
    int password;
    int sequence;
    struct Node* next;
}Link;

Link* Creat(Link* head, int* sequence);
Link* Find(Link* head, int password);
Link* Delete(Link* head, Link* target);


int main()
{
    int sequence = 0;                    //人的编号
    int password = 0;                    //每人手中的密码
    int* pSequence = &sequence;
    Link* pHead = NULL;
    Link* pTarget = NULL;

    pHead = Creat(pHead,pSequence);

    printf("Please input a password:");
    scanf("%d",&password);
    pTarget = Find(pHead,password);
    printf("%d->",pTarget->sequence);
    password = pTarget->password;
    pHead = Delete(pHead,pTarget);

    while (pHead != NULL)
    {
        pTarget = Find(pHead,password);
        printf("%d->",pTarget->sequence);
        password = pTarget->password;
        pHead = Delete(pHead,pTarget);
    }

    return 0;
}


Link* Creat(Link* head, int* sequence)
{
    Link* pNewNode = NULL;
    Link* pIter = NULL;
    int password = 0;
   
    while (scanf("%d",&password) != EOF)
    {
        pNewNode = (Link*)malloc(sizeof(Link));                  
        pNewNode->password = password;
        pNewNode->next = NULL;

        if (head == NULL)
        {
            head = pNewNode;
        }
        else
        {
            for (pIter=head; pIter->next!=NULL; pIter=pIter->next)   
            {
                continue;
            }
            
            *sequence = *sequence + 1;
            pIter->next = pNewNode;
            pIter->sequence = *sequence;
        }
    }

    pNewNode->next = head;   

    return head;
}

Link* Find(Link* head, int password)
{
    int length = 1;
    Link* pIter = NULL;

    for (pIter=head; length!=password; pIter=pIter->next)
    {
        length++;
    }
   
    length = 0;

    return pIter;   
}

Link* Delete(Link* head, Link* target)
{
    Link* pIter = NULL;

    for (pIter=head; pIter->next!=target; pIter=pIter->next)
    {
        continue;
    }

    if (target->next == pIter)
    {
        printf("%d\n",target->sequence);
        head = NULL;
    }
    else
    {
        pIter->next = target->next;
        head = target->next;
    }
   
    free(target);

    return head;
}
搜索更多相关主题的帖子: 输出 链表 约瑟夫 
2010-02-22 11:46
Alen0128
Rank: 4
等 级:业余侠客
帖 子:171
专家分:222
注 册:2009-12-26
收藏
得分:0 
回复 3楼 cnfarer
大哥,改的地方可不可以用红字啊,我怕看不全,漏过了

-不想让你发现我 凌乱的脚步 ,我努力 跟上你的速度
2010-02-23 15:32
Alen0128
Rank: 4
等 级:业余侠客
帖 子:171
专家分:222
注 册:2009-12-26
收藏
得分:0 
回复 3楼 cnfarer
再说,你改的也不对啊,运行错误

-不想让你发现我 凌乱的脚步 ,我努力 跟上你的速度
2010-02-23 15:34
Alen0128
Rank: 4
等 级:业余侠客
帖 子:171
专家分:222
注 册:2009-12-26
收藏
得分:0 
知道这个程序在干什么,谢谢。
我的操作和你一样,环境也一样,但你输出的内容怎么不全?
我的意图是输出出列的顺序

-不想让你发现我 凌乱的脚步 ,我努力 跟上你的速度
2010-02-23 16:24
Alen0128
Rank: 4
等 级:业余侠客
帖 子:171
专家分:222
注 册:2009-12-26
收藏
得分:0 
假设我输入:2,1,3,2,3;第一次密码是1
那出列顺序应该是1->3->2->4->5
但是你的不是啊

-不想让你发现我 凌乱的脚步 ,我努力 跟上你的速度
2010-02-23 16:39
Alen0128
Rank: 4
等 级:业余侠客
帖 子:171
专家分:222
注 册:2009-12-26
收藏
得分:0 
回复 12楼 cnfarer
我delete完了以后,就赋给新的head了

-不想让你发现我 凌乱的脚步 ,我努力 跟上你的速度
2010-02-23 17:55
Alen0128
Rank: 4
等 级:业余侠客
帖 子:171
专家分:222
注 册:2009-12-26
收藏
得分:0 
回复 12楼 cnfarer
我就是一初学者,这个问题第一次接触,见谅了

-不想让你发现我 凌乱的脚步 ,我努力 跟上你的速度
2010-02-23 17:56
Alen0128
Rank: 4
等 级:业余侠客
帖 子:171
专家分:222
注 册:2009-12-26
收藏
得分:0 
我的原题和你的有点不同,我的原题是:N个人围成一个环,每个人手里一个密码;第一个密码随机定,遍历到对应人之后,该人退出,他手中的密码作为新密码,从下一个人开始再次循环;依次循环直到全部出列

-不想让你发现我 凌乱的脚步 ,我努力 跟上你的速度
2010-02-23 18:30
Alen0128
Rank: 4
等 级:业余侠客
帖 子:171
专家分:222
注 册:2009-12-26
收藏
得分:0 
回复 19楼 cnfarer
这个是循环链表,所以我感觉应该可以循环下去,只是环中如果只剩下一个人的时候,我处理不好,结果是指针指飞了;
你说的限制条件不怎么明白

-不想让你发现我 凌乱的脚步 ,我努力 跟上你的速度
2010-02-24 10:50
快速回复:请教:约瑟夫环(用循环链表写的,但输出有错误,大家帮忙看看)
数据加载中...
 
   



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

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