Eintrag in Binärbaum ändern

Post Reply
Message
Author
sesame

Eintrag in Binärbaum ändern

#1 Post by sesame »

Hallo,

hat jemand eine Idee, wie ich einen Datensatz in einem binären Suchbaum ändern kann?

Der Suchbaum funktioniert schon gut, nur bekomme ich die einmal eingelesenen Einträge nicht geändert (nicht löschen).

Die Struktur dazu:

Code: Select all

struct binaer_knoten{
    char name[MAX];
    int nummer;
    int bestand;
    struct binaer_knoten *links;
    struct binaer_knoten *rechts;
}var1;

struct binaer_baum{
    struct binear_knoten *root;
    int counter;
};

struct binaer_baum *init(void) {
    struct binaer_baum *baum =(struct binaer_baum *)
    malloc(sizeof *baum);
    if(baum == NULL) {
        fprintf(stderr, "Speicherplatzmangel!\n");
        return NULL;
    }
    else { /*Initialisieren*/
        baum->root = NULL;
        baum->counter=0;
        return baum;
    }
}

User avatar
Janka
Posts: 3585
Joined: 11. Feb 2006 19:10

#2 Post by Janka »

Was ist dein Schlüssel? "name"? Den darfst du sowieso nicht ändern, denn damit müsste sich die Position des Objekts in deinem Baum ändern.

Ansonsten verstehe ich dein Problem nicht. Ändern der anderen Werte ist Zugriff auf die Punkte der Struct mittels -> .

Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.

sesame

#3 Post by sesame »

danke für die antwort. jetzt scheine ich mein problem lokalisiert zu haben.

Mittels

Code: Select all

    const struct binaer_knoten *knoten;
...
printf("\nBitte neuen Bestand des Artikels eingeben : ");
            scanf("%i", &bestand);
            binaere_suche(re, nummer);
            knoten->bestand=bestand;
            printf("Neuer Bestand: %i\n", knoten->bestand);
soll der nach der Nummer sortierte Datensatz geändert werden (nur der Bestand, Rest bleibt). Damit entfällt auch ein neu einsortieren.

Das jetzige Problem: "Fehler: Zuweisung der schreibgeschützten Speicherstelle".

Wie kann ich den Bestand ändern?

sesame

#4 Post by sesame »

so geht's:

Code: Select all

int aendern( struct binaer_baum *baum, int nummer) {
    struct binaer_knoten *knoten;
    
    /* Zuerst an die Wurzel */
    knoten = (struct binaer_knoten *) baum->root;
    for(;;) {
        if(knoten == NULL) {
            printf("Keine erfolgreiche Suche!\n");
            return;
        }
        if(nummer == knoten->nummer) {  /* Gefunden */
            printf("Artikelnr.: %d \nName: %s\n", nummer, knoten->name);
            printf("\nneuen Bestand eingeben: ");
            scanf("%i", &knoten->bestand);
            printf("\nneuer Bestand: %i\n\n", knoten->bestand);
            return;
        }
        else if(nummer > knoten->nummer)   /* Gesuchtes Element größer  */
            knoten=knoten->rechts;  /* Rechts am Baum weiter     */
        else                       /* Gesuchtes Element kleiner */
            knoten=knoten->links;   /* Links am Baum weiter      */
    }
    return nummer;
}

Post Reply