Bubblesort mit Zeigern
-
Hi, icg bin neu im C++ Geschäft und habe daher auch Probleme mit Zeigern.
Wir sollen den Bubblesort Algo. statt mit Zählvariablen mit Zeigern programmieren.
Mein Kompiler zeigt mir zwar keine fehlermeldung mehr an, trotzdem stürtz das Programm ab,habe die Vermutung das ich das Array irgendwie überlade. Vieleicht könnt ihr mir ja bei meinem Problem helfen. Danke schon mal im vorraus.#include <iostream>
using namespace std;int main()
{
int folge[8] = { 28, 58, 23, 17, 91, 11, 80, 54 };
int j,k,h;
int *ptri, *ptrj, *ptrk;
bool getauscht;for(ptri = folge+7; ptri >= folge+1; ptri--)
{
getauscht = false;
ptrj=&j;
for( ptrj = 0; *ptrj < *ptri; ptrj++)
{
if (folge[j] > folge[j+1])
{
h = folge[j];
folge[j] = folge[j+1];
folge[j+1] = h;
getauscht = true;
}
}
if (!getauscht) break;
else
{ ptrk=&k;
int n=8;
for(ptrk=0; *ptrk < n; ptrk++) cout << folge[k] << " ";
cout << endl;
}
}
return 0;}
-
Erstmal reicht es nicht aus, einfach ein paar Zeiger dazwischenzuwerfen, um das Programm umzustellen. Du solltest vermutlich statt über Indizes die einzelnen Array-Elemente über Zeiger direkt ansprechen - und davon sieht man in deinem Programm überaupt nichts.
Zweitens:
Misery Index schrieb:
[cpp]
for( ptrj = 0; *ptrj < *ptri; ptrj++)Hier dereferenzierst du einen NULL-Zeiger, was bestimmt nicht im Sinne des Erfinders ist.
-
Kannst du mir eventuell hilfestellung geben ich weiß einfach nicht wo ich anfangen soll, das was ich über zeiger gelesen und gefunden habe hilft mir nicht wirklich weiter.
-
Im Grunde ist der Übergang von indexbasierten Algorithmen auf pointerbasierte ganz einfach und mechanisch (was klar ist, denn auch ein Pointer ist ja so etwas ähnliches wie ein Index). Dazu musst du dir nur klar machen, dass der Ausdruck p[i] nichts anderes ist als *(p+i). Du kannst also den ganzen algorithmus derart umschreiben. Schließlich ersetzt du p+i überall durch einen neuen Pointer anstelle des Index i, so dass alles (mathematisch) richtig bleibt.
also:const int dim = 8; int array[ dim ] = ... for ( int i = 0; i != dim; ++i ) { //irgendwas mit array[i] bzw. *( array + i ) machen }wird zu
const int dim = 8; int array[ dim ] = ... for ( int* p = array /* array+i => p, also im ursprünglichen code auf beiden Seiten array addieren und dann links durch p substituieren */; p != array + dim; ++p ) { //irgendwas mit *p machen }
-
So habe mich hoffentlich verbessert, nun hänge ich aber an der "Tausche Operation" fest, Kompiler sagt nur "non-lvalue in assignment", warum ???, was die operation eigentlich machen soll ist mir klar, aber irgendwie klappt das nicht. Und meine Ausgabe funktioniert nicht . Bitte um hilfe
Es sollen keine Zählvariablen oder sonst irgendwas im Programm auftauchen.[#include <iostream>
using namespace std;
int main()
{
const int dim =8;
int folge[dim] = { 28, 58, 23, 17, 91, 11, 80, 54 };
bool getauscht;for(int *ptri = folge+7; ptri >= folge+1; ptri--)
{ getauscht = false;for( int *ptrj=folge+1; ptrj < ptri; ptrj++)
{
if (ptrj > ptrj+1)
{
int temp;
temp = *ptrj;
*ptrj = *ptrj+1;
*ptrj+1 = temp;
getauscht = true;
}
}
if (!getauscht) break;
else
{
int n=8;
int *ptrn=&n;
for(int *ptrk=0;ptrk < ptrn; ptrk++) cout << folge[ptrk] << " ";
cout << endl;
}
}
return 0;}
]
-
evtl. Klammern
temp = *ptrj; *ptrj = *(ptrj+1); *(ptrj+1) = temp;oder gleich std::swap
-
ok klappt, aber wie bekomme ich die ausgabe hin zum schluß ???
-
Du mußt die Ausgabeschleife genau so umstellen wie die Sortierschleife.
for(int *ptrk=folge; ptrk < folge+8; ptrk++) cout << *ptrk << " ";