Hi Leute,
sitze jetzt schon seit Studen an meinem Problem und finde den Fehler nicht.
Würde mich sehr freuen, wenn mir mal einer sagen könnte, warum das Programm immer bei der ausführung des Unterprogramms (SpeicherninListe) hängen bleibt.
Die Logik mit den Zeigern müsste doch stimmen, oder habe ich etwas übersehen ?
Verschiedene Unterprogramme des Programms habe ich weggelassen, damit ihr nur das wesentliche seht. (Doppelt verkettete Liste)
Danke im Vorraus für eure Hilfe.
Alles anzeigen
sitze jetzt schon seit Studen an meinem Problem und finde den Fehler nicht.
Würde mich sehr freuen, wenn mir mal einer sagen könnte, warum das Programm immer bei der ausführung des Unterprogramms (SpeicherninListe) hängen bleibt.
Die Logik mit den Zeigern müsste doch stimmen, oder habe ich etwas übersehen ?
Verschiedene Unterprogramme des Programms habe ich weggelassen, damit ihr nur das wesentliche seht. (Doppelt verkettete Liste)
Danke im Vorraus für eure Hilfe.
Quellcode
- struct konto{
- unsigned int kontoNr; /* Kontonummer */
- float kontoStd; /* Kontostand */
- char art; /* Guthaben mit 'g', Darlehn mit 'd' */
- float zinsSz; /* Zinssatz */
- float annuitaet; /* jaehrliche Zahlungen */
- unsigned int laufZt; /* Wielange das Guthaben stehen soll */
- char inHaberptr; /* Inhaber des Kontos */
- char *name; /* Inhaber des Kontos */
- }konten[KONTENZ];
- struct liste{
- struct liste *next;
- struct liste *previous;
- struct konto *kont;
- };
- struct liste *neueListe();
- int main(int argc, char *argv[])
- {
- printf("\n\tAufgabenblatt 5 von Gregor Krah \n");
- printf("\n\tUebersetzt am %s ", __DATE__);
- printf("\n\tum %s \n", __TIME__);
- int i;
- static char art;
- struct liste *head = neueListe(); /* Pointer auf neue Liste erzeugen */
- struct liste *aktuell = head; /* Pointer auf das aktuelle Element */
- struct konto *kontoptr = &konten[i]; /* Pointer auf aktuelles Konto */
- for(; ; )
- {
- printf("\t\nWas moechten Sie tun? ");
- printf("\t\nEingabe 'e' - Ausgabe 'a' - quit 'q'");
- printf("\t\n\nGewuenschte Option eingeben 'e' || 'a' || 's' || 'l' ||'q': ");
- scanf("%s", &art);
- switch(art)
- {
- case 'e' : printf("\n\tSie moechten eine Eingabe machen!");
- if(anzahlKon <= KONTENZ)
- auswahl();
- else
- printf("\n\tEs koennen keine Konten mehr angelegt werden!\n");
- break;
- case 'a' : printf("\n\t Ausgabe! \n");
- for(i = 0; i < anzahlKon ;i++)
- {
- switch(konten[i].art)
- {
- case 'g' : berechneKap(i);
- printf("\n\tKunden-Rendite (%s):"
- "Guthaben nach %i Jahren: %.2f",
- konten[i].name, konten[i].laufZt,
- konten[i].kontoStd);
- printf("\n\n");
- break;
- case 'd' : berechneDar(i);
- printf("\n\tKunden Darlehn (%s):"
- "Tilgung erfolgt im %i. ten Jahr",
- konten[i].name,konten[i].laufZt);
- printf("\n\n");
- break;
- default : printf("\n\tFehler!!\n");
- }
- }
- break;
- case 'q' : return 0;
- break;
- case 's' : printf("\n\tIn Datei geschrieben!\n");
- schreibeDatei();
- break;
- case 'l' : printf("\n\tAus Datei lesen\n");
- leseDatei();
- break;
- case 'd' : printf("\n\tKonten in Doppelt verlinkte Liste gespeichert\n");
- speicherInListe(head, aktuell, kontoptr);
- break;
- case 'o' : printf("\n\tAusgabe von Liste\n");
- gibAus(head, aktuell);
- break;
- default : printf("\nFehler bei der Eingabe!?\n");
- }
- }
- system("PAUSE");
- return 0;
- }
- /****************************************************************************
- * Erzeuge eine neue Doppelt verlinkte Liste *
- * *
- ****************************************************************************/
- struct liste *neueListe()
- {
- struct liste *neu = (struct liste*) malloc(sizeof(struct liste));
- neu->kont = NULL;
- neu->next = neu;
- neu->previous = neu;
- return neu;
- }
- /****************************************************************************
- * speichere Elemente in eine Doppelt verkettete Liste *
- * *
- ****************************************************************************/
- void speicherInListe(struct liste *head, struct liste *aktuell, struct konto *kontoptr)
- {
- /* setze aktuell auf Listenanfang */
- aktuell = head;
- /* Erzeuge neuen Knoten und weise ihm ein Konto zu */
- struct liste *neu = (struct liste *) malloc(sizeof(struct liste));
- neu->kont = kontoptr;
- /* Wenn Liste nur ein Element hat füge neues Element entsprechend ein */
- if(aktuell->next == aktuell)
- {
- neu->previous = aktuell;
- neu->next = aktuell;
- aktuell->next = neu;
- aktuell->previous = neu;
- printf("\n%s Name:\t %u", kontoptr->name, neu);
- }
- else
- {
- /* setzt aktuell auf zweites Element, da erstes Element = NULL */
- aktuell = head->next;
- /* suche Einzeigerstelle */
- while((strcmp(aktuell->kont->name, neu->kont->name) < 0) && (head != (aktuell->next)))
- {
- aktuell = aktuell->next;
- printf("%u", aktuell);
- }
- /* neuen Knoten Einzeigern */
- neu->previous = aktuell->previous;
- neu->next = aktuell;
- (aktuell->previous)->next = neu;
- aktuell->previous = neu;
- printf("\n Name: %s\t %u\n", kontoptr->name, neu);
- }
- }
- /****************************************************************************
- * Gesamte Liste ausgeben *
- * *
- ****************************************************************************/
- void gibAus(struct liste *head, struct liste *aktuell)
- {
- aktuell = head->next;
- while(head != (aktuell->next))
- {
- printf("Name: %s \n", aktuell->kont->name);
- printf("Kontostand: %.2f \n", aktuell->kont->kontoStd);
- aktuell = aktuell->next;
- }
- }