Zum Inhalt springen

verkettete Liste bei c programmierung für Kontoführungsprogramm


lapi_k

Empfohlene Beiträge

# include <stdio.h>

# include <malloc.h> //*Speicherverwaltung

# include <stdlib.h>

# include <string.h>

# include <math.h>

struct nutzer //* Definition eines Listenelements

{

char vorname [40];

char name [40]; //* Datenteil

char passwort [20];

char kontonummer [10];

struct nutzer *next, *prev; //* Zeiger auf das benachbartes Listenelement

};

struct neuer_nutzer

{

char telefonnummer[15];

char email[30];

int plz[6];

char stadt[30];

};

void main ()

{

int datei_nutzer;

FILE *zeiger_datei_nutzer;

struct nutzer *start=NULL, *aktuell=NULL; //* Zeiger auf das Element mit dem aktuell gearbeitet wird

aktuell = (struct nutzer *) malloc (sizeof(struct nutzer)); //* Anlegen v. neuenm Listenelement

//* soviel Speicher wie nutzer braucht

aktuell-> prev=NULL; //* erstes Element hat kein Vorgänger - Zeiger ins Leere

while (gets(aktuell->name) != NULL) //* solange noch Daten in der Eingabe vorhanden sind, name wird eingelesen

{

scanf ("%s", &aktuell->passwort); //* Passwort wird eingelesen

scanf ("%d", &aktuell->kontonummer); //* Kontonummer wird eingelesen

getchar(); //* Enter von scanf abfangen

aktuell->next = (struct nutzer *) //* neues Listenelement reservieren, Komponente next darauf zeigen lassen

malloc(sizeof(struct nutzer));

aktuell->next->prev = aktuell; //* um den "Rückweg" zu sichern wird Vorgängerzeiger des nächsten Elements auf das aktuelle

aktuell = aktuell->next; //* das nächste, noch leere Element wird das aktuelle, ab hier wird also das neue Element durch aktuell referenziert

}

aktuell->passwort; //* auch wenn das Ende der Daten erreicht ist, wird ein neues

aktuell->kontonummer; //* Element angelegt = leere Werte

aktuell->name;

aktuell->next = NULL;

printf ("-----------------Kontoführungsprogramm-----------------\n");

do

{

printf ("Name:\n", aktuell->name);

printf ("Passwort:\n", aktuell->passwort);

printf ("Kontonummer:\n", aktuell->kontonummer);

fflush(stdin);

zeiger_datei_nutzer = fopen(datei_nutzer,"r");

} while (datei_nutzer == 0);

}

das is das jetzige programm ... es treten keine fehler auf ... allerdings macht es auch nichts .. aber hab ja auch noch nich viel zum machen ... könnt ihr mir weiterhelfen ob der erste teil so geht oder ich was ändern muss

Link zu diesem Kommentar
Auf anderen Seiten teilen

Kurz zurück zur Aufgabenstellung:

- Login mittels Name, Passwort und Kontonummer

- Laden der gespeicherten Daten aus einer Datei in eine verkettete Liste und anschließender Ableich, ob Login vorhanden

Wenn ich nun aber Dein Programm korrekt verstehe, macht es folgendes:

  • Solange Eingabe des Benutzernamens != NULL, lese Passwort und Kontonummer ein und speichere diese in eine verkettete Liste (Frage an dieser Stelle zu "scanf ("%s", &aktuell->passwort);" : Adressoperator bei scanf und String überhaupt korrekt?)
  • Schreibe "Name:", "Passwort:" und "Kontonummer:" auf die Konsole. Du übergibst übrigens Argumente an printf, ohne diese überhaupt zu nutzen.

Ungeachtet dessen, dass ich nicht weiss, was in der letzten Schleife

while (datei_nutzer == 0);

bewirken soll, möchtest Du mit Deinem Programm derzeit zumindest im Ansatz das Gegenteil der Aufgabenstellung machen. Du kannst mehrere Logins über die Tastatur einlesen, aber gefragt ist nur nach einem Login. Mehrere Nutzer sollen nur aus der Datei gelesen werden. Diese werden auch nur in der verketteten Liste gespeichert, nicht die beim Login eingegebenen Daten. Die Daten kannst Du höchstens seperat speichern.

Zum Abschluss noch eine kleine persönliche Bitte: versuche bitte das CODE-Tag zu nutzen. Dann klappt es auch mit Zeilen einrücken und der Code wird dreimal besser zu lesen sein ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Alles in die Main packen, macht die Sache nicht gerade übersichtlich...

Nur mal so als Beispiel:

UserList.h


typedef struct SUser 

{

	SUser()	{ prev = NULL; next = NULL;	}

	char name [40]; //* Datenteil

	SUser *prev;

	SUser *next;

} Nutzer;


void addUserAtEnd(SUser *list, SUser *item)

{

	SUser *tail = list;

	while (tail -> next != NULL)

		tail = tail -> next;


	tail -> next = item;

	item -> prev = tail;

}

UserList.cpp

#include <stdio.h>

#include <string.h>

#include "UserList.h"


int main(int argc, char* argv[])

{

	Nutzer user1;

	strcpy(user1.name, "Benutzer1");

	Nutzer user2;

	strcpy(user2.name, "Benutzer2");

	addUserAtEnd(&user1, &user2);


	Nutzer *buffer = &user1;


	for (int i = 1; buffer != NULL; i++)

	{

		printf("%d:\t%s\n", i, buffer->name);

		buffer = buffer -> next;

	}

	getchar();

	return 0;

}

Die Instanziierung kann man natürlich auch einfach mit malloc ersetzen (ich mags ehrlich gesagt nicht) und das funktioniert soweit, dass ich in der Liste beliebig viele Benutzer hinzufügen kann.

Aus der Datei laden und Benutzer abspeichern wirst du ja sicher selbst hinkriegen...

Link zu diesem Kommentar
Auf anderen Seiten teilen

UserList.cpp

Um potentiellen Mis(s/t)verständnissen (speziell meinerseits) vorzubeugen: Bist Du versehentlich mit Deinen Gedanken in C++ reingerutscht?

Auf mich wirkt schon die erste Zeile der Definition des Structs SUser reichlich befremdlich. Mag aber nicht viel bedeuten, da ich noch nicht so lange mit C arbeite.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Um potentiellen Mis(s/t)verständnissen (speziell meinerseits) vorzubeugen: Bist Du versehentlich mit Deinen Gedanken in C++ reingerutscht?

Nein, da ich hier nur Visual Studio hab (und das komischerweise immer Cpp Dateien erzeugt) ist das halt eine cpp, dürfte aber nicht weiter stören, da der Code reines C ist.

(Falls der Konstruktor des structs nicht im Standard ist, kann man das auch in eine Funktion [in der man wiederrum malloc benutzt] auslagern...)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Nein, da ich hier nur Visual Studio hab (und das komischerweise immer Cpp Dateien erzeugt) ist das halt eine cpp,
Du kannst auch .c-Dateien erstellen, die werden dann auch als C behandelt.

dürfte aber nicht weiter stören, da der Code reines C ist.
Naja, Methoden im Allgemeinen und Konstruktoren im Besonderen gibt's in C nicht.
Link zu diesem Kommentar
Auf anderen Seiten teilen

Du kannst auch .c-Dateien erstellen, die werden dann auch als C behandelt.

Da ich nur C++-Projekte anlegen kann, kann ich die Dateien zwar umbenennen, aber diese werden trotzdem als C++ kompiliert. Ist ja auch egal.

Naja, Methoden im Allgemeinen und Konstruktoren im Besonderen gibt's in C nicht.

Konstruktoren bei Strukturen gibt es nicht?!

Ich dächte ich hätte letztens sowas in einem Linux-Kernel irgendwo gesehen...

Naja egal, dann halt anders...

Header:


#include <stdlib.h>


typedef struct SUser 

{

	char name [40]; //* Datenteil

	SUser *prev;

	SUser *next;

} Nutzer;


SUser* createNewUser(const char *name)

{

	SUser* ret = (SUser*) malloc(sizeof(SUser));

	strcpy(ret -> name, name);

	ret -> prev = NULL;

	ret -> next = NULL;

	return ret;

}


SUser* getTail(SUser *list)

{	

	SUser *tail = list;

	while (tail -> next != NULL)

		tail = tail -> next;

	return tail;

}


SUser* getHead(SUser *list)

{	

	SUser *head = list;

	while (head -> prev != NULL)

		head = head -> prev;

	return head;

}


void deleteList(SUser *list)

{

	SUser *buffer = getHead(list);

	while (buffer != NULL)

	{

		buffer = buffer -> next;

		if (buffer == NULL) return;

		free(buffer -> prev);

		buffer -> prev = NULL;

	}

}


void addUserAtEnd(SUser *list, SUser *item)

{

	SUser *tail = getTail(list);


	tail -> next = item;

	item -> prev = tail;

}

Main:

int main(int argc, char* argv[])

{

	Nutzer *user1 = createNewUser("Benutzer1");

	Nutzer *user2 = createNewUser("Benutzer2");

	Nutzer *user3 = createNewUser("Benutzer3");

	addUserAtEnd(user1, user2);

	addUserAtEnd(user1, user3);


	Nutzer *buffer = user1;


	for (int i = 1; buffer != NULL; i++)

	{

		printf("%d:\t%s\n", i, buffer->name);

		buffer = buffer -> next;

	}

	deleteList(user1);

	getchar();

	return 0;

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

hmm, ok bei nur einem Element in der Liste gabs einen Fehler...


void deleteList(SUser *list)

{

	SUser *head = getHead(list);

	SUser *buffer = head;

	while (buffer != NULL)

	{

		buffer = buffer -> next;

		if (buffer == NULL) break;

		free(buffer -> prev);

		buffer -> prev = NULL;

	}

	free(head);

	head = NULL;

	list = NULL;

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Nämlich welchen?

Dass bei einem Element, das Element nicht be-free-t wird. Wurde jetzt aber nochmal geändert, da es jetzt mit dem C-Compiler klappt.

Bist Du schon mal im Debugmodus jede Zeile durchgegangen?

Nein, da das ja nur eine Hilfestellung für den Threaderöffner sein soll, werde ich da nicht jede Kleinigkeit ausbessern/anschauen.

Nein, wie Klotzkopp gesagt hat werden .c Datein als C übersetzt und .cpp als C++

Wieder was gelernt - als c übersetzt, geht:

Header


#include <stdlib.h>


typedef struct SUser 

{

	char name [40]; //* Datenteil

	void *prev;

	void *next;

} SUser, *PUser;


PUser createNewUser(const char *name)

{

	PUser ret = malloc(sizeof(SUser));

	strcpy(ret -> name, name);

	ret -> prev = NULL;

	ret -> next = NULL;

	return ret;

}


PUser getTail(PUser list)

{	

	PUser tail = list;

	while (tail -> next != NULL)

		tail = tail -> next;

	return tail;

}


PUser getHead(PUser list)

{	

	PUser head = list;

	while (head -> prev != NULL)

		head = head -> prev;

	return head;

}


void deleteList(PUser list)

{

	PUser head = getHead(list);

	PUser buffer = head;

	int checkOnly = (buffer->next == NULL);

	while (buffer != NULL)

	{

		buffer = buffer -> next;

		if (buffer == NULL) break;

		free(buffer -> prev);

		buffer -> prev = NULL;

	}

	if (checkOnly) free(head);

	head = NULL;

	list = NULL;

}


void addUserAtEnd(PUser list, PUser item)

{

	PUser tail = getTail(list);


	tail -> next = item;

	item -> prev = tail;

}

Main (diesmal .c)

int main(int argc, char* argv[])

{

	PUser user1 = createNewUser("Benutzer1");

	PUser user2 = createNewUser("Benutzer2");

	PUser user3 = createNewUser("Benutzer3");

	PUser buffer = user1;

	int i = 1; 


	addUserAtEnd(user1, user2);

	addUserAtEnd(user1, user3);


	while (buffer != NULL)

	{

		printf("%d:\t%s\n", i, buffer->name);

		buffer = buffer -> next;

		i++;

	}

	deleteList(user1);

	getchar();

	return 0;

}

Jetzt weiß ich wieder, warum ich C nicht mag, da muss man alle Variablen in einer Funktion als erstes deklarieren...

Link zu diesem Kommentar
Auf anderen Seiten teilen

ich danke schon mal im voraus den leuten die mir bis jetzt geholfen haben, hab nicht so viel ahnung von c ... grade von listen ... also sagt mir mal welches effektiver ist und was ich noch bearbeiten muss.. vielen lieben dank:uli

das war meine letzte antwort gestern .. seitdem hab ich nichts mehr geschrieben ... ich versteh das problem jetzt nicht ... ich will doch einfach nur wissen was ich besser machen kann

Link zu diesem Kommentar
Auf anderen Seiten teilen

ich will doch einfach nur wissen was ich besser machen kann

Naja, Du schreibst hier lediglich "geht nicht", "macht nichts" etc. Tut mir leid, aber irgendwie vermisse ich da ein wenig Eigeninitiative.

Zuerst einmal solltest Du Dir die Aufgabenstellung noch einmal genau ansehen und dann überlegen, was überhaupt gefordert ist. Kleiner Tipp: es ist nicht gefordert, zig Logins von der Konsole zu lesen und diese in eine Liste zu schreiben. Manchmal schadet es z.B. nicht, seine Gedanken - bzw. den theoretischen Lösungsweg - erst einmal auf dem Papier zu skizzieren.

Link zu diesem Kommentar
Auf anderen Seiten teilen

das war meine letzte antwort gestern .. seitdem hab ich nichts mehr geschrieben ...
Tut mir leid, das hab ich verwechselt, die schlechte Fehlerbeschreibung kam nicht von dir, und robotto7831as Frage war auch nicht an dich gerichtet.

ich will doch einfach nur wissen was ich besser machen kann

Dein Programm macht etwas anderes, als in der Aufgabenstellung verlangt ist, das haben dir nun schon mehrere gesagt. Es ist nicht so, dass das mit ein paar kleinen Änderungen läuft.

Dir fehlt da ein paar Grundlagen, mit deinem erkennbaren Wissen kannst du diese Aufgabe nicht lösen. Versuch, den versäumten Stoff nachzuarbeiten. Das Forum kann und soll keinen Unterricht ersetzen. Wir können hier konkrete Detailfragen lösen, aber bei solchen Lücken bringt das nicht viel. Schau dir den Thread an, wir sind schon auf Seite 4 und kaum weitergekommen.

Es bringt nichts, wenn du von irgendwoher Code zusammenkopierst und versuchst, das ans Laufen zu bringen. Du musst verstehen, wie das funktioniert, sonst stehst du bei der nächsten Aufgabe vor demselben Problem.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

ich kann mir nicht vorstellen, daß jemand, der aus der Schule raus ist, keine Ahnung von Listen hat.

Im Klassenbuch stehen die Schüler mit ihren Daten drin, das ist eine "Namens"-LISTE. Die heißt auch noch so. Daneben trifft jeder im Leben Unmengen geschriebener Listen, wie beim Pizza-Bäcker, im Restaurant usw.

Also das Argument nehme ich niemandem ab.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...