ADT Listen Problem ? Hilfe

SuumDaHead

Mitglied
Hallo miteinander...
ich bin ganz neu hier und lerne derzeit für meine C-Prüfung:

Hier hab ich von einer ehemaligen Probeklausur folgende Aufgabe: (Dachte ich hängs an, bevor ich jetzt alles abtippe!(ist eine PDF Datei)

und jetzt hab ich dafür mal versucht ne lösung zu erstellen aber ich hab wirklich überhaupt keine Ahnung ob da was stimmt! Wär echt sehr nett wenn ihr mir mal sagen könntet ob daran was passt oder wo ich nen Fehler hab.... !

Code:
void aufteilen(t_Listenkopf* origL, t_Listenkopf* schlechtL, 
				t_Listenkopf* mittelL, t_Listekopf* gutL)
	{
		t_element *p = origL-> erstesElement;

		initListe(schlechtL);
		initListe(mittelL);
		initListe(gutL);

		while(p != NULL){
			if((p->daten->anzEink)>MINEINK && (p->daten->betrag_EUR)>MINBETRAG
				{	
					pushback(gutL,p->daten);
					p=p->next;
				}
			else if(((p->daten->anzEink)>MINEINK && (p->daten->betrag_EUR)<=MINBETRAG) ||
						((p->daten>anzEink)=MINEINK && (p->daten->betrag_EUR)>MINBETRAG))
					{
						pushback(mittelL,p->daten);
						p=p->next;
					}
				
			pushback(schlechtL,p->daten);

		}
}

danke schonmal für eure Hilfe :)

greetz DaHead
 

Anhänge

  • Aufgabe ADT.pdf
    19,1 KB · Aufrufe: 16
Zuletzt bearbeitet:
Hallo SuumDaHead

Ein paar Dinge:
C++:
((p->daten>anzEink)=MINEINK

da fehlt vor dem = noch ein > oder ein < oder ein = (also >=, <= oder ==). Solche Fehler merkst du wenn du etwas weniger Klammern verwendest und vor allem sauberes Spaceing:
C++:
function(a, b, c, d); // oder wenn du es noch klarer willst: function( a, b, c, d )
und nicht function(a,b,c,d)

if(a <= b) oder if( a <= b ) und nicht if(a<=b)

p = p->next; statt p=p->next

Schlussendlich ist es subjektiv, aber erfahrungsgemäss machst du so weniger Fehler. Das Auge mag Whitespaces zur Gliederung und Trennung.

Nächster Punkt:
C++:
if((p->daten->anzEink)>MINEINK && (p->daten->betrag_EUR)>MINBETRAG

Dieses if ist nicht geschlossen, der Code compiliert also gar nicht.

So viel mal zu dem was ich auf den ersten Blick syntaktisch sehe.

Vom semantischen her hast du folgendes Problem:
Nachdem ein Element in die gute oder mittlere Liste eingefügt wurde (also eine der if-Abfragen getriggert wurde) bewegst du das Element auf das nächste (p = p->next;). Aber anschliessend fügst du es unweigerlich in die schlechte Liste ein da du vergessen hast in den if-Abfragen am Ende ein continue einzufügen damit er zum nächsten Schleifendurchgang geht.

Wenn nun ein Element in der Liste vorhanden ist, welches von vorne weg in die schlechte Liste kommt hast du eine Endlosschleife. Beide ifs werden ignoriert, es wird über pushback in die schlechte Liste eingefügt und kommt dann wieder zu while(p != NULL) ohne dabei p zu ändern. Nach dem Einfügen in die schlechte Liste musst du auch den Iterator weiterbewegen wie du es in den if-Abfragen tust mit p = p->next;

Grüsse
Cromon
 
also erstmal vielen dank Cromon :)

ich habe jetzt mal die genannten Fehler von dir versucht zu verbessern...
jetzt sieht mein Code durch die Whitespace Formatierung wirklich besser aus :), werd ich mir wirklich ans Herz legen! allerdings wie ich weniger Klammern verwenden soll weiß ich noch nicht ganz wie ich das anwenden soll?

Code:
void aufteilen(t_Listenkopf* origL, t_Listenkopf* schlechtL, 
				t_Listenkopf* mittelL, t_Listekopf* gutL)
	{
		t_element *p = origL -> erstesElement;

		initListe( schlechtL );
		initListe( mittelL );
		initListe( gutL );

		while(p != NULL){
			if((p -> daten -> anzEink) > MINEINK && (p-> daten-> betrag_EUR) > MINBETRAG)
				{	
					pushback( gutL, p-> daten);
					p = p->next;
					continue;
				}
		else if(((p-> daten-> anzEink) > MINEINK && ( p-> daten-> betrag_EUR) <= MINBETRAG) ||
						((p-> daten-> anzEink) == MINEINK && ( p-> daten-> betrag_EUR) > MINBETRAG))
				{
					pushback( mittelL, p-> daten);
					p = p-> next;
					continue;
				}

					pushback( schlechtL, p-> daten);
					p = p-> next;

		}
}

ein Problem kommt jetzt auf wenn ich beim letzten, dieses
Code:
p = p-> next;
hinzufüge, zeigt mir VS einen Fehler nämlich:
"Diese Deklaration hat keine Speicherklasse oder keinen Typspezifizierer"

Was bedeutet dass denn jetzt ? das ist doch immernoch "p" welchen ich bei den obigen zwei If-Bedinungsabfragen auch nehme ?

Vielen dank nochmal für deine Hilfe!
Summi

Bitte nicht pushen, vor allem, da direkt über deinem Beitrag was steht

@sheel: sry war ein versehen! :rolleyes:
 
Hallo

Nachdem ich die Aufgabenstellung angesehen habe ist mir aufgefallen, dass es da noch weitere Probleme gibt.

Einserseits ein Fehler bei einem Parameter (sehen solltest du den direkt):
t_Listekopf* gutL

Andererseits verwendest du p->daten immer als Zeiger (p->daten->betrag_EUR zum Beispiel), jedoch ist
C++:
typedef struct s_element 
{  
	t_daten daten;
	struct s_element* next;
} t_element;

kein Zeiger! Du musst also mit p->daten.betarg_EUR arbeiten und entsprechend pushBack( schlechtL, &p->daten);

Grüsse
Cromon
 
Hallo :)

ok, also ersetze ich alle von mir in klammern geschriebenen (p->daten->....) mit (p->daten.betrag_EUR)? und dann die pushback(....) wie von dir geschrieben!

leider kommt aber immer noch die von mir erwähnte Fehlermeldung ? und bringe diese auch nicht weg..

und noch ne Frage... ich bin mir nicht sicher aber in der Aufgabenstellung heißt es doch, dass die original Liste am Ende leer sein soll? ist das dann so wie ich das mache auch der Fall?

Grüsse
SuumDaHead
 
Der Thread ist zwar schon ein paar Tage alt, aber vielleicht hilft's ja noch :)

Deine Bedenken aus Deinem letzt Post waren schon richtig, die Originalliste wird nicht geleert. Statt der Zuweisung
Code:
t_element *p = origL-> erstesElement;
Solltest Du die Funktion
Code:
void popFront(t_Listenkopf* listenkopf, t_daten* daten);
verwenden. Damit bekommst Du immer das vorderste Element und gleichzeitig wird es aus der Originalliste entfernt. Die Zeile
Code:
p = p->next;
kannst Du aus dann aus den einzelenen if's rausnehmen, da der Zeiger auf den Listenkopf schon durch popFront verschoben wird.


Natürlich kannst Du 'continue' verwenden, m. E. wäre es aber sauberer, wenn Du sie weglässt und die Zeile
Code:
pushback( schlechtL, p-> daten);
in einen 'else'-Block packst. So, wie Du es in Deinem letzten Beispiel geschrieben hast, geht es gar nicht, da alles immer auch in die 'schlecht'-Liste gepackt wird.

Am Ende der While-Schleife (darin, nicht danach) musst Du natürlich nochmal den Aufruf von popFront einbauen.

Ich hoffe, das hilft Dir etwas weiter.
 
hey klar hilft mir das noch weiter :)...

hoffe ich hab das jetzt deinen Vorgaben richtig umgesetzt ?

Code:
void aufteilen(t_Listenkopf* origL, t_Listenkopf* schlechtL, t_Listenkopf* mittelL, t_Listekopf* gutL)
    {
 
        initListe( schlechtL );
        initListe( mittelL );
        initListe( gutL );
 
        while(p != NULL){
            if((p -> daten.anzEink) > MINEINK && (p-> daten.betrag_EUR) > MINBETRAG)
                {   
                    popFront( gutL, p-> daten);
                }
        else if(((p-> daten.anzEink) > MINEINK && ( p-> daten.betrag_EUR) <= MINBETRAG) ||
                        ((p-> daten.anzEink) == MINEINK && ( p-> daten.betrag_EUR) > MINBETRAG))
                {
                    popFront( mittelL, p-> daten);
                    
                }
 
	else
		{
		   popFront( schlechtL, p-> daten);
		}
 
        }
}

mfg summi
 

Neue Beiträge

Zurück