<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[doppelt verkettete Liste]]></title><description><![CDATA[<p>Hallo,</p>
<p>habe folgende Aufgabe bekommen:</p>
<blockquote>
<p>Gegeben sei eine Liste mit Adressangaben (Index(int), PLZ(5 char), Ort(20 char), Straße(20 char), Hausnr(5 char)), die bereits nach &quot;index&quot; (&lt;0!) sortiert in einer Datei vorliegt. Erstellen Sie ein C++-Programm zum einlesen und Bearbeiten der Liste im Arbeitsspeicher (Verwendung von dynamischem Speicher!).</p>
<p>Verwenden Sie eine Klasse DVL_Elem, für die Elemente einer doppelt verketteten Liste (DVL). Diese Klasse enthalte die für die Realisierung einer DVL erforderlichen Zeiger. Hiervon abgeleitet wird die Klasse Data_Elem, die die entsprechenden Variablen für die Adressen bereitstellt.</p>
<p>Zur Realisierung der DVL geben Sie weiterhin deine Klasse DVL an, die die zur Verwltung erforderlichen Methoden einfuege(...), entferne(...), DVL_Elem* first_V(...), DVL_Elem* first_R(...), DVL_Elem* last_V(...), DVL_Elem* last_R(...), DVL_Elem *at(int x_index) und anzeige_Liste(...) enthält. Weiterhin sind hier auch die erforderlichen Anker für die vorwärts- (..._V) und rückwärts-Verkettung (..._R) vorzusehen.</p>
<p>Bei der Methode ... einfuege(...) gibt der Rückgabewert an, welcher der Index des folgenden Elemtes ist (-1 für = letztes Element). Der Index soll eindeutig bleiben, d.h. bei einem einzufügenden Element, bei dem der Index bereits existiert, wird der um eins erhöhte Index eingesetzt, Die bereits existierenden Listenelemente werden entsprechend angepasst.</p>
<p>Bei der Methode ...entferne(int x_index) wird das zu dem Index x_index gehörende Element aus der Liste entfernt und bei den verbleibenden Elementen die Komponente &quot;Index&quot; angepasst!</p>
<p>Erstellen Sie in einem Hauptprogramm ein geeignetes Menu (Einlesen der Liste, Einfuegen neues Element, Loeschen, Anzeige_Element, Ausgaben_Liste, Beenden) für die Bearbeitung der Liste!</p>
</blockquote>
<p>Mein aktuelles Programm schaut mittlerweile so aus:</p>
<p>DVL_Elem.h</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;string&gt;
#include &lt;vector&gt;
#include &lt;iterator&gt;
#include &lt;algorithm&gt;

using namespace std;

#ifndef DVL_ELEM_H_INCLUDED
#define DVL_ELEM_H_INCLUDED

class DVL_Elem {
	private:
	public:
		DVL_Elem();
		~DVL_Elem();
		int value;
		DVL_Elem *next;
		DVL_Elem *prev;
};

#endif
</code></pre>
<p>DVL_Elem.cpp</p>
<pre><code class="language-cpp">#include &quot;DVL_Elem.h&quot;

DVL_Elem::DVL_Elem(){}
DVL_Elem::~DVL_Elem(){}
</code></pre>
<p>Data_Elem.h</p>
<pre><code class="language-cpp">#include &quot;DVL_Elem.h&quot;

class Data_Elem : public DVL_Elem {
	private:
		int index;
		string plz;
		string ort;
		string strasse;
		string hausnr;

	public:
		Data_Elem();
		~Data_Elem();

		Data_Elem(int iIndex, const string&amp; iPlz, const string&amp; iOrt , const string&amp; iStr, const string&amp; iNr);

		ostream &amp; ostreamAusgabe(ostream &amp;os);
};

ostream &amp; operator &lt;&lt; (ostream &amp;os, Data_Elem &amp;data);
</code></pre>
<p>Data_Elem.cpp</p>
<pre><code class="language-cpp">#include &quot;Data_Elem.h&quot;

Data_Elem::Data_Elem() {}

Data_Elem::~Data_Elem() {}

Data_Elem::Data_Elem(int iIndex, const string&amp; iPlz, const string&amp; iOrt , const string&amp; iStr, const string&amp; iNr)
: index(iIndex), plz(iPlz), ort(iOrt), strasse(iStr), hausnr(iNr) {}

ostream &amp; operator &lt;&lt; (ostream &amp;os, Data_Elem &amp;data) {
	data.ostreamAusgabe(os);
	return os;
}

ostream &amp; Data_Elem::ostreamAusgabe(ostream &amp;os) {
	os &lt;&lt; index &lt;&lt; &quot; &quot; &lt;&lt; plz &lt;&lt; &quot; &quot; &lt;&lt; ort &lt;&lt; &quot; &quot; &lt;&lt; strasse &lt;&lt; &quot; &quot; &lt;&lt; hausnr &lt;&lt; endl;
	return os;		
}
</code></pre>
<p>DVL.h</p>
<pre><code class="language-cpp">#include &quot;DVL_Elem.h&quot;

class DVL  {
	private:
	public:
		DVL();
		~DVL();

		DVL_Elem *first_V();
		DVL_Elem *first_R();
		DVL_Elem *last_V();
		DVL_Elem *last_R();
		DVL_Elem *at(int x_index);
		DVL_Elem *front_V();
		DVL_Elem *back_R();
		anzeige_Liste();
		entferne();

		int einfuege(int iIndex, const string&amp; iPlz, const string&amp; iOrt , const string&amp; iStr, const string&amp; iNr);
};
</code></pre>
<p>DVL.cpp</p>
<pre><code class="language-cpp">#include &quot;DVL.h&quot;
#include &quot;Data_Elem.h&quot;

DVL::DVL(){
	firstDVL_Elem = NULL;
	lastDVL_Elem = NULL;
}

DVL::~DVL(){}

int DVL::einfuege(int i, const string&amp; p, const string&amp; o , const string&amp; s, const string&amp; h) {
	Data_Elem temp(i, p, o, s, h), temp2;
	return 0;
}
</code></pre>
<p>Adressen.cpp</p>
<pre><code class="language-cpp">#include &quot;DVL.h&quot;
#include &quot;Data_Elem.h&quot;

const size_t N = 5;
enum {ind = 0, plz = 1, ort = 2, str = 3, hsnr = 4};

int menu();

int main() {
	string dateiname = &quot;liste.dat&quot;; //Dateiname
	ifstream input; 
	vector&lt;string&gt; vec;
	string tmp;	
	int action = 0;					//Wahl des Benutzers

	while(action != 'B') {
		action = menu();
		switch(action) {
			case 'L':
				//datei öffnen
				input.open(dateiname.c_str(), ios_base::in);

				//prüfe ob die datei geöffnet werden konnte
				if(!input){
					cout &lt;&lt; &quot;Fehler beim Oeffnen der Datei!&quot; &lt;&lt; endl;
					break;
				}

				// Kopiere aus dem Stream input in den Vektor vec Benutze ';' als Trenner
				while (getline(input,tmp,';')) {
					string::iterator it = find(tmp.begin(), tmp.end(), '\n');
					if(it != tmp.end()) {
						string tmp2;
						copy(tmp.begin(), it, back_inserter(tmp2));
						vec.push_back(tmp2);
						tmp2 = &quot;&quot;;
						copy(++it, tmp.end(), back_inserter(tmp2));
						vec.push_back(tmp2);
					}
					else {
						vec.push_back(tmp);
					}
				}

				for (size_t i = 0; i &lt;= vec.size() - N; i += N) {
					 DVL tmp;
					 tmp.einfuege((i/N)+1, vec[i+plz], vec[i+ort], vec[i+str], vec[i+hsnr]);
				}
				break;

			case 'E':
				break;
			case 'D':
				break;
			case 'A':
				break;
			case 'P':
				//Ausgabe der eingelesenen Liste
				break;
			case 'B':
				break;
		}
	}

	//datei schließen
	input.close();

	return 0;
}

int menu() {
	char choice;
	char c;

	static char menuStr[] =
		&quot;\n\n	------------MENU-----------&quot;
		&quot;\n\n	L = einlesen der Liste&quot;
		&quot;\n\n	E = einfuegen neues Element&quot;
		&quot;\n\n	D = loeschen&quot;
		&quot;\n\n	A = Anzeige Element&quot;
		&quot;\n\n	P = Ausgaben Liste&quot;
		&quot;\n\n	B = Beenden&quot;
		&quot;\n\n	Auswahl: &quot;;

	cout &lt;&lt; menuStr;

	do {
		if(!cin.get(choice)){
			choice = 'B';
		}
		else {
			choice = toupper(choice);
		}
	}while(choice != 'L' &amp;&amp; choice != 'E' &amp;&amp; choice != 'D' &amp;&amp; choice != 'A' &amp;&amp; choice != 'P' &amp;&amp; choice != 'B');

	// verwirft restliche Zeichen im Eingabepuffer incl. '\n'
	while(cin.get(c) &amp;&amp; c != '\n');

	return choice;
}
</code></pre>
<p>liste.dat</p>
<pre><code>1;49899;Huegelstadt;Dorfstrasse;5
2;38998;Taldorf;Wasserweg;9
3;14899;Bergheim;Altestrasse;129
4;86347;Seehain;Tiefenhofpfad;43
5;64732;Landstadt;Mittenweg;85
</code></pre>
<p>Bin jetzt bei der einfuege-Funktion gestrandet und weiß nicht mehr weiter, wäre nett wenn mir jemand helfen könnte?</p>
<p>Danke und Gruß, nihilfire</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/169891/doppelt-verkettete-liste</link><generator>RSS for Node</generator><lastBuildDate>Wed, 16 Sep 2026 21:21:40 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/169891.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 09 Jan 2007 21:12:17 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to doppelt verkettete Liste on Wed, 10 Jan 2007 07:03:47 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>habe folgende Aufgabe bekommen:</p>
<blockquote>
<p>Gegeben sei eine Liste mit Adressangaben (Index(int), PLZ(5 char), Ort(20 char), Straße(20 char), Hausnr(5 char)), die bereits nach &quot;index&quot; (&lt;0!) sortiert in einer Datei vorliegt. Erstellen Sie ein C++-Programm zum einlesen und Bearbeiten der Liste im Arbeitsspeicher (Verwendung von dynamischem Speicher!).</p>
<p>Verwenden Sie eine Klasse DVL_Elem, für die Elemente einer doppelt verketteten Liste (DVL). Diese Klasse enthalte die für die Realisierung einer DVL erforderlichen Zeiger. Hiervon abgeleitet wird die Klasse Data_Elem, die die entsprechenden Variablen für die Adressen bereitstellt.</p>
<p>Zur Realisierung der DVL geben Sie weiterhin deine Klasse DVL an, die die zur Verwltung erforderlichen Methoden einfuege(...), entferne(...), DVL_Elem* first_V(...), DVL_Elem* first_R(...), DVL_Elem* last_V(...), DVL_Elem* last_R(...), DVL_Elem *at(int x_index) und anzeige_Liste(...) enthält. Weiterhin sind hier auch die erforderlichen Anker für die vorwärts- (..._V) und rückwärts-Verkettung (..._R) vorzusehen.</p>
<p>Bei der Methode ... einfuege(...) gibt der Rückgabewert an, welcher der Index des folgenden Elemtes ist (-1 für = letztes Element). Der Index soll eindeutig bleiben, d.h. bei einem einzufügenden Element, bei dem der Index bereits existiert, wird der um eins erhöhte Index eingesetzt, Die bereits existierenden Listenelemente werden entsprechend angepasst.</p>
<p>Bei der Methode ...entferne(int x_index) wird das zu dem Index x_index gehörende Element aus der Liste entfernt und bei den verbleibenden Elementen die Komponente &quot;Index&quot; angepasst!</p>
<p>Erstellen Sie in einem Hauptprogramm ein geeignetes Menu (Einlesen der Liste, Einfuegen neues Element, Loeschen, Anzeige_Element, Ausgaben_Liste, Beenden) für die Bearbeitung der Liste!</p>
</blockquote>
<p>Mein aktuelles Programm schaut mittlerweile so aus:</p>
<p>DVL_Elem.h</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;string&gt;
#include &lt;vector&gt;
#include &lt;iterator&gt;
#include &lt;algorithm&gt;

using namespace std;

#ifndef DVL_ELEM_H_INCLUDED
#define DVL_ELEM_H_INCLUDED

class DVL_Elem {
	private:
	public:
		DVL_Elem();
		~DVL_Elem();
		int value;
		DVL_Elem *next;
		DVL_Elem *prev;
};

#endif
</code></pre>
<p>DVL_Elem.cpp</p>
<pre><code class="language-cpp">#include &quot;DVL_Elem.h&quot;

DVL_Elem::DVL_Elem(){}
DVL_Elem::~DVL_Elem(){}
</code></pre>
<p>Data_Elem.h</p>
<pre><code class="language-cpp">#include &quot;DVL_Elem.h&quot;

class Data_Elem : public DVL_Elem {
	private:
		int index;
		string plz;
		string ort;
		string strasse;
		string hausnr;

	public:
		Data_Elem();
		~Data_Elem();

		Data_Elem(int iIndex, const string&amp; iPlz, const string&amp; iOrt , const string&amp; iStr, const string&amp; iNr);

		ostream &amp; ostreamAusgabe(ostream &amp;os);
};

ostream &amp; operator &lt;&lt; (ostream &amp;os, Data_Elem &amp;data);
</code></pre>
<p>Data_Elem.cpp</p>
<pre><code class="language-cpp">#include &quot;Data_Elem.h&quot;

Data_Elem::Data_Elem() {}

Data_Elem::~Data_Elem() {}

Data_Elem::Data_Elem(int iIndex, const string&amp; iPlz, const string&amp; iOrt , const string&amp; iStr, const string&amp; iNr)
: index(iIndex), plz(iPlz), ort(iOrt), strasse(iStr), hausnr(iNr) {}

ostream &amp; operator &lt;&lt; (ostream &amp;os, Data_Elem &amp;data) {
	data.ostreamAusgabe(os);
	return os;
}

ostream &amp; Data_Elem::ostreamAusgabe(ostream &amp;os) {
	os &lt;&lt; index &lt;&lt; &quot; &quot; &lt;&lt; plz &lt;&lt; &quot; &quot; &lt;&lt; ort &lt;&lt; &quot; &quot; &lt;&lt; strasse &lt;&lt; &quot; &quot; &lt;&lt; hausnr &lt;&lt; endl;
	return os;		
}
</code></pre>
<p>DVL.h</p>
<pre><code class="language-cpp">#include &quot;DVL_Elem.h&quot;

class DVL  {
	private:
	public:
		DVL();
		~DVL();

		DVL_Elem *first_V();
		DVL_Elem *first_R();
		DVL_Elem *last_V();
		DVL_Elem *last_R();
		DVL_Elem *at(int x_index);
		DVL_Elem *front_V();
		DVL_Elem *back_R();
		anzeige_Liste();
		entferne();

		int einfuege(int iIndex, const string&amp; iPlz, const string&amp; iOrt , const string&amp; iStr, const string&amp; iNr);
};
</code></pre>
<p>DVL.cpp</p>
<pre><code class="language-cpp">#include &quot;DVL.h&quot;
#include &quot;Data_Elem.h&quot;

DVL::DVL(){
	firstDVL_Elem = NULL;
	lastDVL_Elem = NULL;
}

DVL::~DVL(){}

int DVL::einfuege(int i, const string&amp; p, const string&amp; o , const string&amp; s, const string&amp; h) {
	Data_Elem temp(i, p, o, s, h), temp2;
	return 0;
}
</code></pre>
<p>Adressen.cpp</p>
<pre><code class="language-cpp">#include &quot;DVL.h&quot;
#include &quot;Data_Elem.h&quot;

const size_t N = 5;
enum {ind = 0, plz = 1, ort = 2, str = 3, hsnr = 4};

int menu();

int main() {
	string dateiname = &quot;liste.dat&quot;; //Dateiname
	ifstream input; 
	vector&lt;string&gt; vec;
	string tmp;	
	int action = 0;					//Wahl des Benutzers

	while(action != 'B') {
		action = menu();
		switch(action) {
			case 'L':
				//datei öffnen
				input.open(dateiname.c_str(), ios_base::in);

				//prüfe ob die datei geöffnet werden konnte
				if(!input){
					cout &lt;&lt; &quot;Fehler beim Oeffnen der Datei!&quot; &lt;&lt; endl;
					break;
				}

				// Kopiere aus dem Stream input in den Vektor vec Benutze ';' als Trenner
				while (getline(input,tmp,';')) {
					string::iterator it = find(tmp.begin(), tmp.end(), '\n');
					if(it != tmp.end()) {
						string tmp2;
						copy(tmp.begin(), it, back_inserter(tmp2));
						vec.push_back(tmp2);
						tmp2 = &quot;&quot;;
						copy(++it, tmp.end(), back_inserter(tmp2));
						vec.push_back(tmp2);
					}
					else {
						vec.push_back(tmp);
					}
				}

				for (size_t i = 0; i &lt;= vec.size() - N; i += N) {
					 DVL tmp;
					 tmp.einfuege((i/N)+1, vec[i+plz], vec[i+ort], vec[i+str], vec[i+hsnr]);
				}
				break;

			case 'E':
				break;
			case 'D':
				break;
			case 'A':
				break;
			case 'P':
				//Ausgabe der eingelesenen Liste
				break;
			case 'B':
				break;
		}
	}

	//datei schließen
	input.close();

	return 0;
}

int menu() {
	char choice;
	char c;

	static char menuStr[] =
		&quot;\n\n	------------MENU-----------&quot;
		&quot;\n\n	L = einlesen der Liste&quot;
		&quot;\n\n	E = einfuegen neues Element&quot;
		&quot;\n\n	D = loeschen&quot;
		&quot;\n\n	A = Anzeige Element&quot;
		&quot;\n\n	P = Ausgaben Liste&quot;
		&quot;\n\n	B = Beenden&quot;
		&quot;\n\n	Auswahl: &quot;;

	cout &lt;&lt; menuStr;

	do {
		if(!cin.get(choice)){
			choice = 'B';
		}
		else {
			choice = toupper(choice);
		}
	}while(choice != 'L' &amp;&amp; choice != 'E' &amp;&amp; choice != 'D' &amp;&amp; choice != 'A' &amp;&amp; choice != 'P' &amp;&amp; choice != 'B');

	// verwirft restliche Zeichen im Eingabepuffer incl. '\n'
	while(cin.get(c) &amp;&amp; c != '\n');

	return choice;
}
</code></pre>
<p>liste.dat</p>
<pre><code>1;49899;Huegelstadt;Dorfstrasse;5
2;38998;Taldorf;Wasserweg;9
3;14899;Bergheim;Altestrasse;129
4;86347;Seehain;Tiefenhofpfad;43
5;64732;Landstadt;Mittenweg;85
</code></pre>
<p>Bin jetzt bei der einfuege-Funktion gestrandet und weiß nicht mehr weiter, wäre nett wenn mir jemand helfen könnte?</p>
<p>Danke und Gruß, nihilfire</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1206642</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1206642</guid><dc:creator><![CDATA[nihilfire]]></dc:creator><pubDate>Wed, 10 Jan 2007 07:03:47 GMT</pubDate></item><item><title><![CDATA[Reply to doppelt verkettete Liste on Wed, 10 Jan 2007 08:16:53 GMT]]></title><description><![CDATA[<p>Im Prinzip geht das Einfügen ganz einfach:<br />
Als erstes hangelst du dich durch die Liste zu der Position durch, hinter der du das Element einfügen willst. Dann erstellst du dir einen neuen Listenknoten, füllst ihn mit Inhalten und setzt seine Nachbar-Zeiger (next und prev) auf pos-&gt;next bzw. pos. Zuletzt mußt du nur noch pos-&gt;next-&gt;prev und pos-next auf das neue Element umbiegen und schon ist das Element am Ziel.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1206793</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1206793</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 10 Jan 2007 08:16:53 GMT</pubDate></item><item><title><![CDATA[Reply to doppelt verkettete Liste on Wed, 10 Jan 2007 16:19:56 GMT]]></title><description><![CDATA[<p>Hi,<br />
dann müssste ich ja erstmal feststellen wieviele Elemente es überhaupt schon gibt, d.h ich brauche noch eine Variable die, die Anzahl der Elemente speichert oder?</p>
<p>einfuege()</p>
<pre><code class="language-cpp">int DVL::einfuege(int i, const string&amp; p, const string&amp; o , const string&amp; s, const string&amp; h) {
    Data_Elem temp(i, p, o, s, h);
    while (temp-&gt;prev != NULL) {
       temp = temp-&gt;prev;
    }
    Data_Elem *temp2;
    temp2 = new Data_Elem;
    temp2-&gt;prev = NULL;
    temp2-&gt;next = temp;
    temp-&gt;prev = temp2;
 }

    return 0;
}
</code></pre>
<p>so sieht die einfuege-Funktion jetzt aus, aber es klappt nocht so wie ich dachte.</p>
<p>Gruß, nihilfire</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1207246</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1207246</guid><dc:creator><![CDATA[nihilfire]]></dc:creator><pubDate>Wed, 10 Jan 2007 16:19:56 GMT</pubDate></item></channel></rss>