einfach Liste mit struct - Einfügen und Ausgeben von Elementen

Hm ja es spricht nix dagegen, dass die insert_sort davor einfügt.
Dann muss insert_sort drei Fälle beachten:
1. Leere Liste => insert ausführen
2. Einzufügendes Element < erstes Element => Element davoreinfügen
3. Einzufügendes Element >= erstes Element => insert nutzen

Mein Problem ist aber wie ich den ersten und zweiten Fall trenne. Wenn es nämlich eine leere Liste ist (NULL) und ich auf ein next-Element zugreife (Einzufügendes Element < erstes Element) knallt es bei der Bedingung, oder?
 
Das hier wird verwirrend :D

Wenn man insert_sort NULL übergibt, wie kann es dann
bei vorhandener Liste überhaupt Werte vergleichen?
NULL darf nur kommen, wenn wirklich noch nichts da ist.
 
xD ja du hast recht. ich habe es jetzt direkt in der insert_sort. es funktioniert auch so weit alles gut. allerdings scheint es noch ein problem zu geben denn manchmal werden elemente weggeschnitten....

//edit: so bald mehr als 3 elemente in der liste sind und ein wert an ende eingefügt werden soll (höchster wert), dann verschwinden alle elemente bis auf die letzten 2 der liste. d.h. bei
Code:
*select=newelement;
in der insert läuft was schief.
zwischenstatus:
Code:
#include <stdio.h>
#include <stdlib.h>

typedef struct list_izahl_element  {
        int  izahl;
        struct list_izahl_element *pnext;
    } Liste_izahlen;

void print_list(Liste_izahlen *list){
    int counter=1;
    Liste_izahlen* runner=list;

    if (!runner)
        printf("Leere Liste!\n");
    else
        while (runner){ 
            printf("%d. %d\n", counter++, runner->izahl);
            runner=runner->pnext;}
}

void insert(Liste_izahlen **select, int iZahlinput){
    Liste_izahlen *newelement=(Liste_izahlen*) malloc (sizeof(Liste_izahlen));
    newelement->izahl=iZahlinput;
    newelement->pnext=NULL;

    if (!*select)
        *select=newelement;
    else{
        newelement->pnext=(*select)->pnext;
        (*select)->pnext=newelement;} 
}

 void insert_sort(Liste_izahlen **list, int iZahlinput){
    Liste_izahlen **runner=list;

    if(!*runner)
        insert(runner,iZahlinput);

    else if(((*runner)->izahl>iZahlinput)){
        Liste_izahlen *newelement=(Liste_izahlen*) malloc (sizeof(Liste_izahlen));
        newelement->izahl=iZahlinput;
        newelement->pnext=*runner;
        *runner=newelement;}

    else{
        while((iZahlinput>((*runner)->izahl)) && ((*runner)->pnext!=NULL) && (iZahlinput>((*runner)->pnext->izahl)))
            *runner=(*runner)->pnext;
        insert(runner,iZahlinput);
    }
 }

int main(void){
int input=0;
Liste_izahlen *xylist=NULL;

while(1){
    printf("Geben Sie eine Ganzzahl ein: ");
    if (scanf("%d", &input)){
        insert_sort(&xylist,input);
        print_list(xylist);}
}
}
 
Zuletzt bearbeitet:
Nein, der Fehler ist in insert_sort(). Wenn einmal Zeile 47 erreicht wird, änderst du, wenn du genauer hinsiehst, die Stelle, auf die xylist im main() zeigt. runner zeigt ja auf die xylist und wenn du dann schreibst:
C++:
*runner =
Dann veränderst du das, auf das runner zeigt, also xylist. Die Daten sind also schon vorhanden, nur hast du den Startpunkt verändert.
Am besten erstellst du hier einen weiteren Pointer und erledigst das mit dem. Da das xylist nur bei dem Fall, dass es auf NULL zeigt, also die Liste leer ist, geändert werden darf, musst du das nur in Zeile 37 übergeben. In allen anderen Fällen sollte ein normaler Pointer zur Übergabe ausreichen, mit dem dann auch der Fehler in Zeile 47 behoben werden sollte.

Lg
 
Also meine insert_sort sieht nun so aus:
Code:
 void insert_sort(Liste_izahlen **list, int iZahlinput){
    if(!*list)
        insert(list,iZahlinput);

    else if(((*list)->izahl>iZahlinput)){
        Liste_izahlen *newelement=(Liste_izahlen*) malloc (sizeof(Liste_izahlen));
        newelement->izahl=iZahlinput;
        newelement->pnext=*list;
        *list=newelement;}

    else{
        Liste_izahlen *runner=*list;
        while((iZahlinput>runner->izahl) && (runner->pnext) && (iZahlinput>(runner->pnext->izahl)))
            runner=runner->pnext;
        insert(&runner,iZahlinput);
    }
 }
Ist auf jedenfall lauffähig und funktioniert so wie es soll ;) Danke für eure Hilfe!
 

Neue Beiträge

Zurück