Adressverwaltung



  • DirkB schrieb:

    DirkB schrieb:

    Du brauchst erstmal Funktionen zur Listenverwaltung.

    - Datensatz neu anlegen
    - einfügen von Daten
    - löschen von Daten
    - suchen von Daten

    Wo werden die neuen Datensätze eingespeichert, wenn ich sie einfüge. Nehmen wir mal an, ich habe schon 5 Datensätze und ich füge jetzt noch weitere ein. Wo befinden die sich?



  • Wie hast du denn die anderen 5 angelegt?

    Es geht hier doch um doppelt verkettete Listen.
    Die macht man erst, nachdem man etwas über dynamischen Speicher gelernt hat.
    Dynamischen Speicher bekommt man mit malloc und dgl. ⚠ free gehört auch dazu.

    Und man fängt mit einer leeren Liste an.
    Du kannst ja mal die (Unter-)Forensuche bemühen.



  • Danke DirkB

    Ich habe hier jetzt erstmal die Funktion für das Sortieren

    struct datensatz {
        struct datensatz *vorgaenger, *nachfolger;
        char *name, *vorname, *strasse, *hausnummer, *stadt;
        unsigned char plz[5];
    }adrliste[1000];
    
    int anzahl, aktuell;
    
    void sortDat();
    
    void sortDat()
    {
        int i, x, j;
        struct datensatz *temp;
        temp = malloc((sizeof(struct datensatz *)*1000));
    
        for(j=0;j<(anzahl+1);++j)
        {
            for(i=anzahl; i>-1; --i)
            {
                x=ordnung (&adrliste[i], &adrliste[i-1]);
                if ((x==0)||(x>0))
                {
                    adrliste[i].nachfolger=&adrliste[i-1];
                    adrliste[i-1].vorgaenger=&adrliste[i];
                }
                else
                {
                    *temp=adrliste[i];
                    adrliste[i]=adrliste[i-1];
                    adrliste[i-1]=*temp;
                    adrliste[i].nachfolger=&adrliste[i-1];
                    adrliste[i-1].vorgaenger=&adrliste[i];
                }
            }
        }
    }
    

    Ist der Code richtig?

    free würde ich dann in main einbauen.



  • ComCd schrieb:

    Danke DirkB

    Ich habe hier jetzt erstmal die Funktion für das Sortieren

    struct datensatz {
        struct datensatz *vorgaenger, *nachfolger;
        char *name, *vorname, *strasse, *hausnummer, *stadt;
        unsigned char plz[5];
    }adrliste[1000];
    
    int anzahl, aktuell;
    
    void sortDat();
    
    void sortDat()
    {
        int i, x, j;
        struct datensatz *temp;
        temp = malloc((sizeof(struct datensatz *)*1000));
        
        for(j=0;j<(anzahl+1);++j)
        {
            for(i=anzahl; i>-1; --i)
            {
                x=ordnung (&adrliste[i], &adrliste[i-1]);
                if ((x==0)||(x>0))
                {
                    adrliste[i].nachfolger=&adrliste[i-1];
                    adrliste[i-1].vorgaenger=&adrliste[i];
                }
                else
                {
                    *temp=adrliste[i];
                    adrliste[i]=adrliste[i-1];
                    adrliste[i-1]=*temp;
                    adrliste[i].nachfolger=&adrliste[i-1];
                    adrliste[i-1].vorgaenger=&adrliste[i];
                }
            }
        }
    }
    

    Ist der Code richtig?

    free würde ich dann in main einbauen.

    Ob Dein "Sortieralgorithmus" funktioniert, habe ich jetzt nicht überprüft. Aber Dein Code macht auf mich keinen sinnvollen Eindruck.

    1. Eine Funktionsdeklaration direkt vor der Definition macht keinen Sinn. Da eine Defionition auch gleichzeitig eine Deklaration ist.
    2. In C sollte man auch gleich 'nen Prototypen schreiben statt nur einer einfachen Deklaration. Wenn eine Funktion keine Parameter erwartet, schreibt man dies mit dem Schlüsselwort void. In C++ ist das nicht erforderlich.
    3. Wozu forderst Du für Dein Temp Platz für 1000 Zeiger an, wenn Du aber einen Datensatz benutzten willst?
    4. Wozu machst Du eine doppelt verkette Liste, wenn Du das eh in einem Array gespeichert hast?

    Doppelt verkette Listen macht man nicht aus Jux und Dollerei sondern dann, wenn ein Array nicht möglich ist, weil es z.B. zuviele Datensätze sind.



  • Du solltest schon mit Hilfe der vorgaenger und nachfolger Einträge durch die Liste gehen.
    Sonst sind diese Überflüssig.

    Vermeide globale Variablen.



  • Ist es so besser?

    void sortDat()
    {
        int i, x, j;
        struct datensatz *temp;
        temp = malloc((sizeof(struct datensatz *)*1000));
    
        for(j=0;j<(anzahl+1);++j)
        {
            for(i=anzahl; i>-1; --i)
            {
                x=ordnung (&adrliste[i], &adrliste[i-1]);
                if ((x==0)||(x>0))
                {
                    adrliste[i].nachfolger=&adrliste[i-1];
                    adrliste[i-1].vorgaenger=&adrliste[i];
                }
                else
                {
                    adrliste[i].nachfolger=&adrliste[i-1];
                    adrliste[i-1].vorgaenger=&adrliste[i];
                }
            }
        }
    }
    


  • ComCd schrieb:

    Ist es so besser?

    void sortDat()
    {
        int i, x, j;
        struct datensatz *temp;
        temp = malloc((sizeof(struct datensatz *)*1000));
        
        for(j=0;j<(anzahl+1);++j)
        {
            for(i=anzahl; i>-1; --i)
            {
                x=ordnung (&adrliste[i], &adrliste[i-1]);
                if ((x==0)||(x>0))
                {
                    adrliste[i].nachfolger=&adrliste[i-1];
                    adrliste[i-1].vorgaenger=&adrliste[i];
                }
                else
                {
                    adrliste[i].nachfolger=&adrliste[i-1];
                    adrliste[i-1].vorgaenger=&adrliste[i];
                }
            }
        }
    }
    

    Hast Du alle Warnungen des Compilers deaktiviert? Und wenn nein, warum hast Du sie ignoriert? Meinst Du der Compilerhersteller hat das aus Jux und Dollerei gemacht?



  • Ohne Array.
    Du musst ohne das [ i] auskommen.

    Was soll das temp mit Platz für 1000 Zeiger auf datensatz?

    Du hast nur Zeiger auf die Datensätze. Kein Array, kein Index.

    Schreib mal eine Funktion, die zwei Zeiger auf Datensätze bekommt und diese in der Liste vertauscht.
    Die kannst du dann auch von der Sortierfunktion aufrufen.



  • Versuchs doch mal so:

    struct daten {
           char *name;
           char *vorname;
    }
    
    struct dListe {
          struct dListe *nachfolger;
          struct daten *adresse;
    }	
    
    void Listenverwaltung(struct daten *d)
    {
    struct Liste *L;
    
    Einfuegen(&l, d);
    }
    
    void Einfuegen (struct dListe **dL, struct daten *dat)
    {
    struct dListe *neu = *dL, *b;
    
    while(neu->nachfolger != NULL) {
         if(myStrCmp(neu->nachfolger->adresse->name, dat->name) >= 0)
            break;
         neu = neu->nachfolger;
    }
    
    b = malloc(sizeof(struct dListe));
    b->adresse = dat;
    b->nachfolger = neu->nachfolger;
    neu->nachfolger = b;
    return;
    }
    

    die Funktion Listenverwaltung erhält die Daten von einer funktion, die die Daten bereits in der Struktur gespeichert hat und den entsprechenden Speicher angefordert hat.
    Für eine doppelt verkettete Liste wären noch die entsprechenden Vorgaengerknoten einzufügen.



  • War noch ein Fehler drin.

    struct daten { 
           char *name; 
           char *vorname; 
    } 
    
    struct dListe { 
          struct dListe *nachfolger; 
          struct dListe *vorgaenger;
          struct daten *adresse; 
    }   
    
    void Listenverwaltung(struct daten *d) 
    { 
    struct Liste *L; 
    L = L->nachfolger = L->vorgaenger = NULL;  
    Einfuegen(&L, d); 
    } 
    
    void Einfuegen (struct dListe **dL, struct daten *dat) 
    { 
    struct dListe *neu = *dL, *b; 
    
    while(neu->nachfolger != NULL) { 
         if(myStrCmp(neu->nachfolger->adresse->name, dat->name) >= 0) 
            break; 
         neu = neu->nachfolger; 
    } 
    
    b = malloc(sizeof(struct dListe)); 
    b->adresse = dat; 
    b->nachfolger = neu->nachfolger; 
    neu->nachfolger = b; 
    neu->nachfolger->vorgaenger = b;
    return; 
    }
    

Anmelden zum Antworten