Loading...
Jovanna avatar Jovanna 186 Точки

C++ Advanced, Task07_05 - Linked List - срокът за предаване изтече, Pls споделете yourVer...

Здравейте,

много интересна задача, явно е от азбуката на програмиста. И, понеже срокът за предаване мина, който би искал да сподели работещо решение, моля да постне, много ще е полезно.

Ръннах я , изчистих компилационните, но кодът ми не работи. Ще се радвам на съвети по него, за което предварително благодаря!   https://pastebin.com/WpX7zStg

Поздрави!

 

Тагове:
0
C++ Programming
MartinBG avatar MartinBG 4803 Точки

В твоето решение конструкторът на Node не си инициализира полетата:

List::Node::Node(int value, Node * prev, Node * next) {
}

// Трябва да е нещо такова:

List::Node::Node(int value, List::Node* prev, List::Node* next) : value(value), prev(prev), next(next) { }

Виж като го оправиш дали ще ти работи задачата.

 

Това е моето решение на тази задача.

1
kolioi avatar kolioi 641 Точки

https://codeshare.io/GA8yXv

Искам да кажа две думи за метода getReversed(), който не се вика никъде. Наивен подход е да създадем нов списък и да добавяме елементите на списъка, който подаваме като параметър, в обратен ред.

List List::getReversed(List l)
{
	List reversed;
	for (Node* last = l.tail; last; last = last->getPrev())
		reversed.add(last->getValue());

	return reversed;
}

Това, обаче, използва много ресурси (време+памет) и е неефективно. Вместо това можем просто да разменим стойностите на next и prev на всеки Node в списъка (параметъра l който подаваме). По този начин не заделяме нова памет за всеки Node. Бързо и ефективно.

List List::getReversed(List l)
{
	for (Node* node = l.head; node; node = node->getPrev())
	{
		Node* temp = node->getNext();
		node->setNext(node->getPrev());
		node->setPrev(temp);
	}

	std::swap(l.head, l.tail);

	return l;
}

И може да тестваме метода, като го викаме в main()

int main() {
    ........

	sorted = List::getReversed(sorted);
	cout << sorted.toString() << endl;

	return 0;
}

 

2
Jovanna avatar Jovanna 186 Точки

директно от линка не се отваря, кода се вижда като от отворения линк се направи Enter от полето на адреса, много интересно

0
Jovanna avatar Jovanna 186 Точки

Благодаря за споделените решения!! 

//не е от ctor-a, тенкс, оправих го, ще продължавам да дебъгвам...

Интересно това със смяната на пойнтерите , тия list-oве май ще излязат златни откъм приложение.

то вярно че си зависи от случая, но чудя се кой от двата се ползва масово повече, vector или list? 

Поздрави!

0
MartinBG avatar MartinBG 4803 Точки

Обръщането на масив също не е сложно за реализация - просто се разменят стойностите на елементи с индекси 0 и lenth-1, 1  и lengh-2 и т.н., докато не стигнем средата. :)

 

Векторът най-вероятно е по-използваната струкура, но има ситуации, при които листът е по-удачен избор.

 

При листа имаме константна сложност на добавяне и махане на елементи в двата края (при двойно свързан списък), както и лесно вмъкване или премахване на елементи преди/след всеки нод (стига да сме го достъпили), но нямаме достъп по индекс (за да стигнем до n-тия елемент, трябва да минем през всички преди него). Листът използва повече памет заради нодовете, създаването, триенето и менажирането на които също забавя една идея повече добавянето и премахването на елементи.

 

Все пак, в ситуации, при които ще се налага често добавяне и махане на елементи (особено ако е в двата края), трябва ни подредба (запазване на последователността при обхождане) и не ни трябва достъп по индекс (вектор, масив) или по стойност/ключ (сет, мап), списъкът може да се окаже най-подходящата структура.

Добър пример за приложението му може да видиш в упражнението към последната лекция, където се използва списък за съхранение на указатели към всички Particle обекти:

 

std::list<Particle*> particles;

 

На всяка итерация се обхождат последователно всички, извършват се някакви действия с тях, премахват се невалидните и се добавят нови в края.

 

Ако няма да се налага често премахване и вмъкване на елементи, или пък ни трябва достъп по индекс, векторът е по-удачен избор.

 

1
24/10/2018 14:27:33
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.