einfach verkette liste
-
hi leute,
ich hab ein problem
Das Programm soll von der Standardeingabe Fächer mit Beurteilungen einlesen und speichert sie in eine einfach verkettete Liste.
Sie dürfen davon ausgehen, dass Fachnamen aus maximal 20 Zeichen bestehen.
Beurteilungen sind bei benoteten Fächern ganze Zahlen, bei unbenoteten Fächern je ein Einzelzeichen.•Definieren Sie die maximale Länge des Fachnamens als symbolische Konstante.
•Realisieren Sie die Listenelemente als struct mit eingebetteter union und zugeordneter enum (siehe Vorlesungsunterlagen).*
•Beim Einlesen können Sie zwischen benoteten und unbenoteten Fächern unterscheiden, indem Sie erst mit %d eine ganze Zahl zu lesen versuchen, und wenn dies nicht gelingt, mit %c ein Einzelzeichen lesen.
scanf liefert als Rückgabewert, wie viele Werte erfolgreich gelesen werden konnten (siehe auch man -s 3 scanf).enum int_or_string {type_int, type_string}; struct struct_with_union { enum int_or_string u_type; union { int i; char ∗s; } u; };
ich komm damit nicht klar ich weiß nicht wie ich das realisieren soll
kann mir jemand einen tipp geben?
-
Gegenfrage: Wie weit bist du schon gekommen?
symbolische Konstante: sollte einfach mit einem
#define
angelegt sein
Listenelement: Du brauchst in dem Element den Fachnamen (char[NAMELEN]), die Note/Beurteilung (deine union-Konstruktion) und einen Zeiger auf den Nachfolger (für die verkettete Liste).
Einlesen: Wenn scanf() die Eingabe nicht interpretieren konnte, bleibt das letzte eingegebene Zeichen im Puffer und du kannst es mit einem anderen Formatstring nochmal versuchen.Verwalten der Liste: Du brauchst einen Zeiger auf das erste Element. Dann holst du dir mit malloc() genug Speicher, füllst ihn mit den Nutzer-Eingaben und hängst ihn in die Liste ein mit
x->nf=begin;begin=x;
-
enum int_or_string {type_int, type_string}; struct struct_with_union { enum int_or_string u_type; union { int i; char ∗s; } u; };
das check ich nicht
komtm in den union bereich nur das für die benotung oder?
und was mach ich mit dem enum?
-
hans-sonny schrieb:
komtm in den union bereich nur das für die benotung oder?
Ich denke schon - schließlich kann von einem
enumunion nur eins der Elemente genutzt werden.und was mach ich mit dem enum?
dir notieren, ob jetzt der int-Wert gültig ist oder der char-Wert.
-
also wäre das so oder wie:
int main() { enum int_or_string {type_int, type_string}; struct faecher { char* fach; enum int_or_string u_type; union { int note; char* resultat; } u; };
komtm das in den main bereich oder davor?
-
Die struct-Definition solltest du schon global definieren, damit du sie auch sinnvoll zwischen einzelnen Funktionen austauschen kannst.
Ansonsten hätte ich den Namen lieber als char-Array statt als char-Zeiger definiert und das Resultat ist nach deiner Aufgabenbeschreibung auch kein String, sondern ein Einzelzeichen.
-
also ein feld mit malloc anlegen? für fach?
ja für resultat ists egal ist entweder be oder was anderes zwei stelliges^^
also nur das struct global und das enum? ...
und wie leg ich dann die verkettete liste an?
-
Die Typdefinitionen kannst du global ablegen, schließlich könnte es sein, daß du sie an anderer Stelle nochmal benötigst. Variablen von diesen Typen legst du dort an, wo du sie benötigst.
Um dir eine Liste aufzubauen, benötigst du noch ein Feld
struct faecher* next;
, das auf den Nachfolger in der Liste verweist. Ich hab' hier zwar schon Leute gesehen, die dafür Variablen genommen haben, aber üblich ist es, sich den Speicher für die einzelnen Listen-Elemente vom Heap zu holen. Das könnte dann etwa so aussehen:struct faecher * begin = NULL; //Zeiger auf das erste Listenelement //neues Element anlegen und in die Liste einhängen struct faecher * neu = malloc(sizeof(struct faecher)); input(neu);//einlesen der Daten neu->next = begin; begin = neu; //alle Listenelemente ausgeben for( struct faecher* pos=begin; pos!=NULL; pos=pos->next) print(*pos);//Ausgeben der Daten //und zum Programm-Abschluß: Die Liste komplett wieder freigeben while(begin!=NULL) { struct faecher* pos=begin; begin=begin->next; free(pos); }
-
danke für deine hilfe aber es ist mir noch nicht ganz klar
#include <stdio.h> #include <stdlib.h> #include <stddef.h> enum int_or_string {type_int, type_string}; struct faecher { char* fach; enum int_or_string u_type; union { int note; char* resultat; } u; }; int main() {
so hab ich es bis jetzt ist das so okay?
-
Ich fürchte, bevor du diese Aufgabe bewältigen kannst, mußt du nochmal zurückkehren zu den Grundlagen. Ich habe nämlich keine Lust, dir dein Programm zu schreiben.
Ich habe dir dort oben Lösungsansätze gezeigt, mit denen du anfangen kannst. Da solltest du eigentlich drauf aufbauen können.