Ahoj,
pracuji na školním projektu a zasekl jsem se při psaní určitých funkcí s vkládáním a vyjímáním prvků napříč několika strukturami. Jelikož nad tím sedím už poměrně dlouho a nedokážu nic kloudného vymyslet, tak bych zde chtěl poprosit o pomoc či radu jak na to.
Zadání úkolu zní tak, že mám vytvořit jednosměrný seznam implementovaný pomocí ukazatelů, jednotlivé položky seznamu jsou fronty v poli dané velikosti a prvky pole jsou jsou struktury obsahující pořadové číslo. Seznam, fronta i samotné prvky fronty mají být reprezentovány jako struktury.
Při samotné práci programu se v cyklech generují prvky struktury "Customer" a řadí se do fronty v položce seznamu. Jakmile je fronta plná, vytvoří se nová položka seznamu s novou frontou a prvky se řadí tam. Na konci pravidelného cyklu se prvky z fronty zase vyjímají a uvolňují místo pro nově vygenerované prvky.
Program má navíc pracovat tak že když je někde prvek vložen, tak se vypíše kolikátý vygenerovaný prvek to byl (proměnná "IdCustomer") a do které fronty byl vložen (proměnná "IdQueue") (počítáno od jedničky). U vyjímání prvků zase kolikátý vygenerovaný prvek to a ze které fronty byl vyjmut.
Vytvořil jsem si hlavičkový soubor se všemi potřebnými strukturami:
const int N = 7; //pocet polozek ve fronte
int CustomerCount = 0; //aktualni pocet zakazniku
int QueueCount = 0; //aktualni pocet front
struct Customer //struktura Zakaznik
{
int IdCustomer; //ID zakaznika (poradove cislo)
};
struct Queue //struktura Fronta
{
Queue* Next; //ukazatel na dalsi frontu v seznamu
int IdQueue; //ID fronty (poradove cislo)
Customer* Data[N]; //pole obsahujici data
int Head; //hlava fronty
int Tail; //ocas fronty
};
struct List //struktura Seznam
{
Queue* Head; //ukazatel na prvni polozku
Queue* Tail; //ukazatel na posledni polozku
};
Dále jsem si napsal následující funkce pro frontu: (u funkce QueuePut si nejsem jistý funkčností)
//funkce pro inicializaci nove fronty
void QueueInit(Queue& Q, int QueueCount)
{
Q.IdQueue = QueueCount + 1;
Q.Head = 0;
Q.Tail = 0;
}
//funkce pro vlozeni prvku struktury Customer
int QueuePut(Queue& Q, int CustomerCount)
{
if(!QueueIsFull(Q))
{
Customer* n = new Customer;
n->IdCustomer = CustomerCount + 1;
Q.Data[Q.Tail] = n;
Q.Tail += 1;
Q.Tail %= N;
}
return CustomerCount++;
}
//funkce pro kontrolu prazdnosti fronty
bool QueueIsEmpty(const Queue& Q)
{
return Q.Head == Q.Tail;
}
//funkce pro kontrolu plnosti fronty
bool QueueIsFull(const Queue& Q)
{
return Q.Head == (Q.Tail + 1) % N;
}
A tyto pro seznam: (u funkce ListInsert si nejsem jistý funkčností)
//funkce pro inicializaci noveho seznamu
void ListInit(List& L)
{
L.Head = NULL;
L.Tail = NULL;
}
//funkce pro vlozeni nove fronty na konec seznamu
int ListInsert(List& L, int QueueCount)
{
Queue* n = new Queue;
QueueInit(*n, QueueCount);
n->Next = NULL;
if(L.Head != NULL)
{
L.Tail->Next = n;
L.Tail = n;
}
else
{
L.Tail = n;
L.Head = n;
}
return QueueCount++;
}
//funkce pro kontrolu prazdnosti seznamu
bool ListIsEmpty(const List& L)
{
return L.Head == NULL;
}
A nevím si rady s funkcemi pro:
- vyjmutí prvku z fronty, tak aby se mi navrátily hodnoty uložené v "IdCustomer" a "IdQueue"
- vyjmutí prázdné fronty ze seznamu s navrácením hodnoty uložené v "IdQueue"
Mohl by mi prosím někdo poradit jak by tyto funkce měly vypadat, popřípadě se podívat jestli v ostatních funkcích nejsou nějaké logické chyby?
PS: Pokud by měl někdo nápad jak by šel tento problém řešit jednodušeji, tak i ten uvítám, i když bych radši zprovoznil tuto mou verzi.
Předem děkuji