Dodawanie elementu do listy dwukierunkowej

0
void DoubleList::in_add(int val, int w)
{
	curr = head;
	Node *temp = new Node;
	temp->key = val;
	for (int i = 0; i < w; i++)
	{
		curr = curr->next;
	}
	temp->prev = curr;
	curr->next = temp;
	curr = curr->next;
	temp->next->prev;
	curr->prev->next;
	counter++;
}

Coś schrzaniłem w tym kodzie, bo mi nie działa. A sam nie mogę dojść co jest źle.

0
temp->next->prev;

Nie ustalasz wartości next dla temp, a potem jej używasz.

Przy okazji: jedną z nielicznych zalet list nad innymi kontenerami jest "darmowe" dodawanie/kasowanie elementów w dowolnym miejscu, ale to jest możliwe wyłącznie jeśli nie wymuszasz przeiterowania całej listy aby dojść do indeksu. Niech Twoja funkcja przyjmuje np. wartość oraz Node* po którym ma zostać dodana nowa wartość.

0

Nie to wkleiłem.
Problem się tyczy tego kodu. Wydaje mi się, ze jest Ok, ale nie działa.

void DoubleList::in_add(int val, int w)
{
	curr = head;
	Node *temp = new Node;
	temp->key = val;
	for (int i = 0; i < w; i++)
	{
		curr = curr->next;
	}
	temp->prev = curr;
	curr->next = temp;
	curr = curr->next;
	temp->next = curr;
	curr->prev = temp;
	counter++;
}
0
    temp->prev = curr;
    curr->next = temp;
    curr = curr->next; // curr = temp
    temp->next = curr; // temp->next = temp
    curr->prev = temp; // temp->prev = temp

Powinno być:

temp->prev = curr;
temp->next = curr->next;
temp->next->prev = temp;
temp->prev->next = temp;
0

No oczywiście że tak:D, Dzięki.
Nie wiem jak ja to robiłem.

0

A jest możliwość aby w C++ szablon klasy miał deklaracje i definicje metod odpowiednio w plikach .h i .cpp?

0

Tak, pod warunkiem, że będziesz z nich korzystać wyłącznie w tym pliku .cpp (lub jeśli go za inkludujesz, czyniąc go de-facto headerem).

Zakładam, że nie to chcesz osiągnąć.

0

A jak powinno się sprawdzać jaki typ zawiera szablon klasy?
template<typename T>
T DoubleList<T>::max()
{
if(T == int)
{

    }

else if(T==char)
{
}
}

0

A jak powinno się sprawdzać jaki typ zawiera szablon klasy?
template<typename T>
T DoubleList<T>::min()
{
if (T == int)
{

}
else if (T == char)
{

}

}
Jest jakiś lepszy sposób?

0

Generalnie masz szablon dlatego, że kod jest wspólny dla różnych typów. Jeżeli obsługa każdego typu jest inna, to się mija z celem. Jeżeli tylko jeden/mała ilość typów wymaga innej obsługi to możesz zastosować specjalizację.
W C++11 możesz stosować std::is_same to sprawdzenia.

0

Jeśli T jest char to chciałbym przypisać do zmiennej pomocniczej 'z', jeśli int to INT_MAX;
Po to chcę sprawdzać typ.

0

no to @twonek dobrze Ci mówi: użyć możesz is_same jeśli korzystasz z C++11

Tu masz taki głupawy przykładzik: http://ideone.com/3rDu0x

0

Rozwiązanie z is_same i zapewne ciągiem ifów/enable_ifów ciężko się rozbudowuje. Ponadto ify wprowadzą błąd kompilacji jeśli zechcesz zmieniać typ zwracany na podstawie parametru szablonu (a rozumiem, że tego chcesz). Lepiej wyciągnąć to do customowego szablonu:

template<typename T>
struct my_custom_max{
	static T value() { return numeric_limits<T>::max(); }
};

template<>
struct my_custom_max<char>{
	static char value() { return 'z'; }
};

http://melpon.org/wandbox/permlink/VkFcnor2OOHUgaB4

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