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

#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
nonemaw
Rank: 1
等 级:新手上路
帖 子:1
专家分:4
注 册:2010-1-24
收藏
得分:4 
太复杂咯-,=··要简练一些~

#include  <stdio.h>
#define  N  100
#define  S  1
#define  M  10
int p[100], n, s, m ;
void WriteDat(void);
void Josegh(void)
{
  int i,j,k,s1,w;
  s1=s;
  for(i=1;i<=n;i++)  p[i-1]=i;
    for(i=n;i>=2;i--)
    {
      s1=(s1+m-1)%i;
      if(s1==0)  s1=i;
      w=p[s1-1];
      for(j=s1;j<=i-1;j++)  p[j-1]=p[j];
      p[i-1]=w;
    }
}
void main()
{
  m = M ;
  n = N ;
  s = S ;
  Josegh() ;
  WriteDat() ;
}
void WriteDat(void)
{
  int i ;
  FILE *fp ;
  fp = fopen("OUT99.DAT", "w") ;
  for(i = N - 1 ; i >= 0 ; i--)
  {
    printf("%4d ", p[i]) ; fprintf(fp, "%4d", p[i]) ;
    if(i % 10 == 0) { printf("\n") ; fprintf(fp, "\n") ;  }
  }
  fclose(fp) ;
}
2010-02-23 12:44
cnfarer
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:179
帖 子:3330
专家分:21157
注 册:2010-1-19
收藏
得分:0 
改了一下
程序代码:
#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("find first: %d->\n",pTarget->sequence);  
        password = pTarget->password;  
        pHead = Delete(pHead,pTarget);  
    }
    while (pHead != NULL)  
    {  
        pTarget = Find(pHead,password);  
        if (pTarget)  
        {  
            printf("find next: %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)  
        {  
            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 == pIter)  
    {  
        printf("%d\n",target->sequence);  
        head=NULL;  
    }  
    else  
    {  
        pIter->next = target->next;  
        head = target->next;  
    }  
  
    free(target);  
  
    return head;  
}  



[ 本帖最后由 cnfarer 于 2010-2-23 16:24 编辑 ]

★★★★★为人民服务★★★★★
2010-02-23 15:18
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
cnfarer
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:179
帖 子:3330
专家分:21157
注 册:2010-1-19
收藏
得分:0 
你用什么编译器啊?(我用的是VC)GCC也能通过啊!当然要注意输入的内容。输入过程中,必须输入一个整数作为密码,密码之间用空格或回车一次,最后一次回车后,CTRL+Z组合键回车结束

只修改了就是main()和find()两个函数,这是我的运行结果
图片附件: 游客没有浏览图片的权限,请 登录注册


顺便问一句,知道这个程序在做什么吗?

[ 本帖最后由 cnfarer 于 2010-2-23 16:19 编辑 ]

★★★★★为人民服务★★★★★
2010-02-23 16:04
Alen0128
Rank: 4
等 级:业余侠客
帖 子:171
专家分:222
注 册:2009-12-26
收藏
得分:0 
知道这个程序在干什么,谢谢。
我的操作和你一样,环境也一样,但你输出的内容怎么不全?
我的意图是输出出列的顺序

-不想让你发现我 凌乱的脚步 ,我努力 跟上你的速度
2010-02-23 16:24
cnfarer
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:179
帖 子:3330
专家分:21157
注 册:2010-1-19
收藏
得分:0 
是根据你的程序来改的并没有输出全部内容的地啊!(如果去掉你的注释TC2.0也能编译的啊):例子中是第3,6,10项啊,难道还有其他的出列项

[ 本帖最后由 cnfarer 于 2010-2-23 16:32 编辑 ]

★★★★★为人民服务★★★★★
2010-02-23 16:30
cnfarer
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:179
帖 子:3330
专家分:21157
注 册:2010-1-19
收藏
得分:0 
你把printf语句中的改回你原来的,那么显示可能更清楚些

★★★★★为人民服务★★★★★
2010-02-23 16:36
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
快速回复:请教:约瑟夫环(用循环链表写的,但输出有错误,大家帮忙看看)
数据加载中...
 
   



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

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