Listen Hilfe
-
Hi,
ich hätte bräuchte Hilfe mit meinem Programm ich versuche gerade zu vestehen wie Listen funktionieren und eigentlich klappts auch aber das Programm tut nicht das was es sollte:
Die Liste sollte eigentlich von 1 bis 10 gehen, ausgegeben wird allerdings:
1 2 3 4 10#include<stdio.h> #include<stdbool.h> #include<stdlib.h> struct element{ int inhalt; struct element *next; }; typedef struct element ELEMENT; ELEMENT *erzeugen(int i){ ELEMENT *ergebnis=malloc(sizeof(ELEMENT)); ergebnis->inhalt=i; ergebnis->next=NULL; return ergebnis; } ELEMENT *vorne_dran(ELEMENT *liste, int wert){ ELEMENT *ergebnis=erzeugen(wert); ergebnis->next=liste; return ergebnis; } void ausgeben(ELEMENT *liste){ ELEMENT *hilfszeiger=liste; while(hilfszeiger!=NULL){ printf("%d ",hilfszeiger->inhalt); hilfszeiger=hilfszeiger->next; } printf("\n"); } int main(){ ELEMENT *li; li=erzeugen(5); li=erzeugen(6); li=erzeugen(7); li=erzeugen(8); li=erzeugen(10); li=vorne_dran(li,4); li=vorne_dran(li,2); li=vorne_dran(li,1); li=vorne_dran(li,0); ausgeben(li); int e; scanf("%d",&e); return 0; }
-
bei deiner reihe von "erzeugen()" ueberschreibst du jedes mal li
gibst du die elemente auch irgendwann wieder frei?
-
Ok so weit hab ichs verstanden, jetzt will ich koordinaten punkte in einer Datei speichern dazu folgende Funktionen
#define DATEI "punkte.dat"
typedef struct{ int x; int y; }Punkt;
typedef struct element{ Punkt inhalt; struct element *next; }ELEMENT;
void speichern(ELEMENT *liste){ FILE *fp; ELEMENT *hz=liste; fp=fopen(DATEI,"w"); while(hz!=NULL){ fprintf(fp,"%d",hz->inhalt->x);//<-falsches Typ-Argument von >>-><< fprintf(fp,"%d",hz->inhalt->y);//<-falsches Typ-Argument von >>-><< hz=hz->next; } fclose(fp); }
Was mache ich falsch?
-
inhalt ist ja kein Zeiger, also:
fprintf(fp,"%d",hz->inhalt.x);
-
Ja stimmt danke.
Habe jetzt ein weiteres Problem ich möchte die gespeicherten Punkte jetzt wieder in die Liste laden wie mache ich das?
-
Mit malloc neue Elemente erstellen, die Werte mit fscanf aus der Datei holen, das Element füllen und Listenzeiger umhängen.
-
#define DATEI "punkte.dat"
typedef struct{ int x; int y; }Punkt;
typedef struct element{ Punkt inhalt; struct element *next; }ELEMENT;
ELEMENT *laden(){ ELEMENT *ergebnis=NULL; FILE *fp=fopen(DATEI,"r"); fscanf("%d",ergebnis->inhalt.x); fscanf("%d",ergebnis->inhalt.y); ergebnis=ergebnis->next; fclose(fp); return ergebnis; }
int main(ELEMENT *liste) { ELEMENT *liste; liste=laden(); return 0; }
Ich denke mir das in etwa so.
Stimmt es? Da fehlt noch eine Schleife in der ich überprüfen muss ob die Datei zu ende ist wie mache ich das?
-
So wird das nicht gehen, da fehlt noch einiges!
Du reservierst keinen Speicher für deine Listenelemente und fscanf funktioniert auch etwas anders.
Das Dateiende wird durch das Zeichen 'EOF' gekennzeichnet.
-
Und wie genau funktioniert fscanf kannst du mir ein Beispiel geben?
Edit: Das struct ELEMENT ist wo anders schon allociert die Speicherzuweisung sollte
hier eigentlich nicht das Problem seinEdit2: Und wie macht ich das genau mit dem EOF?
while(fp!=EOF){}
Geht nicht, was mache ich falsch
-
blizzarac schrieb:
Und wie genau funktioniert fscanf kannst du mir ein Beispiel geben?
fscanf erwartet Pointer auf die übergebenen Variablen nicht deren Werte.
fscanf("%d",&ergebnis->inhalt.x);
-
Beispiel hier:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_crt_fscanf.2c_.fwscanf.aspAber vor allem über die dynamische Speicherverwaltung solltest du nochmal nachdenken!
Bsp für verkettete Liste z.B. hier:
http://www.physik.uni-regensburg.de/studium/edverg/ckurs/script/script.html
-
Wie machen ich das mit der EOF Prüfung?
-
Wer lesen kann (und will) ist klar im Vorteil:
http://www.physik.uni-regensburg.de/studium/edverg/ckurs/script/script.html
Abschnitt "File I/O (Auswahl)".
-
GuybrushThreepwood, fuer dich: http://www.dinkumware.com/manuals/reader.aspx?b=c/&h=index.html
blizzarac:
schon beim speichern musst du etwas anders machen:void speichern(ELEMENT *liste) { FILE *fp; ELEMENT *hz = liste; fp = fopen(DATEI, "w"); while(hz != NULL){ fprintf(fp, "%d %d\n", hz->inhalt.x, hz->inhalt.y); hz = hz->next; } fclose(fp); }
und dann beim laden so:
ELEMENT *laden(){ ELEMENT *ergebnis = NULL, *hier = NULL; FILE *fp = fopen(DATEI, "r"); while (!feof(fp) && !error(fp)) { hier = malloc(sizeof(ELEMENT)); // neues element erzeugen hier->next = ergebnis; // neues element an den anfang der liste stellen fscanf("%d %d\n", &hier->inhalt.x, &hier->inhalt.y); // neues element mit daten fuellen ergebnis = hier; // ergebnis anpassen } fclose(fp); return ergebnis; }
-
@c.rackwitz: thx, schöne Übersicht. Aber ich hab mich schon so an die lokal installierte MSDN gewöhnt...
-
Danke für die Antworten bin ein ganzes Stück weitergekommen
Habe jetzt allerdings ein weiters Problem,es sieht wie folgt aus.typedef struct{ int x; int y; }Punkt;
typedef struct element{ Punkt inhalt; struct element *next; }ELEMENT;
ELEMENT *punkt_entfernen(ELEMENT *liste){ ELEMENT *hz=liste; ELEMENT *hz2; Punkt *punkt; printf("Welchen Punkt wollen Sie Löschen\n"); printf("x-wert:"); scanf("%d",&(punkt->x)); printf("y-wert:"); scanf("%d",&(punkt->y)); if(liste==NULL)return hz; else{ if(hz->inhalt==punkt){//<----Fehler Ungültiger Operanden hz2=liste->next; return hz2;} else{ hz2=liste->next; while(hz2!=NULL && hz2!=punkt){//<--Fehler Es fehlt eine //Typkonvertierung hz2=hz2->next; hz=hz->next;} } } if(hz2==NULL){ printf("Punkt nicht vorhanden\n"); return liste;} else{ hz->next=hz2->next; free(hz2); } return hz; }
-
punkt ist ein Punkt*
hz->inhalt ist ein Punkt
hz2 ist ein ELEMENT*
-
Das heißt man kann diese Typen nicht miteinander Vergleichen!ok
Ich muss diese Vergleiche aber durchführen, kann ich die Typen umwandeln
damit sie kompatibel sind oder gibt es eine andere lösung?
-
if(hz->inhalt == *punkt){// hab ich zum *punkt gemacht, damit ich den inhalt von punkt bekomme while(hz2!=NULL && hz2->inhalt != *punkt){// zugriff auf ->inhalt, wieder *punkt
ausserdem kannst du structs nicht so einfach vergleichen. du brauchst eine vergleichsfunktion (aehnlich wie bei strings, die kann man auch nicht mit einem == vergleichen).
-
punkt_anfügen funktioniert nicht richtig statt den eingegebenen werten werden
Nuller angefügt. Kann mir das nicht erklären und Montag ist abgabeELEMENT *erzeugen(Punkt p){ ELEMENT *ergebnis=(ELEMENT *)malloc(sizeof(ELEMENT)); ergebnis->inhalt=p; ergebnis->next=NULL; return ergebnis; }
ELEMENT *hinten_dran(ELEMENT *liste, Punkt punkt){ ELEMENT *ergebnis=liste; ELEMENT *hilfszeiger=liste; if (liste==NULL) return erzeugen(punkt); else{ while(hilfszeiger->next!=NULL) hilfszeiger=hilfszeiger->next; hilfszeiger->next=erzeugen(punkt); } return ergebnis; }
ELEMENT *punkt_anfuegen(ELEMENT *liste){ ELEMENT *hz=liste; hz=malloc(sizeof(ELEMENT)); Punkt *punkt=malloc(sizeof(ELEMENT)); printf("x-wert:"); scanf("%d",&(punkt->x)); printf("y-wert:"); scanf("%d",&(punkt->y)); if(punkt_ok(*punkt)==true) { if(liste==NULL)erzeugen(*punkt); else { hinten_dran(hz,*punkt); printf("%d",hz->inhalt.x);//<-test=0 printf("%d",hz->inhalt.y);//<-test=0 } } else { printf("Die Koordinaten liegen nicht im Definitionsbereich\n"); return hz; } return hz; }