Gelöst: Vektoren Kantenliste in Knotenliste

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
sukka
Beiträge: 42
Registriert: Do Jul 17, 2008 7:49 pm

Gelöst: Vektoren Kantenliste in Knotenliste

Beitrag von sukka » Mo Feb 01, 2010 5:18 pm

Hallo zusammen,

ich hätte da mal wieder gern ein Problem:

Code: Alles auswählen


vector<int> getNodeList(vector<int> EdgeList)
{
	vector<int> Nodes;
	vector<int> NodeList;
	vector<int> zahlenspeicher;
	int counter;
	int z = (int)EdgeList[1]*2;
	NodeList.push_back(EdgeList[0]);
	NodeList.push_back(EdgeList[1]);
	for(int i = 2; i < (int)EdgeList.size(); i++)
	{
		int j = 0;
		bool insert = true;
		while(j < (int)Nodes.size())
		{
			if(Nodes.size() != 0)
			{
				if(Nodes[j] == EdgeList[i])
				{
					insert = false;
					break;
				}
				j++;
			}
		}
		if(insert)
		{
			Nodes.push_back(EdgeList[i]);

		}
	}

	
	for(int i = 0; i < Nodes.size() ; i++)		//Führe für jeden Knoten folgende Aktion aus
	{
		counter = 0;							//Zähler auf 0

		for(int j = 2; j < z; j+=2)
		{
			if(EdgeList[j] == Nodes[i] || EdgeList[j+1] == Nodes[i])
			{
				counter++;		//Zähler wieviele Kanten von einem Knoten abgehen
				if(EdgeList[j]!=Nodes[i])		//speichere den Folgeknoten in extra Speicher
					zahlenspeicher.push_back(EdgeList[j]);
				else if(EdgeList[j+1]!=Nodes[i])
					zahlenspeicher.push_back(EdgeList[j+1]);
			}
		}
		if(counter != 0)
		{
			NodeList.push_back(counter);	//Schreibe Anzahl der Folgeknoten in Knotenliste
			
			for(int z = 0; z < zahlenspeicher.size(); z++)
			{
				NodeList.push_back(zahlenspeicher[z]);		//Schreibe Folgeknoten in Knotenliste
			}
			while(zahlenspeicher.size() != 0)				//Leere Speicher
				zahlenspeicher.pop_back();
		}
	}
	return NodeList;
};
Das Dingen soll mir aus einer Kantenliste eine Knotenliste zaubern... das tut es auch NUR:

meine Bedingungen greifen nicht, wenn die letzten 2 Stellen des Vektors <EdgeList> erreicht sind. Mit anderen Worten, meine Knotenliste wird falsch, da die letzten 2 Werte im Vektor einfach überlesen werden. Hat jemand eine Idee woran das liegen könnte?

Code: Alles auswählen

if(EdgeList[j] == Nodes[i] || EdgeList[j+1] == Nodes[i])
also exakt an dieser Stelle überliest mir das gute Programm die Bedingungen bzw sieht die als nicht erfüllt an.


*kleine Ergänzung*

Zur Verbildlichung:

sei z = 14;

dann funktionieren die Bedingungen einwandfrei bis zu EdgeList[12] bzw EdgeList[12 + 1]
bei EdgeList[14] bzw EdgeList[14 + 1] wird alles verdrängt, was eigentlich stimmen müsste...


viele Grüße,

Sukka
Zuletzt geändert von sukka am Mo Feb 01, 2010 6:15 pm, insgesamt 2-mal geändert.

sukka
Beiträge: 42
Registriert: Do Jul 17, 2008 7:49 pm

Re: Doofe Vektoren mit doofen Ohren

Beitrag von sukka » Mo Feb 01, 2010 6:13 pm

Kaum macht man es richtig, dann funktioniert es auch

die For-Schleife, hatte einen kleinen Rechenfehler

einfach aus dem

Code: Alles auswählen

for(int j = 2; j < z; j+=2)
ein

Code: Alles auswählen

for(int j = 2; j <= z; j+=2)
und schon wird der Vektor auch vollständig durchlaufen.

viele Grüße,

Sukka

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: Gelöst: Vektoren Kantenliste in Knotenliste

Beitrag von Kerli » Mo Feb 01, 2010 6:27 pm

Super :)

Nur zwei Stellen sind mir aufgefallen, die etwas unsauber sind:

Code: Alles auswählen

      int j = 0;
      bool insert = true;
      while(j < (int)Nodes.size())
      {
         if(Nodes.size() != 0) // <-- Bedingung immer erfüllt, da while(j < Nodes.size()) immer zuerst greift.
         {

Code: Alles auswählen

while(zahlenspeicher.size() != 0)            //Leere Speicher
  zahlenspeicher.pop_back();
http://cplusplus.com/reference/stl/vector/clear/ ;)
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

sukka
Beiträge: 42
Registriert: Do Jul 17, 2008 7:49 pm

Re: Gelöst: Vektoren Kantenliste in Knotenliste

Beitrag von sukka » Mo Feb 01, 2010 7:28 pm

Ahhhh, cool danke, das <clear> hab ich gesucht, nur bin nicht mehr auf den Namen gekommen :)

viele Grüße,

Sukka

Antworten