以文本方式查看主题

-  计算机科学论坛  (http://bbs.xml.org.cn/index.asp)
--  『 C/C++编程思想 』  (http://bbs.xml.org.cn/list.asp?boardid=61)
----  约瑟夫问题运行出错  (http://bbs.xml.org.cn/dispbbs.asp?boardid=61&rootid=&id=41117)


--  作者:fangel2000
--  发布时间:12/11/2006 10:35:00 PM

--  约瑟夫问题运行出错
如果大家有兴趣的话,不妨来看看我写的约瑟夫问题,运行的时候出现问题,不知道哪位大侠帮忙修改一下.

源程序:

/*约瑟夫问题求解*/
#include <iostream.h>

struct Jnode{
int number;     //每个人的编号
int pwd;        //每个人的密码
Jnode *next;    //下一个节点的地址
};

Jnode CreateJnode(int n)    //建立一个带头节点和n个元素节点解约瑟夫问题的循环链表
{
Jnode *head = new Jnode;
Jnode *q = head;
int k;
for(int i = 0; i < n; i++)
{
  Jnode *p = new Jnode;
  p->number = i;
  cout<<"enter pwd: ";
  cin>>k;
  p->pwd = k;
  q->next = p;
  q = p;
}
q->next = head;
return *head;
}

void FCDJnode(Jnode *head,int m)   //在循环链表中查找,输出,和删除密码为m的节点
{
Jnode *p,*q;
p = head;
while(head->next != head)
{
  int j = 1;
  while(j < m)
  {
   p = p->next;
   if(p->next == head)         //头节点,则跳过
    p = p->next;
   j++;
  }
  q = p->next;
  cout<<"出列人的编号为: "<<q->number;
  m = q->pwd;
  p->next = q->next;
  if(p->next == head)     //头节点,则跳过
   p = p->next;
}
}


void main()
{
Jnode head = CreateJnode(4);     //创建4个节点的循环链表
cout<<endl;
int n;
cout<<"请输入第一个人的密码:";
cin>>n;
FCDJnode(&head,n);
}


--  作者:卷积内核
--  发布时间:12/12/2006 2:23:00 PM

--  
Jnode *head

head->next != head///不成立

新定义的链表地址永远不会和你之前创建的地址相同啊。


--  作者:longshentailang
--  发布时间:12/12/2006 3:02:00 PM

--  
创建了4个节点的循环链表后,应该返回链表的地址值,而不是*head。
--  作者:fangel2000
--  发布时间:12/12/2006 8:48:00 PM

--  
以下是引用longshentailang在2006-12-12 15:02:00的发言:
创建了4个节点的循环链表后,应该返回链表的地址值,而不是*head。

返回链表的地址值?什么意思啊?难道不是返回*head吗?
还请告知


--  作者:longshentailang
--  发布时间:12/12/2006 9:29:00 PM

--  

具体修改的代码如下所示:
#include <iostream.h>

struct Jnode{
 int number;     //每个人的编号
 int pwd;        //每个人的密码
 Jnode *next;    //下一个节点的地址
};

//修改处
Jnode *CreateJnode(int n)    //建立一个带头节点和n个元素节点解约瑟夫问题的循环链表
{
 Jnode *head = new Jnode;
 Jnode *q = head;
 
 int k;
 for(int i = 0; i < n; i++)
 {
  Jnode *p = new Jnode;
     p->number = i;
     cout<<"enter pwd: ";
     cin>>k;
     p->pwd = k;
     q->next = p;
     q = p;
 }
 
 q->next = head;
        //修改处
 return head;
}

void FCDJnode(Jnode *head,int m)   //在循环链表中查找,输出,和删除密码为m的节点
{
 Jnode *p,*q;
 p = head;
 while(head->next != head)
 {
  int j = 1;
  while(j < m)
  {
   p = p->next;
   if(p->next == head)         //头节点,则跳过
    p = p->next;
   j++;
  }
  
  q = p->next;
  cout<<"出列人的编号为: "<<q->number;
  cout<<endl;

  m = q->pwd;

  p->next = q->next;
    
  if(p->next == head)     //头节点,则跳过
   p = p->next;
 }
}


void main()
{
        //修改处
 Jnode *head = CreateJnode(4);     //创建4个节点的循环链表
 cout<<endl;
 int n;
 cout<<"请输入第一个人的密码:";
 cin>>n;
        //修改处
 FCDJnode(head,n);
}
实际修改了4处。


--  作者:longshentailang
--  发布时间:12/12/2006 9:38:00 PM

--  
你的代码中的
return *head;
返回的实际上是头节点,而并非整个链表。
--  作者:fangel2000
--  发布时间:12/13/2006 6:17:00 PM

--  
哦,感谢你的帮助,这个程序我昨天晚上也调试出来了,谢谢了
我再来研究一下你修改的
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
66.406ms