Funkce vkládání a vyjímání prvků skrz struktury – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Funkce vkládání a vyjímání prvků skrz struktury – C / C++ – Fórum – Programujte.comFunkce vkládání a vyjímání prvků skrz struktury – C / C++ – Fórum – Programujte.com

 

Rappix0
Duch
29. 3. 2014   #1
-
0
-

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

Nahlásit jako SPAM
IP: 89.102.205.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 91 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý