免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 942 | 回复: 0
打印 上一主题 下一主题

请高手们能帮忙指点一下,为什么会出现死循环? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-02-05 23:44 |只看该作者 |倒序浏览
是一个抽牌的游戏,是用链表实现的。
大致意思是:一开始输入一个parfait的数(就像10=1+2+3+4,或者15=1+2+3+4+5等等)
然后把牌分开想这样运算
例如总数是10
我第一次是(6,4)
然后(2,5,3) //每次都抽出一张牌放到一个第一位
就这样依次循环下去,如果抽到0张牌了就删除这个结点。
所以么后面就是(3,1,4,2)->(4,2,3,1)->(4,3,1,2)->(4,3,2,1)
直到最后能排成一个递减数列就完成了。

我写了个小原代码,是在LIUNX下的GCC编译通过的,可是出现死循环,不知道为什么,请高手们帮忙看看
学C++没多久还是个菜鸟,程序哪里要改进的地方请大家提出来,谢谢了。



Game.h:

#ifndef GAME_H
#define GAME_H

#include <iostream>
using namespace std;

struct tas
{
int iNbcartes;
struct tas *suivant;
};

struct jeu
{
int iNbTas;
tas *pPremier;
};

int verifie2 (int);
int saisir1 (void);
int saisir2 (int &);

void AjoutTas(jeu *,int);
void CreationJeu (jeu *,int);
int Affiche(jeu *);
int enlever(jeu *);
void FonctionMystere(jeu *);
bool verifier (jeu *);
void supprimer (tas *);

#endif


#include "Game.h"

int verifie2 (int iArg)
{
int iTmp=iArg;

int iIndice=1;
while (iTmp>0)
{
  iTmp-=iIndice;
  iIndice++;
}
if (iTmp==0)
  return iArg;
else
  return (iArg+1-iTmp-iIndice);
}

int saisir1 ()
{
int i;
cout <<"Entrez un nombre entier compris entre 0 et 10000:" <<endl;
do
{
  cin >>i;
}
while ((i<0)||(i>10000));

i=verifie2(i);
return i;
}

int saisir2 (int &iArg)
{
int i;

cout <<"Entrez un nombre entier compris entre 0 et " <<iArg <<endl;
do
{
  cin >>i;
}
while ((i<0)||(i>iArg));

iArg-=i;

return i;
}


void AjoutTas(jeu *pJeu,int iNbcartes)
{
tas *nouv;
nouv=new tas;

nouv->iNbcartes=iNbcartes;
pJeu->iNbTas++;
nouv->suivant=pJeu->pPremier;
pJeu->pPremier=nouv;
}

void CreationJeu (jeu *pJeu,int iN)
{
int iNbcartes;

while (iN>0)
{
  iNbcartes=saisir2(iN);
  AjoutTas(pJeu,iNbcartes);
}
}

int Affiche(jeu *pJeu)
{
tas *tmp;
tmp=new tas;

tmp=pJeu->pPremier;
cout <<"( ";
while (tmp!=NULL)
{
  cout <<tmp->iNbcartes <<" ";
  tmp=tmp->suivant;
}
cout <<")" <<endl;

delete tmp;
return 0;
}

int enlever(jeu *pJeu)
{
int i=0;
tas *tmp;
tmp=new tas;
tmp=pJeu->pPremier;

while (tmp!=NULL)
{
  cout <<"abcd" <<endl;
  tmp->iNbcartes--;
  cout <<tmp->iNbcartes <<endl;
  tmp=tmp->suivant;
  i++;
}
cout <<i <<endl;

delete tmp;
return i;
}

void FonctionMystere(jeu *pJeu)
{
tas *pTas,*pTasBis;

pTas=pJeu->pPremier;
while (pTas!=NULL)
{
  while (pTas->iNbcartes==0)
  {
   pJeu->pPremier=pTas->suivant;
   pJeu->iNbTas--;
   delete pTas;
   pTas=pJeu->pPremier;
  }

  pTasBis=pTas->suivant;
  if ((pTasBis!=NULL)&&(pTasBis->iNbcartes==0))
  {
   pTas->suivant=pTasBis->suivant;
   pJeu->iNbTas--;
   delete pTasBis;
  }
  else
   pTas=pTasBis;
  }
}

bool verifier (jeu *pJeu)
{
tas *tmp,*tmp1;
tmp=new tas;
tmp1=new tas;

tmp=pJeu->pPremier;
tmp1=pJeu->pPremier->suivant;
cout <<"dajkjda " <<endl;
while (tmp1!=NULL)
{
  //cout <<"dajkjda " <<endl;
  if (tmp->iNbcartes != tmp1->iNbcartes+1)
   break;
  else
  {
   tmp1=tmp1->suivant;
   tmp=tmp->suivant;
  }
}

if (tmp1==NULL)
  return true;
else
  return false;
}

void supprimer (tas *t)
{
tas *tmp;

while (t!=NULL)
{
  tmp=new tas;

  tmp=t;
  t=t->suivant;
  delete tmp;
}
}

main.cpp:

#include "Game.h"

int main()
{
int i,j,nombre;
jeu *pJeu1;
pJeu1=new jeu;

pJeu1->pPremier=NULL;
pJeu1->iNbTas=0;
i=saisir1();
CreationJeu(pJeu1,i);
j=Affiche(pJeu1);

while (verifier(pJeu1)==false);
{
  nombre=enlever(pJeu1);
  cout <<nombre <<endl;
  FonctionMystere(pJeu1);
  AjoutTas(pJeu1,nombre);
  j=Affiche(pJeu1);
}

supprimer(pJeu1->pPremier);
delete pJeu1;
return 0;
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP