| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1391 人关注过本帖
标题:请教:约瑟夫环(用循环链表写的,但输出有错误,大家帮忙看看)
只看楼主 加入收藏
cnfarer
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:179
帖 子:3330
专家分:21157
注 册:2010-1-19
收藏
得分:6 
重新完善
#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);
    if (pTarget)
    {
        printf("%d->",pTarget->sequence);
        password = pTarget->password;
        pHead = Delete(pHead,pTarget);
    }

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

    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)
{

    Link* pIter = head;Link* pIter2=head;
    for (; pIter!= NULL&&pIter->password!=password; pIter=pIter->next)
        if (pIter->next==pIter2)
        {
            if (pIter->password==password)
            {
                return pIter;
            }
            return NULL;
        }

    return pIter;
}

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

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

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

    free(target);

    return head;
}

★★★★★为人民服务★★★★★
2010-02-23 16:59
cnfarer
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:179
帖 子:3330
专家分:21157
注 册:2010-1-19
收藏
得分:0 
以下是引用Alen0128在2010-2-23 16:39:31的发言:

假设我输入:2,1,3,2,3;第一次密码是1
那出列顺序应该是1->3->2->4->5
但是你的不是啊
你的sequence是这样的顺序啊(从head开始):1,2,3,4,0(最后一节点根本没有赋值啊)
你的delete已经改变了你 head,所以更得不到你所想要的结果。


我看不出来你的算法!!!

★★★★★为人民服务★★★★★
2010-02-23 17:20
cnfarer
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:179
帖 子:3330
专家分:21157
注 册:2010-1-19
收藏
得分:0 
你的算法与“约瑟夫环”相差甚远!!!

★★★★★为人民服务★★★★★
2010-02-23 17:22
cnfarer
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:179
帖 子:3330
专家分:21157
注 册:2010-1-19
收藏
得分:0 
http://www.

★★★★★为人民服务★★★★★
2010-02-23 17:24
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
幸运之星
Rank: 4
来 自:吉林
等 级:业余侠客
帖 子:275
专家分:239
注 册:2009-6-5
收藏
得分:0 
晕 啊这个程序有点麻烦的慢慢研究 顺便灌水一下 嘿嘿有时间肯定帮你看
现在是凌晨5点就不能帮你了
2010-02-24 05:03
cnfarer
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:179
帖 子:3330
专家分:21157
注 册:2010-1-19
收藏
得分:0 
回复 17楼 Alen0128
这个循环不一定能进行得下去啊,得有条件限制。否则不可能保证所有人出列!

★★★★★为人民服务★★★★★
2010-02-24 08:51
Alen0128
Rank: 4
等 级:业余侠客
帖 子:171
专家分:222
注 册:2009-12-26
收藏
得分:0 
回复 19楼 cnfarer
这个是循环链表,所以我感觉应该可以循环下去,只是环中如果只剩下一个人的时候,我处理不好,结果是指针指飞了;
你说的限制条件不怎么明白

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



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

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