 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
Verfasst am: 26.01.2008, 14:16 Titel: Callocate und verkettete Liste- Problem |
|
|
Hallo, Forianer,
ich versuche, eine doppelt verkettete Liste zu erstellen. Die ersten drei Knoten (Kopf, Ende und erster Innenknoten) werden auch brav aufgebaut. Dabei gibt es aber das Problem, daß die Adressierungen nicht übereinstimmen. Mein Code sieht so aus: Code: | Type ListEnd As EndNode
Type ListHead As HeadNode
Type ListItem
Value As Integer
ItemOrder As Integer
pPrevItem As ListItem Ptr
pNextItem As ListItem Ptr
pListHead As ListHead Ptr
pListEnd As ListEnd Ptr
Declare Constructor(ByRef pHeadNode As ListHead Ptr, ByRef pEndNode As ListEnd Ptr, ByRef pListItem As ListItem Ptr)
End Type
Dim pListItem As ListItem Ptr
Type EndNode
pListHead As ListHead Ptr
pLastItem As ListItem Ptr
Declare Constructor (ByRef pHeadNode As ListHead Ptr,ByRef pEndNode As EndNode Ptr, ByRef pListItem As ListItem Ptr)
End Type
Dim pEndNode As EndNode Ptr
Type HeadNode
pFirstItem As ListItem Ptr
pListEnd As ListEnd Ptr
Declare Constructor (ByRef pHeadNode As HeadNode Ptr, ByRef pEndNode As EndNode Ptr, ByRef pListItem As ListItem Ptr)
End Type
Dim pHeadNode As HeadNode Ptr 'Listenkopf einrichten
Constructor HeadNode (ByRef pHeadNode As HeadNode Ptr, ByRef pEndNode As EndNode Ptr, ByRef pListItem As ListItem Ptr)
Dim ListEnd As EndNode = EndNode (@this, pEndNode, pListItem) 'Listenende einrichten
pEndNode = Callocate (Len(EndNode))
pEndNode->pListHead = @this
this.pFirstItem = pListItem
'This.pListEnd = pEndNode
this.pFirstItem = pListItem
Print
Print "Begin Constructor HeadNode"
Print "Adresse = "; @this '6618608
Print "pEndNode = ";pEndNode '7800112, stimmt nicht
Print "pListItem = "; this.pFirstItem '7800080- stimmt nicht
Print "End Constructor HeadNode"
Print
sleep
End Constructor
Constructor EndNode (ByRef pListHead As ListHead Ptr, ByRef pEndNode As EndNode Ptr, ByRef pListItem As ListItem Ptr)
pEndNode = @this
Dim Item As ListItem = ListItem(pListHead, @this, pListItem)
pListItem = Callocate(Len(Item)) 'Listenelement anlegen
pListHead->pListEnd = @this
'this.pLastItem = pListItem
Print
Print "Begin Constructor EndNode"
Print "Adresse = "; @this '6618568
Print "pListHead = "; pListHead '6618608 stimmt
Print "pListItem = ";pListItem '7800080 stimmt nicht
Print "End Constructor EndNode"
Print
sleep
End Constructor
Constructor ListItem(ByRef pHeadNode As ListHead Ptr, ByRef pEndNode As EndNode Ptr, ByRef pListItem As ListItem Ptr)
this.value = 6
this.pListHead = pHeadNode
this.pListEnd = pEndNode
pListItem = @this
Print
Print "Begin Constructor ListItem"
Print pHeadNode->pFirstItem = @this
Print "Adresse = "; @this '6618516
Print "Value = "; this.value
Print "this.pListHead = ";this.pListHead '6618608, stimmt
Print "pListHead = "; pHeadNode '6618608, stimmt
Print "this.pListEnd =";this.pListEnd '6618568, stimmt
Print "End Constructor ListItem"
Print
sleep
End Constructor
Dim ListHead As HeadNode = HeadNode (pHeadNode, pEndNode, pListItem)
|
Die Adressen der jeweiligen Knoten und der zugehörigen Zeiger habe ich dahinter kommentiert. Wie man sieht, stimmen die Zeigerinhalte teilweise nicht mit den tatsächlichen Adressen überein. Dementsprechend kann ich nicht auf den Wert (Value) des Innenknotens zugreifen.
Ein Porblem scheint zu sein, daß ich nicht verstanden habe, in welcher Reihenfolge die Knoten erstellt werden, bzw. in welcher Reihenfolge die Adressen den Zeigern zugewiesen werden.
Was mache ich da falsch?
Danke für die Hilfe  _________________ Und die Grundgebihr is aa scho drin- DOS is jo nett. |
|
Nach oben |
|
 |
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
Verfasst am: 27.01.2008, 20:42 Titel: |
|
|
Ich glaube, ich habs selbst rausgefunden- trotz Eurer enthusiastischen Anteilnahme...
Und zwar muß man die Speicher für die jeweiligen Knoten in den Knoten-Constuktoren calloziieren, und nicht schon vorher beim DIMmen im vorherigen Knoten. _________________ Und die Grundgebihr is aa scho drin- DOS is jo nett. |
|
Nach oben |
|
 |
ytwinky

Anmeldungsdatum: 28.05.2005 Beiträge: 2624 Wohnort: Machteburch
|
Verfasst am: 27.01.2008, 22:25 Titel: |
|
|
Hi Elektronix,
jaja, so hat alles sein Gutes, mein 'linked-list'-Projekt ist immer noch ohne Konzept auf der Platte und soweit wie du, bin ich schon gar nicht..
So wie es aussieht, hätte dir auch nicht das Tut auf FB-Portal helfen können..
So haben wir aber alle etwas davon, du am allermeisten xD
Gruß
ytwinky _________________
v1ctor hat Folgendes geschrieben: | Yeah, i like INPUT$(n) as much as PRINT USING.. | ..also ungefähr so, wie ich GOTO.. |
|
Nach oben |
|
 |
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
Verfasst am: 31.01.2008, 14:58 Titel: |
|
|
So, habe ein bißchen weiter gefrickelt. Jetzt kam folgende Frage auf:
Ich habe den Head-, End-, und InternelNode per Callocate im Speicher abgelegt. Jetzt habe ich versucht, im InternalNode eine Funktion zu schreiben, die per this auf die Rekords des Knotens zugreift. Da sagt mir der Compiler "variable not declared".
Kann man auf alloziierte UDT-Records nicht per this zugreifen? Wie kann man das sonst machen?
[Edit] Man kann. Hab nur den Zeiger falsch deklariert Problem hat sich erledigt...  _________________ Und die Grundgebihr is aa scho drin- DOS is jo nett. |
|
Nach oben |
|
 |
Stormy

Anmeldungsdatum: 10.09.2004 Beiträge: 567 Wohnort: Sachsen - wo die schönen Frauen wachsen ;)
|
Verfasst am: 31.01.2008, 17:14 Titel: |
|
|
Was ich nicht verstehe, warum du überhaupt zwischen Kopf-, mittleren und Fuß-Element unterscheidest. Bei deiner Variante kommt es nur zur unnötigen Code-Dopplung und vergrößerten Aufwand.
Hier ein Szenario, das zeigt wie kompliziert dein Weg doch ist:
Notation: LH = List head, LI = mittleres Element, LE = List end
Angenommen ich habe eine Liste L = LH - LI - LI - LE
Nun lösche ich, das letzte Element: Das heißt LE verschwindet und ich muss das davorstehende LI zu LE casten, was ziemlich aufwändig ist.
Weiterer Kritikpunkt deines Ansatzes ist, dass du nicht weißt, ob das nächste Element nun ein EndNode oder ListItem ist.
Also meine Empfehlung wäre, dass du alle von einem Typ hältst. _________________ +++ QB-City +++ Die virtuelle Stadt für jeden Freelancer - Join the community!
Projekte: QB-City,MysticWorld (RPG), 2D-OpenGL-Tutorial |
|
Nach oben |
|
 |
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
Verfasst am: 31.01.2008, 17:40 Titel: |
|
|
@Stormy
Toll, daß Du Dich mit meinem Projekt auseinandersetzt.
Ich bin in Sachen Listen noch nicht so geübt, kann sein, daß ich da ein paar Redundanzen drin hab. Aber daran wird noch gebastelt.
Die Sache ist so gedacht: EndNode und HeadNode enthalten keine Werte und andere Records als IntNode. Jedes Listenelement hat zusätzlich zum Wert einen Pointer auf HeadNode und auf EndNode (wieweit das nötig ist, werde ich noch ausprobieren) sowie auf das vorhergehende und nächste Element. HeadNode verweist mit einem Pointer auf das erste Listenelement, EndNode auf das letzte.
Head- und EndNode werden somit nicht gelöscht, (darum wird auch nichts gecastet), sondern bilden nur den Rahmen der Liste. Sie werden erst beim endgültigen Beenden des ListProgramms dealloziiert.
Der HeadNode->FirstItem-Pointer auf das erste Element wird beim Eintrag eines neuen Elementes abgefragt und die Werte der beiden Elemente verglichen. Beim Eintragen oder Löschen eines Elementes müssen dann nur die Pointer neu gesetzt werden. Dadurch kann ich die Liste schon vorsortieren.
[Edit]
Möglich wäre natürlich auch, in die Elementknoten einen Namens-String einzusetzen, in dem einfach "Head", "Element "oder "End"steht und diesen dann zu kontrollieren. Dann bräuchte ich tatsächlich nur eine Art von Knoten, müßte aber z. B. beim Löschen des letzten Elementes die Pointer und den Namens-String neu setzen. _________________ Und die Grundgebihr is aa scho drin- DOS is jo nett. |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|