Stos, strukturalnie, lista.

0

Witam, mam problem w kodzie. Podejrzewam, że chodzi o funkcję used. Wygląda na to, że operuję nie na tym co trzeba.

#include <iostream>
#include <cstdlib>
#include <windows.h>
#include <time.h>
using namespace std;

//Struktura
typedef struct Stos
{
	int data;
	Stos * next;
}*StosPtr;
//init
StosPtr init(StosPtr &C)
{
	int ile,liczba=rand() %51;
	C = new Stos;
	C->next = NULL;
	C->data = liczba;
	//
	cout << "Pierwszy element zostal stworzony z data " << liczba<< "." << endl;
	cout << "Ile struktur mam jeszcze wygenerowac? ";
	cin >> ile;
	cout << "" << endl;
	//
	for (int i = 0; i < ile; i++)
	{
		liczba = rand() % 51;
		cout << "Dodano nastepne powiazanie, data to " << liczba << "." << endl;
		Sleep(100);
		StosPtr obecny, nowy = new Stos;
		nowy->next = NULL;
		nowy->data = liczba;

		if (C != NULL)
		{
			obecny = C;
			C = nowy;
			C->next = obecny;
		}
	}
	//
	cout << "Init zostalo wykonane!";
	Sleep(1000);
	return C;
}
//Push
void push(StosPtr head, int liczba)
{
	StosPtr obecny, nowy = new Stos;
	nowy->next = NULL;
	nowy->data = liczba;

	if (head != NULL)
	{
		obecny = head;
		head = nowy;
		head->next = obecny;
	}
	else
	{
		head = nowy;
	}
}
//Pop
void pop(StosPtr &head)
{
	if (head == NULL)
	{
		cout << " Nic nie zdejmiesz bo nic nie ma.";
		Sleep(500);
	}
	else
	{
		StosPtr del;
		del = head;
		head = head->next;
		delete head;
	}
}
//Empty
void empty(StosPtr head)
{
	if (head == NULL)
	{
		cout << "Stos jest pusty!";
		Sleep(700);
	}
	else
	{
		cout << "Stos nie jest pusty!";
		Sleep(700);
	}
}
//top
void top(StosPtr head)
{
	if (head == NULL)
	{
		cout << "Stos jest pusty!";
		Sleep(500);
	}
	else
	{
		cout << "Liczba znajdujaca sie najwyzej to:" << head->data;
		Sleep(500);
	}
}
//destroy
void destroy(StosPtr &head)
{
	if (head != NULL)
	{
		int licznik = 0;
		while (head->next != NULL)
		{
			licznik++;
			head = head->next;
		}
		if (licznik = 0)
		{
			cout << "Stos jest pusty";
			Sleep(700);
		}
		else
		{
			for (int j = 0; j < licznik; j++)
			{
				cout << "Element: " << head->data << " zostal usuniety!" << endl;
				pop(head);
			}
		}
	}
}
//exit
void exit()
{
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 12);
	cout << "Koniec programu!";
	Sleep(2000);
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0);
}
//used
StosPtr used(StosPtr &A, StosPtr &B)
{
	StosPtr usedd;
	cout << "Na ktorym stosie chcesz dzialac? 1 lub 2." << endl;
	int stos;
	cin >> stos;
	if (stos == 1)
	{
		usedd = A;
	}
	else
	{
		usedd = B;
	}
	return usedd;
}
//main
int main()
{
	srand(time(NULL));
	StosPtr A=NULL, B=NULL, C=NULL;
	int liczba, wybor;
	do
	{
		system("CLS");
		cout << "1. Init" << endl;
		cout << "2. Push" << endl;
		cout << "3. Pop" << endl;
		cout << "4. Top" << endl;
		cout << "5. Empty" << endl;
		cout << "6. Destroy" << endl;
		cout << "0. Exit" << endl;
		cout << "Co wybierasz?" << endl;
		cin >> wybor;
		switch (wybor)
		{
		case 1://init
		{
			/*
			cout << "Stos 1 czy 2?" << endl;
			int wyborek;
			cin >> wyborek;
			if (wyborek == 1)
			{
				A = init(A);
			}
			else
			{
				B = init(B);
			}
			//Tak dziala
			*/
			C = used(A, B);
			init(C);
			break;
		}
		case 2://push
		{
			C = used(A, B);
			cout << "Podaj liczbe: ";
			cin >> liczba;
			push(C,liczba);
			break;
		}
		case 3://pop
		{
			C = used(A, B);
			pop(C);
			break;
		}
		case 4://top
		{
			C = used(A, B);
			top(C);
			break;
		}
		case 5://empty
		{
			C = used(A, B);
			empty(C);
			break;
		}
		case 6://destroy
		{
			C = used(A, B);
			destroy(C);
			break;
		}
		case 0://exit
		{
			exit();
		}
		default:
			cout << "POMYLKA!";
			Sleep(2000);
			break;
		}
	} while (wybor != 0);
	return 0;

}

Z góry dzięki za pomoc :).

0

było. Wiele razy.

0

No dobrze, ale nie znalazłem w końcu jak mam to zrobić.
Proszę tylko o wytłumaczenie co zrobić zeby funkcja used działała jak ja chcę :P.

@Edit : Pomoże ktoś?

0

Nie wiem czy mylisz wskaźniki z referencja czy po prostu nie wiesz jak się operuje na wskaźnikach. W obu przypadkach doczytaj o ty co wybrałeś. I pomysł jeszcze raz nad kodem bo to jest proste.

Zastanów się tez czy tą funkcja used fajnie wyglada bo jak dla mnie nie. Na więcej kodu nie patrzyłem

Też rada na przyszłość. Jeżeli chcesz żeby ludzie po przeczytaniu pierwszych dwóch zdań nie zamykali karty to zadawaj lepiej pytania.

0

Dziękuję za odpowiedzi. Nie mylę referencji (chyba lol), a zastosowanie & było moją ostatnią próbą.
Niestety użycie funkcji used zostało mi nałożone :P.
Tu się rodzi moje główne pytanie - co mam zrobić z tą funkcją used. Gdyby deklaracje A,B,C były globalne to by zadziałało co nie?

0

O tym jak ona wygląda chodziło mi o to, że jest tam niepotrzebna zmienna "usedd". Co do problemu to po twoim poście nie mogę wywnioskować czy sobie poradziłeś.

Edit
ok jednak chyba nie poradziłeś. Więc tak.
Do obiektów nie można przypisywać NULL. Nie wiem czy to się powinno komplikować.
Funkcja powinna zwracać referencje.
C powinno być referencja, a nie obiektem.
Jak zastosujesz te trzy rzeczy to powinno działać.

Ze zmiennymi globalnymi nawet nie próbuj bo one nie są fajne.

Edit 2
Odpowiadałem na kom i nie przyjżałem się dokładnie. Zanim cokolwiek popróbujesz poczytaj o wskaźnikach.</del>

Edit 3
Popieprzyłem wszystko. W obu postach. Poza jedna rzeczą. Funkcja ma zwracać referencje i c musi być referencja. Wtedy zadziała

0

Jak nie zainicjuję A,B = NULL to mi wywali błąd.
Wiem, że o dużo proszę jednak... czy mógłbyś mi pokazać jak?

1 użytkowników online, w tym zalogowanych: 0, gości: 1