Listen Hilfe



  • @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;
    }
    


  • ELEMENT *punkt_anfuegen(ELEMENT *liste){
    	ELEMENT *hz=liste; // initialisierung ist unfug
    	hz=malloc(sizeof(ELEMENT));
    	Punkt *punkt=malloc(sizeof(ELEMENT)); // falsch
    	printf("x-wert:");
    	scanf("%d",&(punkt->x));
    	printf("y-wert:");
    	scanf("%d",&(punkt->y));
    	if(punkt_ok(*punkt)==true) // ==true ist ueberfluessig
    	{
    		if(liste==NULL)erzeugen(*punkt); // warum? hast doch schin ein neues ELEMENT *hz und einen neuen Punkt *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;
    }
    

    weisst du was du machst? wo kommt der code her, mit dem du arbeitest?



  • Ich dachte jedenfalls das ich das weiß 😕
    Punkt_ok ist eine bool funktion die vorgegeben war also stimmt das true..

    Der Code ist hier zu finden
    http://www.blizzarac.de/aufgabe36fragment.c

    Ich muss schon zugeben das ich mit der Aufgabe etwas überfordert bin
    habe aber keine wahl ⚠



  • ELEMENT *hz=liste;
    

    vorgegeben

    Punkt *punkt=malloc(sizeof(ELEMENT));
    

    Wieso ist das Falsch? ohne stürzt das programm ab..

    if(punkt_ok(*punkt)==true)
    

    punkt_ok ist eine bool funktion also stimmts so

    if(liste==NULL)erzeugen(*punkt);
    

    hier wird eine neue liste mit dem eingegebenen punkt erzeugt hz hat ja keinen inhalt und wir sollen die erzeugen funktion nutzen (vorgegeben)

    Was genau ist mein Fehler?



  • ELEMENT *hz=liste;
    

    vorgegeben, wird aber in der naechsten zeile gleich anders belegt

    Punkt *punkt=malloc(sizeof(ELEMENT));
    

    falsch weil ELEMENT != Punkt

    if(punkt_ok(*punkt)==true)
    

    aber das ==true kannst du weglassen und das machst du bitte auch.

    if(liste==NULL)erzeugen(*punkt);
    

    das ergebnis von erzeugen() wird nicht mal benutzt...

    dein fehler: du scheinst pointer, dynamischen speicher und verkettete listen noch nicht zu begreifen.
    sprich deinen lehrer mal an. der kann dir das beibringen, weil er auf dich besser eingehen kann als ich z.b. hier im forum.



  • Naja da scheinst du wohl recht zu haben, werde mich drum kümmern müssen.
    Ich muss das Programm jedoch bis Montag fertig schreiben es mach einen drittel der Fachnote aus also muss ichs irgentwie so hinbekommen.

    Ok die umbelegung von hz ist weg.

    Punkt *punkt=malloc(sizeof(Punkt));
    

    das hab ich geändert

    ==true weggelassen.

    if(liste==NULL)hz=erzeugen(*punkt); und das so geändert das hz jetzt mit dem erzeugten Punkt anfängt.

    ELEMENT *punkt_anfuegen(ELEMENT *liste){
    	ELEMENT *hz=liste;
    	Punkt *punkt=malloc(sizeof(Punkt));
    	printf("x-wert:");
    	scanf("%d",&(punkt->x));
    
    	printf("y-wert:");
    	scanf("%d",&(punkt->y));
    	if(punkt_ok(*punkt))
    	{
    		if(liste==NULL)hz=erzeugen(*punkt);
    		else
    		{
    		hinten_dran(hz,*punkt);
    		printf("%d",hz->inhalt.x);
    		printf("%d\n",hz->inhalt.y);
    		}
    	}
    	else 
    	{
    		printf("Die Koordinaten liegen nicht im Definitionsbereich\n");
    		return hz;
    	}
    	return hz;
    }
    

    Funktioniert trotzdem nicht



  • der aufruf von hinten_dran() muss anders aussehen.



  • Habs jetzt hinbekommen, hab die funktion vereinfacht:

    ELEMENT *punkt_anfuegen(ELEMENT *liste){
    	ELEMENT *hz=liste;
    
    	Punkt punkt=eingabe();
    	if(punkt_ok(punkt))
    	{
    		hz=hinten_dran(hz,punkt);
    		printf("%d",hz->inhalt.x);
    		printf("%d",hz->inhalt.y);
    	}
    	else 
    	{
    		printf("Die Koordinaten liegen nicht im Definitionsbereich\n");
    
    	}
    	return hz;
    

    danke für die hilfe


Anmelden zum Antworten