C/C++ -- Insertionsort via pointer
-
Hallo
Ich habe letztens einmal den Sortieralogithmus via zeigern geschrieben...allerdings funktioniert da etwas nicht...ich weis nicht mehr weiter...kopiere den code einfach mal hier rein:#include <iostream> #include "stdio.h" /** BESCHREIBUNG int main(void) void listeEinlesen() ---> unsortierte Zahlenreihe einlesen void sortiereListe() ---> Zahlenreihe wird nach der Aufgabenstellung sortiert void loesche() ---> lösche die Liste void ausgabe() ---> sortierte Zahlenreihe wird ausgegeben **/ /**INITIALISIERUNG GLOBAL**/ struct tListe //Liste { int info; struct tListe *next; //struct tListe *first; }; struct tListe *next = NULL; struct tListe *first = NULL; //****// void ListeEinlesen() //Erzeugt eine lineare liste mit x-Elementen { printf("Bitte geben sie die zu sortierenden Zahlen ein\n"); printf("Geben sie jeweils eine Zahl ein und bestaetigen mit ENTER\n"); printf("Beendet werden kann die Eingabe mit 0 und ENTER\n"); //Eingabe der Zahlen int i = 0; //Abbruchbedingung der Schleife "Eingabe" int zahl = 0; //Derzeit eingelesene Zahl do { scanf("%d", &zahl); i = zahl; //Korrekte Eingabe getätigt if (i!=0) { struct tListe *zeiger = NULL; if (first!=NULL) //Es sind schon Elemente vorhanden { zeiger=first; while (zeiger->next != NULL) //Bis an das Ende der Liste gehen { zeiger=zeiger->next; }; //Speicherreservierung if((zeiger->next =(struct tListe *) malloc(sizeof(struct tListe))) == NULL) { fprintf(stderr,"Kein Speicherplatz für das letzte Element\n"); return; }; zeiger=zeiger->next; zeiger->info = zahl; zeiger->next = NULL; }; if (first==NULL) //Es sind keine Elemente vorhanden { //Speicherreservierung if((first =(struct tListe *) malloc(sizeof(struct tListe))) == NULL) { fprintf(stderr,"Kein Speicherplatz für das letzte Element\n"); return; }; first->info = zahl; first->next = NULL; }; }; }while(i!=0); }; void loesche() { while(first!=NULL) { free(first); }; }; void sortiereListe() { int fertig = 0; //Abbruchbedingung der Schleife struct tListe *A = NULL; struct tListe *B = NULL; struct tListe *temp = NULL; struct tListe *temp2 = NULL; if (first!=NULL) { A=first; B=first->next; temp=first; while (B!=NULL) { if ((B->info)<(A->info)) { if((temp->info)>(B->info)) { A->next=B->next; B->next=temp; temp=B; first=temp; B=A->next; } else //if ((temp->info)<(B->info)) { A->next=B->next; while((B->info)>(temp->info)) { temp2=temp; temp=temp->next; }; temp2->next=B; temp=first; temp2=first; B=A->next; }; } else if ((B->info)>(A->info)) { A=B; B=B->next; }; }; } else printf("Keine Elemente vorhanden\n"); }; void ausgabe() { printf("....\n"); printf("\n"); printf("\n"); struct tListe *zeiger2 = NULL; zeiger2=first; if (first==NULL) printf("Es hat keine Sortierung stattgefunden\n"); else { while(zeiger2!= NULL) { printf("%d ",zeiger2->info); zeiger2=zeiger2->next; }; }; }; int main(void) { int x = 0; printf("Hierbei werden Zahlen aufsteigend sortiert\n"); printf("\n"); printf("\n"); printf("\n"); do { ListeEinlesen(); printf("\n"); printf("\n"); printf("Sie haben nun Zahlen eingelesen\n"); printf("Die Sortierung erfolgt\n"); printf("..\n"); printf("..\n"); printf("\n"); sortiereListe(); ausgabe(); printf("\n"); printf("\n"); printf("Moechten sie noch eine Sortierung durchfuehren lassen?\n"); printf("1 fuer Ja oder 2 fuer Nein \n"); fflush(stdin); scanf("%d",&x); printf("\n"); printf("\n"); printf("\n"); loesche(); }while(x==1); printf("BYE\n"); //Speicherplatz freigeben while (first!=NULL) { free(first->next); }; return EXIT_SUCCESS; };Ich weis,dass manches umständlich geschrieben ist und dass das kernstück darauf basiert,dass vieles global deklariert ist...ein kollege hatte mir auch davon abgeraten so zu coden...aber würde trotzdem gerne wissen warum dass nich korrekt funktioniert...dankeschön
-
Nulltens: Schreibst du eigentlich in C oder C++? Ich sehe zwar ein "#include <iostream>", aber der Rest des Codes sieht eindeutig nach C aus.
Erstens: Niemand hier wird sich durch 200 Zeilen Code durcharbeiten auf der Suche nach einem möglichen Fehler. Also würdest du bitte etwas genauer erläutern, wie sich dieses "allerdings funktioniert da etwas nicht" äußert?
Zweitens: Und bitte schmeiß alles aus dem Programm raus, was nichts mit der Aufgabe zu tun hat.
Drittens: @globale Variablen: Den Wert 'first' kannst du als Parameter zwischen den Funktionen herumreichen - und 'next' wird überhaupt nicht verwendet, soweit ich das überblicke.
Viertens:
void loesche() { while(first!=NULL) { free(first); }; };Das wird erstens in einer Endlosschleife (free löscht zwar die Daten hinter dem übergebenen Zeiger, aber nicht den Zeiger selber) und zweitens in einem SegFault (du gibst ständig den selben Speicherblock frei) führen. Du mußt dich schon durch die Liste hangeln, um nacheinander alle Elemente zu löschen:
void loesche(struct tListe* first) { while(first!=NULL) { struct tListe* tmp = first; first = first->next; free(tmp); } }PS: sfds (dieses Mal war ich noch so freundlich, deinen Beitrag anzupassen)