doppelt verkette Liste
-
Hallo Leute,
ich hab da eine Frage. Das Programm geht super aber ich will bei der doppelt verketten Liste die Elemente nicht am Anfang der Liste hinzufügen sondern am Ende (AssignListe) und bekomme das aber nicht hin.Könnte mir wer helfen?
#include <iostream>
#include <conio.h>
#include <math.h>using namespace std;
struct Liste
{
int Element;
Liste *next;
Liste *prev;
};void AssignListe(Liste*,Liste*, int&); //nCount muss verändert werden können
void DisplayListe(Liste*);
void DeleteElement(Liste*, Liste*, int&); //nCount muss verändert werden können
void DeleteListe(Liste*, Liste*);
void bubble(Liste *head, int&); //nCount muss verändert werden können
int search(Liste *, int );void main ()
{ // Liste Erstellen
int suche = 0;
int erg = 0;Liste *head,*z;
head = new Liste;
z = new Liste;
head->next = z;
head->prev = 0;
z->next = z;
z->prev = head;int auswahl = 0;
char auswahl2 = 'N';
int nCount = 0; //Zählvariabledo
{
cout <<"******************************************\n\n";
cout <<"Bitte waehlen Sie den Menue Punkt aus!\n\n";
cout <<"******************************************\n\n";
cout <<"[1]....Neues Element anlegen\n";
cout <<"[2]....Elemente ausgeben\n";
cout <<"[3]....Element loeschen\n";
cout <<"[4]....Liste loeschen\n";
cout <<"[5]....Liste sortieren\n";
cout <<"[6]....Suche nach einem Element\n";
cout <<"[7]....Programm beenden\n\n";
cout <<"******************************************\n\n";cout <<"Ihre Auswahl: ";
cin >> auswahl;
cout << endl;switch(auswahl)
{
case 1:
{
system ("cls");
AssignListe(head,z, nCount); //hinzufügen von Elementen
}
break;case 2:
{
system ("cls");
DisplayListe(head);
}
break;case 3:
{
system ("cls");
DeleteElement(head, z, nCount);
}
break;case 4:
{
system ("cls");
DeleteListe(head, z);
nCount = 0; // alles Löschen Zähler wieder auf 0
}
break;case 5:
{
system ("cls");
bubble(head,nCount); //Bubble Sortierung
}
break;case 6:
{
system ("cls");
cout <<"Geben Sie das zu suchende Element ein\n";
cin >> suche;erg = search(head , suche);
if (erg != 0)
{
cout << endl;
cout <<"Das element wurde Gefunden!\n\n";
break; // Abruch wenn gefunden
}else
cout << endl;
cout <<"Das Element wurde nicht gefunden!\n\n";
}
break;default:
{
system ("cls");
cout <<"Wollen Sie das Programm nun beenden? (J/N)\n";
cin >> auswahl2;
cout << endl;if (auswahl2 == 'j' || auswahl2 == 'J')
{
system ("cls");
cout <<"Auf Wiedersehn!\n\n";
return;
}
else
{
system ("cls");
auswahl2 = 'N';
}
}
break;
}}while ( auswahl2 == 'n' || auswahl2 == 'N');
delete head; //Löschen des Speichers
delete z;_getch();
}
/*
void AssignListe(Liste *head,Liste *z, int& nCount)
{
char frage1 = 'J';do
{
Liste *help01;
help01 = new Liste;cout <<"Geben Sie das Element ein: ";
cin >> help01->Element; // Element einlesen
cout << endl;help01->next = head->next;
help01->prev = head;head->next->prev = help01;
head->next = help01;nCount++; //Zähler erhöhen
cout <<"Noch eine Eingabe? (J/N)\n";
cin >> frage1;
cout << endl;
system("cls");}while ( frage1 == 'j' || frage1 == 'J');
}
*/void AssignListe(Liste *head,Liste *z, int& nCount)
{
char frage1 = 'J';do
{
Liste *help01;
help01 = new Liste;cout <<"Geben Sie das Element ein: ";
cin >> help01->Element; // Element einlesen
cout << endl;help01->next = head->next;
help01->prev = head;head->next->prev = help01;
head->next = help01;nCount++; //Zähler erhöhen
cout <<"Noch eine Eingabe? (J/N)\n";
cin >> frage1;
cout << endl;
system("cls");}while ( frage1 == 'j' || frage1 == 'J');
}void DisplayListe(Liste *head)
{
Liste *help02;
help02 = new Liste;
help02 = head->next;if(help02 != help02->next)
{
do
{
cout <<"Element: "<< help02->Element << endl;
cout << endl;help02 = help02->next;
}while (help02 != help02->next);
}else
{
cout << endl;
cout <<"\n";
cout <<"Liste Leer!\n";
cout <<"\n";
}
}void DeleteElement(Liste *head, Liste *z, int& nCount)
{
Liste *help03;
help03 = new Liste;
help03 = head->next;int ID = 0;
system ("cls");
cout <<"Geben Sie das zu loeschende Element ein: ";
cin >> ID;help03 = head;
while (help03->next != help03)
if(help03->Element == ID)
break;
else
help03 = help03->next;if (help03->Element != ID)
{
cout << endl;
cout <<"\n";
cout <<"Element nicht gefunden!\n";
cout <<"\n";
}help03->prev->next = help03->next;
help03->next->prev = help03->prev;cout << endl;
cout <<"************************\n";
cout <<"Element wurde geloescht!\n";
cout <<"************************\n";
cout << endl;nCount --; // Zähler um 1 zurücksetzen
}
void DeleteListe(Liste *head, Liste *z)
{
Liste *help03;
help03 = new Liste;
help03 = head->next;system ("cls");
head->next = z;
head->prev = 0;
z->next = z;
z->prev = head;cout << endl;
cout <<"\n";
cout <<"Liste geloescht!\n";
cout <<"\n";
cout << endl;}
void bubble(Liste *head,int& nCount)
{
int nKeys[100];
int k = 0;
int i, j, t = 0;Liste *help02;
help02 = new Liste;
help02 = head->next;if(help02 != help02->next)
{
do
{
k++;
nKeys[k] = help02->Element; // Elemente in arrayhelp02 = help02->next;
}while (help02 != help02->next);
}else
{
cout << endl;
cout <<"\n";
cout <<"Liste Leer!\n";
cout <<"\n";
}
//Bubble Sort ---> Absteigende sortierung
for(i=0;i<10;i++)
{
for(j=0;j<i;j++)
{
if(nKeys[i]>nKeys[j])
{
int temp=nKeys[i];
nKeys[i]=nKeys[j];
nKeys[j]=temp;
}
}
}cout << endl; //Ausgabe der Elemente
cout <<"Die Sortierten Element: \n\n";for(i = 0; i < nCount; i++)
{
cout << nKeys[i] << endl;
}
}int search(Liste *head, int suche)
{
Liste *help02;
help02 = new Liste;
help02 = head->next;while(help02->next != help02)
if(help02->Element == suche)
break;
else
help02 = help02->next;
if(help02->Element != suche)
return 0;}
-
Das schaut sehr nach C aus, daher falsches Forum. Wird aber sicherlich bald verschoben.
Ansonsten kannst du mehrere Ansätze verfolgen. Du kannst z.B. beim Add solangange durch die Liste laufen bis list->next == NULL ist. Dann bist du am Ende angelangt. Das wäre dann der ineffektive Weg. Der Effektive Weg ist: Du speicherst dir in deiner Leeren List noch den Anfang und das Ende der Liste. Dann wäre es aber sinnvoll zwei Structs zu machen
//Die leere Liste struct List { Node * first; //Zeiger auf das erste Element Node * last; //Zeiger auf das letzte Element int count; //Ist nicht notwendig aber für Pluspunkte beim leerer wäre da ein netter gimmick ;) } //Ein eintrag in der Liste struct Node { Node* next; Node* prev; int Element; }
Hier musst du etwas bei den Verzeigerungen aufpassen aber das ist nicht wirklich schwer.
-
Danke, dass werde ich mal versuchen.
-
Dieser Thread wurde von Moderator/in Martin Richter aus dem Forum MFC (Visual C++) in das Forum ANSI C verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
wenn man eine double circular list nehmen würde, also das erste element auf das letzte zeigen lassen würde bräuchte man sich nur den ersten knoten zu merken, ob diese link form vorteile hat weiß ich nicht, könnte aber sein, da es microsoft exzessiv in seinen task structs einsetzt.
das mit der länge ist eigentlich nur sinnvoll, wenn man ständig die länge wissen will, sonst könnte man die schleife einfach gegen einen sentinel laufen lassen, also null oder der erste knoten.
evtl. für einen ersten eindruck, ist zwar nur eine single circular linked list, aber das prinzip sollte schon klar werden
lg lolo
-
Immer noch im falschen Forum. Das ist verkorkstes C++. Ergo nimm #inlude <list> und alles wird jut.
-
Tyrdal schrieb:
Immer noch im falschen Forum. Das ist verkorkstes C++. Ergo nimm #inlude <list> und alles wird jut.
Y schrieb:
cout << "Wollen Sie das Programm nun beenden? (J/N)\n";
-
Fedaykin schrieb:
Das schaut sehr nach C aus, daher falsches Forum. Wird aber sicherlich bald verschoben.
C? Ich kann diesen Code mit meinem C-Compilier nicht übersetzen. Ein Objekt 'cout' gibt es nicht, und in C habe ich noch nie Link-Shifts mit Strings gesehen.
Bitte nach C++ verschieben.
-
Und der nächste im C++ Forum meckert das sein Standardkonformer Kompiler die
void main()
nicht akzeptiert und bittet um verschiebung ins Visual C++ Forum... Super
.
-
Fedaykin schrieb:
Und der nächste im C++ Forum meckert das sein Standardkonformer Kompiler die
void main()
nicht akzeptiert und bittet um verschiebung ins Visual C++ Forum... Super
.
dann weiß er zumindest was es heißt unportabelen code zu schreiben, da bist ständig auf der suchen nach nem passierschein a 38 :p
-
Und der nächste im C++ Forum meckert das sein Standardkonformer Kompiler die
C/C++ Code:
void main()
C/C++ Code:
void main()
C/C++ Code:
void main()nicht akzeptiert und bittet um verschiebung ins Visual C++ Forum... Super
Da wäre er schonmal etwas besser aufgehoben, weil die Sprache stimmt.
Es gibt allerdings überhaupt keinen Grund void main zu schreiben, nie.
-
Tyrdal schrieb:
Es gibt allerdings überhaupt keinen Grund void main zu schreiben, nie.
Doch natürlich. Z.B. ein Programm das nicht im klassischen Sinne terminiert und gar keinen Status an ein OS zurückgeben kann.
-
Tim schrieb:
Tyrdal schrieb:
Es gibt allerdings überhaupt keinen Grund void main zu schreiben, nie.
Doch natürlich. Z.B. ein Programm das nicht im klassischen Sinne terminiert und gar keinen Status an ein OS zurückgeben kann.
Muß ja nicht mal ein OS sein, bei embedded- Kisten wird der Assembler- Startupcode durchlaufen und main als Unterroutine angesprungen, meist sind noch Kommentare drin, wie man den Rückgabewert absammeln kann. Auf PCs kratzt das keinen mehr, aber auf Controllern mit nur ein paar Bytes RAM schon.
Wenn man eh weiß, das Ding springt in main und kommt nie wieder, kann man sich die Bytes für die Rücksprungadresse sparen (RAM) und die paar Bytes ROM für den Code, der den Rückgabewert bereitstellen würde.
Dann ist aber die main korrekterweise eine void main(void). Immer dran denken: Es laufen mehr Zeilen Code auf embedded als auf PCs oder Mainframes; in der Summe der installierten Systeme betrachtet, sind PCs tatsächlich in der Unterzahl.
-
pointercrash() schrieb:
Immer dran denken: Es laufen mehr Zeilen Code auf embedded als auf PCs oder Mainframes; in der Summe der installierten Systeme betrachtet, sind PCs tatsächlich in der Unterzahl.
Und? Obwohl es viel mehr Bazillen als Menschen gibt, darf ich doch trotzdem deren Tischmanieren ablehnen.
-
volkard schrieb:
Und? Obwohl es viel mehr Bazillen als Menschen gibt, darf ich doch trotzdem deren Tischmanieren ablehnen.
Endlich mal eine qualifizierte Meldung zur doppelt verketteten Liste!
Martin Luther sagte dazu: "Warum rölpset und forzet Ihr nicht? Hat es Euch nicht geschmacket?"