Adressverwaltung
-
PapLoth323 schrieb:
In Zeile 92 erhält der Vorname für a eine größere Länge als b, obwohl beide Vornamen gleich lang sind. Wie kann dass sein?
Weil die Länge der Vornamen mit BUFLEN nichts, aber auch gar nichts zu tun hat.
Du findest das letzte vorkommen von '\0'. Nur ist der Speicher der Vornamen da schon lange vorbei.
Mal einen Code für strcmp, den du verstehen solltest.int mystrcmp(char a[], char b[]) { int c = 0; while( a[c] == b[c] ) // solange die Strings gleiche Zeichen haben { if( a[c] == '\0' ) // String zu Ende, dann gleich lang (da auch b[c] \0' ist) return 0; c++; } return ( a[c] > b[c]) ? 1 : -1; /* oder in lang if( a[c] > b[c]) return 1; else return -1; */ }
Mehr ist das nicht.
Das brauchst du einmal. Die rust du dann aus ordnung auf.
Einmal für die Nachnamen und dann für Vornamen.
Dann ist ordnung ein 3-Zeiler.
-
Hi! Mithilfe der Funktion
ordnung
kann man ja eine Funktion erstellen, die einen neuen Daten an der richtigen Stelle entsprechend der Ordnungsrelation einfügt.Ich weiß noch nicht so richtig wie ich die Funktion aussehen soll. Ich dachte mir in etwa
struct datensatz *ordnungsrelation(struct datensatz *a,...)
. Dabei weiß ich aber auch nicht, was ich als zweites Argument nehmen soll.Kann mir jemand paar tipps geben, wie ich dabei vorgehen muss?
-
Wenn du Daten einfügen willst, brauchst du einmal die Liste (den Anfang oder den Eintrag vor/nach dem eingetragen werden soll) und dann noch die Daten die eingefügt werden sollen.
Bevor du jetzt versuchst das alles in der Funktion ordnung zu machen, vergiss es.
Du brauchst erstmal Funktionen zur Listenverwaltung.
-
Ok ich habe jetzt die Funktion Ordnung, die unverändert bleibt.
Dann benötige ich eine Funktion zur Listenverwaltung. Und zu guter Letzt die Funktion, die den neuen Datensatz einfügt, richtig?
-
DirkB schrieb:
Du brauchst erstmal Funktionen zur Listenverwaltung.
- Datensatz neu anlegen
- einfügen von Daten
- löschen von Daten
- suchen von Daten
-
DirkB schrieb:
DirkB schrieb:
Du brauchst erstmal Funktionen zur Listenverwaltung.
- Datensatz neu anlegen
- einfügen von Daten
- löschen von Daten
- suchen von DatenWo 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 inmain
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 inmain
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; }