Jednosměrný seznam – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Jednosměrný seznam – C / C++ – Fórum – Programujte.comJednosměrný seznam – C / C++ – Fórum – Programujte.com

 

Martin5230
Newbie
28. 3. 2015   #1
-
0
-

Zdravím nevíte jak se implementuje jednosměrný seznam? Plus jak se v takovém seznamu implementuje přídávání prvků za hlavu? Nejlépe v C++.

Díky moc za pomoc

Nahlásit jako SPAM
IP: 89.102.221.–
ondrej39+1
Věrný člen
28. 3. 2015   #2
-
0
-

#1 Martin523
Tady máš nějakej základ, kterej by ti mohl pomoct posunout se dál.

#ifndef LINKEDLIST_H
#define LINKEDLIST_H

class LinkedListNode
{
	friend class LinkedList;
public:
	LinkedListNode()
	{
		m_data = 0;
		m_pNext = nullptr;
	}
	LinkedListNode(int data)
	{
		m_data = data;
		m_pNext = nullptr;
	}
	LinkedListNode(int data, const LinkedListNode* nextNode)
	{
		m_data = data;
		m_pNext = const_cast<LinkedListNode*>(nextNode);
	}
	LinkedListNode(LinkedListNode* other)
	{
		//přiřazení sebe sama
		if (this == other)
		{
			return;
		}

		m_data = other->m_data;
		other->m_data = 0;

		m_pNext = m_pNext;
		m_pNext->m_pNext = nullptr;
	}
protected:
private:
	int m_data;
	LinkedListNode * m_pNext;	
};

class LinkedList
{
public:
	LinkedList()
	{
		m_size = 0;
		m_pHead = nullptr;
	}
	LinkedList(int data)
	{
		m_size = 1;

		auto tmpNode = new LinkedListNode(data);
		m_pHead = tmpNode;
		m_pTail = tmpNode;
	}
	LinkedList(const LinkedListNode* newNode)
	{
		m_size = 1;
		m_pHead = const_cast<LinkedListNode*>(newNode);
		m_pTail = const_cast<LinkedListNode*>(newNode);
	}
	LinkedList(const LinkedList * other)
	{
		//přiřazení sebe sama
		if (this == other)
		{
			return;
		}

		m_size = other->m_size;
		auto tmpNode = other->m_pHead;

		while (tmpNode == nullptr)
		{
			auto newNode = new LinkedListNode(tmpNode);
			
			Add(newNode);
			tmpNode = tmpNode->m_pNext;
		}
	}
	void Add(int data)
	{
		if (m_size == 0)
		{
			auto newNode = new LinkedListNode(data);
			m_pHead = newNode;
			m_pTail = newNode;
			m_size = 1;
			return;
		}

		if (m_size == 1)
		{
			auto newNode = new LinkedListNode(data);			
			m_pTail = newNode;
			m_pHead->m_pNext = m_pTail;
			m_size++;
			return;
		}

		auto newNode = new LinkedListNode(data);
		m_pTail->m_pNext = newNode;
		m_pTail = newNode;
		m_size++;
	}
	void Add(const LinkedListNode* newNode)
	{
		if (m_size == 0)
		{
			m_pHead = const_cast<LinkedListNode*>(newNode);
			m_pTail = const_cast<LinkedListNode*>(newNode);
			m_size = 1;
			return;
		}

		if (m_size == 1)
		{
			m_pTail = const_cast<LinkedListNode*>(newNode);
			m_pHead->m_pNext = m_pTail;
			m_size++;
			return;
		}

		m_pTail->m_pNext = const_cast<LinkedListNode*>(newNode);
		m_pTail = const_cast<LinkedListNode*>(newNode);
		m_size++;
	}
	virtual ~LinkedList()
	{
		LinkedListNode * pTmp = m_pHead;

		while (pTmp != nullptr)
		{
			delete pTmp;
			pTmp = pTmp->m_pNext;
		}
	}
protected:
private:
	unsigned int m_size;
	LinkedListNode * m_pHead;
	LinkedListNode * m_pTail;
};

#endif


EDIT: Opravena chyba v Add metodě.

Nahlásit jako SPAM
IP: 46.39.172.–
Inject all the dependencies!
ingiraxo+15
Grafoman
28. 3. 2015   #3
-
0
-

#1 Martin523
Jednodušší varianta 

struct Node
{
    int value;
    Node* next;

    Node() : next(NULL) {}
};

static Node* g_head = NULL;
static Node* g_last = NULL;

Node* createNode(int value)
{
    Node* n = new Node();
    n->value = value;
    return n;
}

void addNode(int value)
{
    Node* node = createNode(value);

    if (!g_head) {
        g_head = node;
    } else {
        g_last->next = node;
    }
    g_last = node;
}

int main()
{
    addNode(10);
    addNode(20);

    return EXIT_SUCCESS;
}

Další metody jako odebrání, vložení mezi nody apod. si zkus sám

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
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, 11 hostů

Podobná vlákna

Jednosmerny zoznam — založil Grungy

OS seznam — založil Bengo

C++ Seznam — založil _Daffy_

Seznam — založil tom9k

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ý