You are not logged in.

  • Login

Laghorn

Unregistered

1

Friday, September 9th 2011, 3:46pm

C - verkettete Liste - diverse Fragen

Hallo Zusammen,

habe schon viele Threads zu dem Thema durchforstet, aber keiner beantwortet mir meine realtiv grundlegenden Fragen.

ich schreibe zur Zeit ein Programm, in dem ich meine Ausgaben für Benzin archivieren möchte. Dazu nehme ich eine einfach verkettete Liste. Eine Struktur liefert die benötigten Variablen wie z.b. eine fortlaufende ID für jede Tankfüllung, den Namen der Tankstelle usw.

Ich erstelle noch eine 2. Struktur, von der ich aber nur ein Objekt ableiten muss, da diese nur 3 Zeiger enthält. Einer zeigt auf das erste Element der Liste, einer dient als "cursor", einer zeigt auf das letzte Element der Liste.

Ich habe bisher kein Problem mit der Definition der Strukturen.

Jetz soll das Programm natürlich eine Funktion bieten, die einen neuen Datensatz mit den Benutzer eingaben erstellt.

Frage1: Welchen Datentyp muss diese Funktion zurückliefern? Wie sieht die allgemeine Funktionsdefinition aus, wenn diese mit Strings und Strukturen umgehen soll.

Frage2: Ich habe in vielen Programmen gesehen dass eine neu deklarierte Variable einer struktur (also ein neues Element in diesem Fall) = malloc(sizeof(name der struktur) gesetzt wird. Angeblich zur dynamischen Speicherallokation. Ich habe doch aber schon in der Struktur festgelegt, wie groß der Platz für die einzelnen Datenfelder eines Elements sein soll. Warum braucht man malloc, wenn zu dem Zeitpunkt, wo malloc benutzt wird, keine anderen Informationen über den Speicherbedarf vorliegen, als die, die in der Struktur hinterlegt sind? (Also keine Benutzereingaben vorhanden)

Frage 3: Ich habe in vielen Programmen gesehen,dass neue Objekte einer Struktur als Zeiger, und nicht als einfache Variable des Strukurtyps deklariert werden. Warum?



Zur Sicherheit anbei nochmal meine Strukturen:

Source code

1
2
3
4
5
6
7
8
9
10
11
12
struct Auftanken {
               int nr;                     //Platz für die ID
               char Tankst[30];
               char Datum[8];
               double Preis;
               struct Auftanken *next;
}
 
struct Liste {
struct Auftanken *cursor;
struct Liste *first,*last;                  //von welchem Typ müssen die Zeiger sein? alle sollen ja irgendwo auf ein "Auftanken" Element zeigen
}


vielenvielenDank im vorraus und schöne Grüße

2

Saturday, September 10th 2011, 1:25am

Frage 3:
Ganz einfach, weil nur zur Laufzeit festegesteltl werden kann wieviel Elemente der Struktur benötigt werden.
Wenn du es als ienfache Variable machst dann hast du die Struktur genau einmal im Speicher.

Frage 2:
Dies wird genau aus dem obigen Grund verwendet. Um zur Laufzeit eine unterschiedliche Anzahl an der benötgit Strukturen, ich nenns mal Variablen, zu erhalten die durch den Benutzer bestimmt werden.

Frage 1:
Die Funktion muss dynamisch Speicher für die neue Variable vom Betriebsystem anforden (malloc), diese mit den Benutzerwerten füllen und schliesslich an die Liste anfügen.

Wie du Liste gestalltest ist dir überlassen, normalerwesse wird in jedem Eintrag der vorherige Eintrag ung Nachfolgende Eintrag gespeichert.
->

C/C++ Quellcode

1
2
3
4
struct Liste {
struct Auftanken *cursor;
struct Liste *prev,*next;             
}


Wenn du die möglichkeit hast C++ zu benutzen, würd ich dir das vector template empfehlen.

Mfg Rushh0ur

3

Saturday, September 10th 2011, 5:24pm

Vector Template?
IrgendeinVektorKonstruktor(T X, T Y, T Z)?

MfG
Check

4

Sunday, September 11th 2011, 1:47pm

Ein Vektor muss nicht unbedingt 3D oder 2D sein.
Er kann beliebig viele Elemente beinhalten (meistens des selben Types).

-> C++ : Reference : STL Containers : vector

Syntax:
vector<Typ> Variablenname;

Beispiel:

C/C++ Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
std::vector<int> IntegerList;
 
//Element hinzufügen
IntegerList.push_back(5); 
IntegerList.push_back(7);
 
// Anzahl der Elemente
int Anzahl = IntegerList.size(); // -> 2
 
// Element zugriff
int Wert = IntegerList.at(0); // -> 5
	Wert = IntegerList.at(1); // -> 7
 
// Pointer des ersten Elementes (0)
std::vector<int>::iterator it = IntegerList.begin(); 
	Wert = *it; // -> 5
 
// Element löschen
IntegerList.erase(it+1); // 7 wird entfernt (Element 1)


Mfg Rushh0ur

Laghorn

Unregistered

5

Monday, September 12th 2011, 8:56am

Ok vielen Dank, ich werde weiter machen und mal nen Update geben!

Similar threads

Social bookmarks