Porovnavanie uzlov v spojaku C++ / deep copy

Programovacie jazyky, rady, poradňa...
marek788
Light Star
Light Star
Príspevky: 234
Registrovaný: 08 okt 2013, 12:40

Porovnavanie uzlov v spojaku C++ / deep copy

Príspevok od používateľa marek788 »

Ahojte, riesim jednu ulohu, ktoru ale neviem, ci som vyriesil spravne, preto by som sa chcel uistit, ci to vazne tak funguje. Do obojsmerneho spojaku ukladam jednotlive zastavky. Takze mam napr 5 zastaviek A B C D E. Na vstup dostanem, z ktorej zastavky kam idem, a musim vypisat, ktorymi zastavkami prejdem. Cize napr

Kód: Vybrať všetko

cestujem (A, D)
________
A -> B -> C -> D
Mozem vsak dostat aj opacny smer

Kód: Vybrať všetko

cestujem (D, A)
__________
D->C->B->A
Problem vsak je, ze som nevedel prist na to, ako zistit, ci ist v spojaku dozadu alebo dopredu. Vyriesil som to ale nakoniec tak a zda sa, ze to aj funguje, ze porovnam ukazatele na spojak m_Begin > m_End, a ked je begin vacsie, znamena, ze je v spojaku dalej ako end, a teda musim ist do zadu. Funguje to takto? Mozem to porovnavat? Alebo je tam nejaky hacik? Dakujem.
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8217
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: Porovnavanie uzlov v spojaku C++

Príspevok od používateľa harrison314 »

Riesis to nejak divne, nato ani netreba obojsmerne zretazeny zoznam.
Prosto: hladas trasu medzi A -> B
1. prehladavas zoznam, pokial nentrafis na A alebo B
2a. ak si natrafil na A, pokracujes a hladas B
3a. vypises vsteko medzi A a B
2b: ak si natrafil na B, pokracujes a hladas A
3b. vypises vsteko medzi B a A
marek788
Light Star
Light Star
Príspevky: 234
Registrovaný: 08 okt 2013, 12:40

Re: Porovnavanie uzlov v spojaku C++

Príspevok od používateľa marek788 »

Obojsmerny spojak je podmienkou zadania :)

Tu je zadanie, ak by niekoho zaujimalo http://pastebin.com/n13pUeAG

Ja v podstate , uz ani nedostanem cely spojak, len pociatocnu zastavku a konecnu zastavku a vsetko co je medzi tym, k celemu zoznamu sa uz nedostam.
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8217
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: Porovnavanie uzlov v spojaku C++

Príspevok od používateľa harrison314 »

Ja som to zadanie pochopil tak, ze mas ten zoznam vypisat nasjskor odpredu, potom odzadu.
V jednom pripade ides po pintery co ukazuje dopredu, v druhom co ukazuje dozadu.
marek788
Light Star
Light Star
Príspevky: 234
Registrovaný: 08 okt 2013, 12:40

Re: Porovnavanie uzlov v spojaku C++

Príspevok od používateľa marek788 »

No to ani nie, pozri si ukazku vstupov a pochopis, kazdopadne je to jedno, zaujimalo by ma fakt, ci mozem takto uzly porovnavat, alebo nie. A este mam jednu prosbu, neviete mi niekto poradit s kopirujucim konstruktorom obojsmerneho spojaku? Nejak nefici, takto to mam

Kód: Vybrať všetko

      CBusLine(CBusLine & orig){
          m_Terminal1 = new TStop(orig.m_Terminal1 -> m_Name);
          m_Terminal2 = new TStop(orig.m_Terminal2 -> m_Name);
          TStop * tmpx = m_Terminal2;
          TStop * copy = orig.m_Terminal1;
          while(copy != NULL){
              TStop * copy_tmp = new TStop(copy->m_Name);
              tmpx -> m_Next = copy_tmp;
              copy_tmp -> m_Prev = tmpx;
              tmpx = copy_tmp;
              copy = copy->m_Next;
          }
}
Hodi mi tam iba prvy prvok, a dalej nic.

tu je cely kod
http://pastebin.com/YCKyZ31K
Dik.

//autoeditácia príspevku (25 Máj 2014, 3:08)
uz to asi mam

Kód: Vybrať všetko

      CBusLine(CBusLine & orig){
      m_Terminal1 = new TStop(orig.m_Terminal1 -> m_Name);
      TStop * tmpx = m_Terminal1;
      TStop * copy = orig.m_Terminal1;
      copy = copy ->m_Next;
      while(copy != NULL){
          TStop * copy_tmp = new TStop(copy->m_Name);
          tmpx -> m_Next = copy_tmp;
          copy_tmp -> m_Prev = tmpx;
          tmpx = copy_tmp;
          copy = copy->m_Next;
      m_Terminal2 = tmpx;
      }
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8217
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: Porovnavanie uzlov v spojaku C++ / deep copy

Príspevok od používateľa harrison314 »

marek788 napísal:Problem vsak je, ze som nevedel prist na to, ako zistit, ci ist v spojaku dozadu alebo dopredu. Vyriesil som to ale nakoniec tak a zda sa, ze to aj funguje, ze porovnam ukazatele na spojak m_Begin > m_End, a ked je begin vacsie, znamena, ze je v spojaku dalej ako end, a teda musim ist do zadu. Funguje to takto? Mozem to porovnavat? Alebo je tam nejaky hacik? Dakujem.
Porovnavat ukazovatele nemozes, nemusi to platit vzdy ze neskor vytvoreny je na vyssej adrese.
pcsiete
Medium Star
Medium Star
Príspevky: 413
Registrovaný: 07 dec 2012, 18:47

Re: Porovnavanie uzlov v spojaku C++ / deep copy

Príspevok od používateľa pcsiete »

marek788 napísal: Problem vsak je, ze som nevedel prist na to, ako zistit, ci ist v spojaku dozadu alebo dopredu. Vyriesil som to ale nakoniec tak a zda sa, ze to aj funguje, ze porovnam ukazatele na spojak m_Begin > m_End, a ked je begin vacsie, znamena, ze je v spojaku dalej ako end, a teda musim ist do zadu. Funguje to takto? Mozem to porovnavat? Alebo je tam nejaky hacik? Dakujem.
Ako napísal harrison, smer môžeš zistiť tak, že najprv prehľadáš všetko do konca zoznamu (to by boli cesty smerom dopredu zo začiatočnej zastávky), a potom začneš odpredu (to by už boli cesty smerom dozadu).
Rovnako môžeš prejsť aj celý zoznam a len si zaznačíš smer.

Kód: Vybrať všetko

#include <malloc.h>
#include <stdio.h>

typedef struct zastavka_t {
	char* meno;
	
	struct zastavka_t * prev, next;
} zastavka, *pzastavka;

int main(int argc, char** argv) {
	/* nejaké zastávky */
	pzastavka zastavky = ...;
	...
	
	/* vstup -> prvá a posledná zastávka */
	char * prva;	
	char * posledna;
	
	char dozadu = 0;
	
	/* hľadanie */
	pzastavka zaciatok;
	pzastavka koniec;
	pzastavka curr = zastavky;
	do {
		if(strcmp(curr->meno, prva)==0) {
			/* našli sme prvú zastávku */
			zaciatok = curr;
			/* ak sme ju našli pred poslednou, pôjdeme pri vypisovaní dopredu */
			dozadu = (!dozadu ? dozadu-1 : dozadu);
		} else if(strcmp(curr->meno, posledna)==0) {
			/* našli sme poslednú zastávku */
			koniec = curr;
			dozadu++;
		}
	} while((curr = curr->next)!=NULL);
	
	/* vypisovanie */
	curr = zaciatok;
	do {
		printf("%s", curr->meno);
	} while((dozadu && (curr = curr->prev)!=koniec->prev && printf(" -> "))
			|| (!dozadu && (curr = curr->next)!=koniec->next) && printf(" -> "));
}
Napísať odpoveď