Próbuję zlokalizować dlaczego program wypisuje zerowe wartości zmiennych. Problem leży prawdopodobnie w odczycie z pliku, ponieważ wywoływana jest funkcja wyszukaj z argumentem k1, gdzie k1 jest zmienną typu int wczytywaną z pliku. Dla sprawdzenia funkcja wypisuje wartość swojego argumentu i wtedy na ekranie pojawia się 0. Program jest trochę rozległy. W pliku tekstowym do odczytu znajdują się wypisane w jednej linii liczby 2001 13666 4 7 -1 100001.
#include <iostream>
#include <time.h>
#include <fstream>
#include <cstdlib>
using namespace std;
int x, k1, k2, k3, k4, k5, tab[2001], licznik = 0; // X wskazuje ilosc wylosowanych struktur, licznik to liczba elementow listy
struct element {
int klucz;
double d;
char c;
element * nastepny;
element * poprzedni;
};
struct Lista {
element * pierwszy;
element * ostatni;
} lista {NULL, NULL};
void odczyt_pliku(){
fstream plik;
plik.open("labin02.txt", ios::in);
if(plik.good()==false){
cout<<"Nie udalo sie odczytac pliku lub plik nie istnieje";
exit(0);
}
plik >>x>>k1>>k2>>k3>>k4>>k5;
plik.close();
}
/*
usun wszystko
*/
int losuj_int(){
int wylosowana, j;
if (licznik ==0){
wylosowana = rand()%10000-1000;
tab[licznik]=wylosowana;
licznik++;
}
else{
while(j<=licznik) {
wylosowana = rand()%10000-1000;
for(j = 0; j <=licznik; j++){
if(wylosowana == tab[j]){
break;
}
}
licznik++;
tab[licznik] = wylosowana;
}
}
return wylosowana;
}
double losuj_double(){
int losowa = rand()%10000-1000;
double wylosowana = losowa/100;
return wylosowana;
}
void wstaw_x_nowych(int X){
for(int i = 0; i<=X; i++){
if (licznik==0){ //przypadek gdy lista jest pusta
element*nowy = new element;//utworz element
nowy->c=(char)84;
nowy->d = losuj_double();
nowy->klucz = losuj_int();
lista.pierwszy = nowy;
lista.ostatni = nowy;
nowy->nastepny = nowy;
nowy->poprzedni = nowy;
licznik++;
}
else{//przypadek gdy lista nie jest pusta
element*nowy = new element;
nowy->c=(char)84;
nowy->d = losuj_double();
nowy->klucz = losuj_int();
if(nowy->klucz < lista.pierwszy->klucz){//przypadek gdy klucz nowego elementu jest mniejszy od pierwszego na liscie
nowy->nastepny = lista.pierwszy;
nowy->poprzedni = lista.ostatni;
lista.pierwszy->poprzedni = nowy;
lista.ostatni->nastepny = nowy;
lista.pierwszy = nowy;
licznik++;
}
if(nowy->klucz>lista.ostatni->klucz){//przypadek gdy klucz nowego elementu jest wiekszy od ostatniego na liscie
nowy->poprzedni = lista.ostatni;
nowy->nastepny=lista.pierwszy;
lista.ostatni->nastepny = nowy;
lista.pierwszy->poprzedni = nowy;
lista.ostatni = nowy;
licznik++;
}
else{//przypadek gdy klucz nowego elementu miesi sie miedzy pierwszym a ostatnim na liscie
element * wsk = lista.pierwszy;
while (wsk!=lista.ostatni){
if((nowy->klucz > wsk->klucz)&&(nowy->klucz < wsk->klucz)){
nowy->poprzedni=wsk;
nowy->nastepny=wsk->nastepny;
wsk->nastepny = nowy;
wsk->nastepny->poprzedni = nowy;
licznik++;
break;
}
wsk=wsk->nastepny;
}
}
}
}
cout<<endl<<"Dodano "<<X<<" nowych wezlow"<<endl;
}
void wstaw_nowy(int k){
element * wsk = lista.pierwszy;
while(wsk->nastepny != lista.pierwszy){
if(wsk->klucz == k){
cout<<"Element o kluczu "<<k<<" juz istnieje!"<<endl;
return;
}
wsk=wsk->nastepny;
}
element*nowy = new element;
nowy->c=(char)84;
nowy->d = losuj_double();
nowy->klucz =k;
if(nowy->klucz < lista.pierwszy->klucz){//przypadek gdy klucz nowego elementu jest mniejszy od pierwszego na liscie
nowy->nastepny = lista.pierwszy;
nowy->poprzedni = lista.ostatni;
lista.pierwszy->poprzedni = nowy;
lista.ostatni->nastepny = nowy;
lista.pierwszy = nowy;
licznik++;
}
if(nowy->klucz>lista.ostatni->klucz){//przypadek gdy klucz nowego elementu jest wiekszy od ostatniego na liscie
nowy->poprzedni = lista.ostatni;
nowy->nastepny=lista.pierwszy;
lista.ostatni->nastepny = nowy;
lista.pierwszy->poprzedni = nowy;
lista.ostatni = nowy;
licznik++;
}
else{//przypadek gdy klucz nowego elementu miesi sie miedzy pierwszym a ostatnim na liscie
element * wsk = lista.pierwszy;
while (wsk!=lista.ostatni){
if((nowy->klucz > wsk->klucz)&&(nowy->klucz < wsk->klucz)){
nowy->poprzedni=wsk;
nowy->nastepny=wsk->nastepny;
wsk->nastepny = nowy;
wsk->nastepny->poprzedni = nowy;
licznik++;
break;
}
wsk=wsk->nastepny;
}
}
}
int licz_wezly(){
int licznik2 = 0;
element * wsk = lista.pierwszy;
while(wsk->nastepny != lista.pierwszy){
licznik2++;
wsk=wsk->nastepny;
}
return licznik2;
}
void wyszukaj(int k){
element * wsk = lista.pierwszy;
int pozycja = 0;
while(wsk && wsk->klucz != k)
{
wsk = wsk->nastepny;
if(wsk == lista.pierwszy) {
cout<<endl<<"Szukany element nie istnieje"<<endl;
break;
return;
}
pozycja++;
}
cout<<endl<<"Szukany element o kluczu "<<k<<" znajduje sie na pozycji "<<pozycja<<endl;
}
void pokaz_pierwsze(int Y){
element * wsk = lista.pierwszy;
cout<<endl<<"Wartosci skladowych kluczowych pierwszych "<<Y<<" wezlow"<<endl;
for(int i=0; i<=Y; i++){
cout<<wsk->klucz<<endl;
wsk=wsk->nastepny;
}
}
void pokaz_ostatnie(int Z){
element * wsk = lista.ostatni;
cout<<endl<<"Wartosci skladowych kluczowych ostatnich "<<Z<<" wezlow"<<endl;
for(int i=0; i<=Z; i++){
cout<<wsk->klucz<<endl;
wsk=wsk->poprzedni;
}
}
void usun(int k){
element*wsk = lista.pierwszy;
for(int i=0; i<=licznik; i++){
if(wsk->klucz == k){//jezeli znaleziono element o poszukiwanym kluczu
if(wsk->klucz == lista.pierwszy->klucz){
lista.ostatni->nastepny=wsk->nastepny;
lista.pierwszy->nastepny->poprzedni = lista.ostatni;
wsk->nastepny = lista.pierwszy;
delete wsk;
licznik--;
break;
}
if(wsk->klucz == lista.ostatni->klucz){
wsk->poprzedni->nastepny=lista.pierwszy;
lista.pierwszy->poprzedni=wsk->poprzedni;
wsk->poprzedni = lista.ostatni;
delete wsk;
licznik--;
break;
}
else {
wsk->nastepny->poprzedni=wsk->poprzedni;
wsk->poprzedni->nastepny = wsk->nastepny;
delete wsk;
licznik--;
break;
}
}
else{//jezeli nie znaleziono porownania
cout<<endl<<"Nie mozna usunac elementu. Element o szukanym kluczu nie istnieje"<<endl;
break;
}
wsk=wsk->nastepny;
}
}
void usun_wszystko(){
cout<<endl<<"Usuwanie wszystkich elementow..."<<endl;
element*wsk = lista.pierwszy;
element*wsk2=wsk->nastepny;
while(wsk->nastepny!=lista.ostatni){
delete wsk;
wsk=wsk2;
licznik--;
}
delete wsk2;
licznik--;
cout<<endl<<"Liczba elementow po usunieciu: "<<licznik<<endl;
}
int main()
{
clock_t begin, end;
double time_spent;
begin = clock();
srand(time(NULL));
wyszukaj(k1);
end = clock();
time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
return 0;
}