• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Jak zaimplementować listę o typie zadanym jako argument w C

VPS Starter Arubacloud
0 głosów
151 wizyt
pytanie zadane 24 maja 2017 w C i C++ przez Adam Olesiak Gaduła (3,290 p.)

Mam taką listę(teraz jest to zwykła lista intów):

typedef struct Element
{
    int value;//to ma być uniwersalne, np int/double/dowolny struct
    struct Element *next, *prev;
}ELEMENT;

typedef struct ListHandler
{
    ELEMENT *first, *last;
}LISTHANDLER;

Chciałbym zrobić to uniwersalnie, żeby móc korzystać z czegoś w stylu składni w C#:

List<int> intList = new List<int>();

Jak można coś takiego osiągnąć w C?

2 odpowiedzi

0 głosów
odpowiedź 24 maja 2017 przez mokrowski Mędrzec (155,460 p.)
wybrane 25 maja 2017 przez Adam Olesiak
 
Najlepsza
W C nie. Pewną namiastką są makra generycznie http://www.robertgamble.net/2012/01/c11-generic-selections.html . Ale jak to makra trochę rozwiązują i wiele komplikują :-/

W C++ tak, z łatwością z użyciem szablonów.
–1 głos
odpowiedź 24 maja 2017 przez Marcin_N_97 Stary wyjadacz (10,290 p.)

Musisz użyć szablonów.

Tutaj przykład jak dawno temu robiłem kolejke priorytetową na sekwencji na liście, dokładnie w ten sam sposób musisz postępować:


template <typename T>
class Kolejka_pr : public Sekwencja<T>
{

public:

	void insert(T el, int k)
	{
		Element<T> * add = new Element<T>;
		add->set_value(el);
		add->set_key(k);
		if (is_empty())
		{
			header = add;
			trailer = add;
		}
		else
		{
			Element<T> * temp;
			temp = header;

			while (temp->get_key() < k)
			{
				if (temp->get_next() != nullptr)
					temp = temp->get_next();
				else
					break;
			}
			if (header == trailer)
			{
				if (temp->get_key() < k)
				{
					add->set_prev(header);
					temp->set_next(add);
					trailer = add;
				}
				else
				{
					add->set_next(temp);
					temp->set_prev(add);
					header = add;
				}
			}
			else if (temp->get_key() < k)
			{
				add->set_prev(trailer);
				temp->set_next(add);
				trailer = add;
			}
			else if (temp->get_prev() == nullptr)
			{
				add->set_next(header);
				temp->set_prev(add);
				header = add;
			}
			else
			{
				Element<T> * temp2;
				temp2 = temp;
				temp2 = temp->get_prev();
				temp2->set_next(add);
				add->set_prev(temp2);
				temp->set_prev(add);
				add->set_next(temp);
			}
			
		}
	}
	
	T remove_min()
	{
		Element<T> * temp;
		T elem_vl_rt=NULL;
		if (header == trailer)
		{
			elem_vl_rt = header->get_value();
			delete header;
			header = nullptr;
			trailer = nullptr;
			return elem_vl_rt;
		}
		else
		{
			temp = header;
			elem_vl_rt = temp->get_value();
			temp = temp->get_next();
			delete header;
			header = temp;
			temp->set_prev(nullptr);
			return elem_vl_rt;
		}
		
	}

	void remove_all()
	{
		while (header != nullptr)
		{
			remove_min();
		}
	}
};

template <typename T>
void show_queue(Kolejka_pr<T> * KL)
{
	if (KL->get_header()!=nullptr && KL->get_trailer()!=nullptr)
	{
		Element<T> * temp = KL->get_header();
		while (temp != KL->get_trailer())
		{
			show_element(temp);
			temp = temp->get_next();
		}
		show_element(temp);
	}
	else
	{
		cout << "PustaKolejka" << endl;
	}
}

template <typename T>
void sort_by_queue(Sekwencja<T> * SQ, Kolejka_pr<T> * KL)
{
	Element<T> * temp;
	temp = SQ->get_trailer();
	while (temp != SQ->get_header())
	{
		//cout << "Poczatek while" << endl;
		KL->insert(temp->get_value(), int(temp->get_value()));
		//cout << "Poczatek while2" << endl;
		//show_queue(KL);
		SQ->Sekwencja<T>::delete_element(SQ->get_trailer());
		//cout << "Poczatek while3" << endl;
		temp = SQ->get_trailer();
	}
	KL->insert(temp->get_value(), int(temp->get_value()));
	SQ->Sekwencja<T>::delete_element(SQ->get_trailer());


	//show_queue(KL);

	cout << endl;
	while (!KL->is_empty())
	{
		T el_temp = KL->remove_min();
		SQ->add_element(el_temp);
	}
}

Oczywiście nie patrz na jakość tego kodu, bo jest ona marna. Robiłem to na szybko na zaliczenie labek ;)

Podobne pytania

0 głosów
1 odpowiedź 997 wizyt
0 głosów
1 odpowiedź 401 wizyt
0 głosów
2 odpowiedzi 513 wizyt
pytanie zadane 23 listopada 2019 w C i C++ przez Ola Piątek Nowicjusz (240 p.)

92,454 zapytań

141,263 odpowiedzi

319,099 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...