lista poprzedników

0

mam problem z stworzeniem listy po-przeników gdy tworzę listę element dodaje się prawidłowo dla przykładu mam 2 miasta zapisuje odległość od 1 miasta do 2 i przypisuje 2 miasto jako głowę listy a 1 które było wpisane ustawiam za nim oraz do 2 miasta wpisuje odległość z 1 oraz aktualną problem pojawia się gdy mam dodać 3 miasto żeby lista wyglądała następująco 3->2->1 dodatkowo lista posiada wskaźnik na następne miasto na liście która powinna wyglądać następująco
1<-2<-3<-8
1<-4<-6
1<-5-<-7
struktura wygląda następująco

struct sasiad {
	miasto* wsk_miasto;
	int odleglosc;
	sasiad* nastepny;
	sasiad* prev;
};

dodatkowo funkcja powinna sprawdzać zsumowane odległości i jeśli ich suma jest mniejsza to podmienić ścieżkę
wczytuje dane z grafu skierowanego

0

Po kiego ci ten prev?

0

następny używam do tworzenia kolejnych elementów listy czyli
1: 1-<2... nast wchodzi na 2
2:1...
3:1...

a prev ma wskazywać na poprzeni element który tam był na listę patrzę od prawej strony tak jak jest zapisane tak jakby lista list

0

dodawanie pierwszej listy nie było skomplikowane

void dodaj_odw(struct sasiad*& head, sasiad*& curr,int odleglosc) {
	sasiad* tmp= head;
	sasiad* temp = nullptr , * test = curr;
	sasiad* temp1;
	sasiad* test1;
	if (!head) {
		sasiad* nowy = new sasiad{ curr->wsk_miasto,odleglosc,nullptr,head };
		head = nowy;
		head->prev = head;
		head->prev->odleglosc = odleglosc;
		curr->odleglosc = odleglosc;
		return;
	}
		
		if (head->wsk_miasto->nazwa_miasta==curr->prev->wsk_miasto->nazwa_miasta) {//piersza lista
			
			sasiad* nowy = new sasiad{ curr->wsk_miasto,head->odleglosc + curr->odleglosc,nullptr,head };
			

			head = nowy;
			
			return;
		}
		//kolejne
		temp1 = head;
		while (temp1->wsk_miasto->nazwa_miasta != temp1->prev->wsk_miasto->nazwa_miasta) {
			temp = temp1;
			temp1=temp1->prev;
		}
		test1 = head;
		head = head->nastepny;
		
		if (!head) {
			head = new sasiad{ curr->wsk_miasto,odleglosc,nullptr,temp };
			head->prev = temp1;
			head = test;
			return;
		}
		
		dodaj_odw(head, curr, odleglosc);


}

teraz pytanie jak zrobić poprawnie tak żeby lista wyglądała następująco
1:1<2<3
2:1<4
3:1<5
kolejna lista zawsze powinna zaczynać się od 1

0
#include <iostream>
using namespace std;

struct Map
  {
   struct City
     {
      struct Neighbour
      {
         City *to;
         double distance;
         Neighbour *next;
         Neighbour(City *to,double distance,Neighbour *next=nullptr):to(to),distance(distance),next(next) {}
      };
      void connect(City *to,double distance) { head=new Neighbour(to,distance,head); }
      string name;
      City *next;
      Neighbour *head;
      City(string name,City *next=nullptr):name(name),next(next),head(nullptr) {}
     };
   City *head;
   Map():head(nullptr) {}
   City *find(string name);
   void connect(string a,string b,double distance,bool bidirect=true);
   void show();
  };

Map::City *Map::find(string name)
{
   for(City *curr=head;curr;curr=curr->next) if(name==curr->name) return curr;
   return head=new City(name,head);   
}

void Map::connect(string a,string b,double distance,bool bidirect)
{
   City *ca=find(a),*cb=find(b);
   ca->connect(cb,distance);
   if(bidirect) cb->connect(ca,distance);
}

void Map::show()
{
   for(City *city=head;city;city=city->next) 
   {
      cout<<city->name<<":";
      for(City::Neighbour *neighbour=city->head;neighbour;neighbour=neighbour->next) 
      {
         cout<<" "<<neighbour->to->name<<"("<<neighbour->distance<<")";
      }
      cout<<endl;
   }
}

int main()
{
   Map map;
   map.connect("Warszawa","Krakow",100);
   map.connect("Gdynia","Warszawa",110);
   map.connect("Warszawa","Lodz",120);
   map.connect("Krakow","Gdynia",130);
   map.connect("Gdynia","Lodz",140);
   map.show();
   return 0;
}

https://ideone.com/Jzx2Fo

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