Page 1 of 1

Eintrag in Binärbaum ändern

Posted: 22. Jun 2007 18:20
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;
    }
}

Posted: 23. Jun 2007 8:20
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

Posted: 23. Jun 2007 10:27
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?

Posted: 25. Jun 2007 16:37
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;
}