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 sein

    Edit2: 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.asp

    Aber 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 abgabe 😞

    ELEMENT *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;
    }
    

Anmelden zum Antworten