Witam! Mam problem z programem, mianowicie podczas sprawdzania w funkcji graj istnienia pary na podstawie listy jednokierunkowej, program widzi w niej jedynie dwa elementy. Lista tworzy się poprawnie, sprawdzałem ją w oddzielnym programie.
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <ctime>
using namespace std;
struct Pary{
string wyraz1;
string wyraz2;
Pary *next;
};
int ile_par(){
int a;
cout<<"Ile chcesz miec par w grze? (minimum 3) ";
cin>>a;
/* while (a<3){
cout<<"Podano za mala wartosc. Minimalna wartosc par to 3. Podaj wlasciwa ilosc par ";
cin>>a;
}*/
return a;
}
int *tworz (int w){
int *tab=new int[w];
return tab;
}
void nr_wierszy (int tab[], int w, int kp){
int pom1=(0+(kp-1))*rand()/RAND_MAX;
tab[0]=pom1;
int ile=1;
for (int i=1; i<w; i++){
int pom;
pom=(0+(kp-1))*rand()/RAND_MAX;
bool is=false;
while (is!=true){
for (int j=0; j<ile; j++){
if (pom==tab[j]) {is=false; break;}
else is=true;
}
if (is==false) pom=(0+(kp-1))*rand()/RAND_MAX;
}
tab[i]=pom;
ile++;
}
}
string *tworz2 (int k){
string *tab=new string[k];
return tab;
}
void wczytaj_dane (string tab1[], string tab2[], string nazwa_pliku, int w, int tab3[]/*, Pary *&glowa*/){
ifstream dane;
//Pary *aktualny;
//glowa=NULL;
int ile;
for(int i=0; i<w; i++){
dane.open(nazwa_pliku.c_str());
string dane1, dane2;
ile=-1;
do{
dane>>dane1>>dane2;
ile++;
}while (ile!=tab3[i]);
tab1[i]=dane1;
tab2[i]=dane2;
/* aktualny = new Pary;
aktualny->wyraz1=dane1;
aktualny->wyraz2=dane2;
aktualny->next=glowa;
glowa=aktualny;*/
dane.clear();
dane.close();
}
}
Pary *utworz_liste(/*Pary *&glowa, */string tab1[], string tab2[], int w){
Pary *aktualny, *temp, *glowa;
aktualny=NULL;
glowa=NULL;
for (int i=0; i<w; i++) {
temp=aktualny;
aktualny = new Pary;
aktualny-> wyraz1=tab1[i];
aktualny-> wyraz2=tab2[i];
aktualny-> next = NULL;
if(temp==NULL) glowa=aktualny;
else temp->next=aktualny;
}
return glowa;
}
void wymieszaj_druga_tabele (int tab1[], string tab2[], string tab3[], int w){
for (int i=0; i<w; i++){
tab3[tab1[i]]=tab2[i];
}
}
void graj(string tab1[], string tab2[], Pary *glowa, int &znalezionych_par, int &ile_ruchow, int w){
bool is;
Pary *pocz;
pocz=glowa;
for(int i=0; i<w;){
int karta1, karta2;
cout<<"Podaj numer pierwszej karty ";
cin>>karta1;
while(tab1[(karta1)-1]=="0"){
cout<<"Blad, podales uzyta karte. Wybierz inna. ";
cin>>karta1;
}
cout<<"Wybrales karte "<<tab1[(karta1)-1]<<endl;
cout<<"Podaj numer drugiej karty ";
cin>>karta2;
while(tab2[(karta2)-1]=="0"){
cout<<"Blad, podales uzyta karte. Wybierz inna. ";
cin>>karta2;
}
cout<<"Wybrales karte "<<tab2[(karta2)-1]<<endl;
ile_ruchow++;
is=false;
if(tab1[(karta1)-1]==glowa->wyraz1 && tab2[(karta2)-1]==glowa->wyraz2){
tab1[(karta1)-1]="0";
tab2[(karta2)-1]="0";
is=true;
znalezionych_par++;
}
else{
do{
glowa=glowa->next;
if(tab1[(karta1)-1]==glowa->wyraz1 && tab2[(karta2)-1]==glowa->wyraz2){
tab1[(karta1)-1]="0";
tab2[(karta2)-1]="0";
is=true;
znalezionych_par++;
}
//glowa=glowa->next;
}while(glowa==NULL);
}
glowa=pocz;
if (is==true) cout<<"Brawo! Znalazles pare!"<<endl;
else cout<<"Niestety, pomyliles sie. Sprobuj jeszcze raz"<<endl;
i=znalezionych_par;
}
}
void usun(Pary *&glowa){
Pary *pom;
do{
pom=glowa;
glowa=glowa->next;
delete pom;
}while(glowa==NULL);
}
int main(){
srand(time(NULL));
int liczba_par;
int *wybr_wiersze, *wymieszane_wiersze;
string *wyrazy1, *wyrazy2, *wyrazy3;
Pary *poczatek;
// poczatek=new Pary;
int ruchy=0;
int znalezione=0;
liczba_par=ile_par();
wybr_wiersze=tworz(liczba_par);
wymieszane_wiersze=tworz(liczba_par);
nr_wierszy (wybr_wiersze, liczba_par, 19);
nr_wierszy (wymieszane_wiersze, liczba_par, liczba_par);
wyrazy1=tworz2(liczba_par);
wyrazy2=tworz2(liczba_par);
wyrazy3=tworz2(liczba_par);
wczytaj_dane (wyrazy1, wyrazy2, "C://Memory/a.txt", liczba_par, wybr_wiersze/*, poczatek*/);
poczatek=utworz_liste(/*poczatek, */wyrazy1, wyrazy2, liczba_par);
wymieszaj_druga_tabele (wymieszane_wiersze, wyrazy2, wyrazy3, liczba_par);
graj (wyrazy1, wyrazy3, poczatek, znalezione, ruchy, liczba_par);
cout<<"Znalazles "<<znalezione<<" par w "<<ruchy<<" ruchach"<<endl;
cout<<"Twoj wynik to "<<(znalezione*20)-ruchy<<endl;
delete []wybr_wiersze;
delete []wymieszane_wiersze;
delete []wyrazy1;
delete []wyrazy2;
delete []wyrazy3;
usun (poczatek);
return 0;
}