Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Verkettete Liste (auch für Strings)

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Projektvorstellungen
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
MilkFreeze



Anmeldungsdatum: 22.04.2011
Beiträge: 116

BeitragVerfasst am: 24.04.2011, 20:28    Titel: Verkettete Liste (auch für Strings) Antworten mit Zitat

Ich habe Heute eine Doppelt Verkettete Liste geschrieben. Viele Funktionen hat die Liste bisher nicht, aber sie kann für verschiedene Datentypen benutzt werden und auch mit Strings umgehen (im gegensatz zu den Listen die ich hier im Forum gefunden habe).

Ich weiß nicht ob wirklich bedarf besteht, aber ich hab hier keine Schlanke Liste gefunden, die mit mehreren Datentypen kompfortabel umgehen kann und Strings händelt.

Benutzung ist recht einfach über
Code:
make_list(<datentyp>, <name>)

Zu bedenken ist, das der Name des Listen-UDTs automatisch um "_list" ergänzt wird.

Member-Funktionen der Liste sind:
Apppend(element) - Anhängen von Elementen an das Ende der Liste
Insert(x, element) - Einfügen von Elementen mitten in die Liste
item(x) - Zugriff auf ein Element der Liste (Schreiben und Lesen der Werte)
getptr(x) - Wie item(), arbeitet aber mit den Pointern auf die Elemente
remove(x) - Löschen eines Elementes aus der Liste

Der Code (inklusive eines kleinen Beispiels am Ende) findet ihr hier:

fb:porticula NoPaste #1256

Ich freue mich über jede Form von Rückmeldung lächeln
_________________
Milch ftw grinsen


Zuletzt bearbeitet von MilkFreeze am 27.04.2011, 16:16, insgesamt 2-mal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
XOR



Anmeldungsdatum: 23.07.2010
Beiträge: 161

BeitragVerfasst am: 24.04.2011, 21:02    Titel: Antworten mit Zitat

Mir ist folgendes aufgefallen:
koenntest du
Code:
property ##list_name##_list.item(index as integer) as datatype ptr
   'Wir benutzen get_element() und geben gleich p_element aus:
   return (this.get_element(index)->p_element)
end property

zu
Code:
property ##list_name##_list.item(index as integer) as datatype
   'Wir benutzen get_element() und geben gleich p_element aus:
   return *(this.get_element(index)->p_element)
end property

mchen, da wenn ich einen datatype reingebe diesen auch raushaben will und keinen zeiger.
Zu
Code:
delete this.p_element

ich dachte nicht mit Allocate / Callocate erzeugter speicher soll mit Deallocate freigegeben werden.
Noch was anderes.
Die Liste wird nicht zerstoert, wenn man nicht alles selbst mit remove entfernt.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MilkFreeze



Anmeldungsdatum: 22.04.2011
Beiträge: 116

BeitragVerfasst am: 24.04.2011, 22:02    Titel: Antworten mit Zitat

XOR hat Folgendes geschrieben:
Mir ist folgendes aufgefallen:
koenntest du
Code:
property ##list_name##_list.item(index as integer) as datatype ptr
   'Wir benutzen get_element() und geben gleich p_element aus:
   return (this.get_element(index)->p_element)
end property

zu
Code:
property ##list_name##_list.item(index as integer) as datatype
   'Wir benutzen get_element() und geben gleich p_element aus:
   return *(this.get_element(index)->p_element)
end property

mchen, da wenn ich einen datatype reingebe diesen auch raushaben will und keinen zeiger.


An sich keine schlechte Idee, aber wenn man einen UDT hat und davon eine Liste erzeugt kann mit .item(x)->element auf das Element zugegriffen werden, und eventuelle Änderungen werden innerhalb der Liste gemacht, müssen also nicht Nachträglich in die Liste geschoben werden. Wenn unbedingt benötigt kann ich noch ein item_value() oder so etwas in der Art einfügen, wenn nur der Wert, aber nicht der Pointer benötigt wird.

XOR hat Folgendes geschrieben:
Zu
Code:
delete this.p_element

ich dachte nicht mit Allocate / Callocate erzeugter speicher soll mit Deallocate freigegeben werden.
Noch was anderes.
Die Liste wird nicht zerstoert, wenn man nicht alles selbst mit remove entfernt.


Kann ich beides Fixen. Danke für den Hinweis.
_________________
Milch ftw grinsen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MilkFreeze



Anmeldungsdatum: 22.04.2011
Beiträge: 116

BeitragVerfasst am: 25.04.2011, 11:54    Titel: Antworten mit Zitat

Hab gerade die Subroutine "destroy()" sowie einen Destructor dazugeschrieben. Der Desctructor von ##list_name##_list_el wurde auch erweitert und zerstört alle nachfolgenden Teile der Liste mit. Remove() habe ich entsprechend angepasst.

Oh, und ich hab die Operatoren "LET" und "+=" für die Liste überladen. LET könnte bei großen Listen sehr langsam werden, da die Elemente aus der zweiten Liste kopiert werden, damit die Speicheraddressen nicht identisch bleiben (Könnte sonst probleme geben wenn man die Kopie zerstört und mit dem Original weiter arbeitet).

Link: fb:porticula NoPaste #1254

P.S.: Elemente die String beinhalten werden nun mit Deallocate vernichtet lächeln
_________________
Milch ftw grinsen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
XOR



Anmeldungsdatum: 23.07.2010
Beiträge: 161

BeitragVerfasst am: 25.04.2011, 18:47    Titel: Antworten mit Zitat

Zitat:
An sich keine schlechte Idee, aber wenn man einen UDT hat und davon eine Liste erzeugt kann mit .item(x)->element auf das Element zugegriffen werden, und eventuelle Änderungen werden innerhalb der Liste gemacht, müssen also nicht Nachträglich in die Liste geschoben werden. Wenn unbedingt benötigt kann ich noch ein item_value() oder so etwas in der Art einfügen, wenn nur der Wert, aber nicht der Pointer benötigt wird.

du kannst es ja so machen das "item" die variable zuruckgibt und "getPointer" oder so aenlich den zeiger.

Edit:
mit insert(1,X) kann ich ein element an aller erster stelle erstellen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 25.04.2011, 19:26    Titel: Antworten mit Zitat

deine Remove-Prozedur solltest du aber nochmal überarbeiten. (Erstes / mittleres / letztes element)


MfG
TPM

PS: gibt schon n paar LL's die auch Strings unterstützt.
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MilkFreeze



Anmeldungsdatum: 22.04.2011
Beiträge: 116

BeitragVerfasst am: 25.04.2011, 22:38    Titel: Antworten mit Zitat

XOR hat Folgendes geschrieben:

du kannst es ja so machen das "item" die variable zuruckgibt und "getPointer" oder so aenlich den zeiger.


Gute Idee, mach ich Morgen.

XOR hat Folgendes geschrieben:
Edit:
mit insert(1,X) kann ich ein element an aller erster stelle erstellen.


Wenn die Liste leer ist oder wenn schon Elemente in der Liste vorhanden sind? Wenn schon ein oder mehr Elemente vorhanden sind ist das tatsächlich ein Fehler.

Die Liste soll möglichst Fehlertolerant sein. Wenn eine Operation nicht möglich ist, wird entweder schweigend abgebrochen (exit sub) oder eine naheliegende Aktion durchgeführt. Deswegen Funktioniert Insert() auch bei einer leeren Liste.

@ThePuppetMaster:
Ich weiß. Deine Liste kann ja auch Strings, ist in meinen Augen aber mehr Baum als Liste und damit User Defined Types händeln ist sehr umständlich. Die anderen Listen konnten entweder keine Strings, hatten zu viele Funktionen die ich selbst nicht brauche, waren nicht doppelt verkettet oder gar keine richtigen Listen sondern Arrays.

Hast du zu der Fehlerhaften remove()-Funktion einen Beispielcode?
_________________
Milch ftw grinsen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 25.04.2011, 22:49    Titel: Antworten mit Zitat

MilkFreeze hat Folgendes geschrieben:
Hast du zu der Fehlerhaften remove()-Funktion einen Beispielcode?


Erzeuge element, entferne das erste und greife auf die liste zu. sie wird korrupt sein.


MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
XOR



Anmeldungsdatum: 23.07.2010
Beiträge: 161

BeitragVerfasst am: 26.04.2011, 02:12    Titel: Antworten mit Zitat

Zitat:
XOR hat Folgendes geschrieben:
Edit:
mit insert(1,X) kann ich ein element an aller erster stelle erstellen.

Wenn die Liste leer ist oder wenn schon Elemente in der Liste vorhanden sind? Wenn schon ein oder mehr Elemente vorhanden sind ist das tatsächlich ein Fehler.


sorry ich meinte mit insert(1,X) kann ich ->kein<- element an aller erster stelle erstellen.
normalerwiese wenn man insert(Posi,X) nimmt sollte das itme an der position Posi nach Posi+1 verschoben werden und das neue item an die position Posi kommen so das insert(getCount(),X) kein element an letzter, sondern an vorletzter stelle erstellt.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MilkFreeze



Anmeldungsdatum: 22.04.2011
Beiträge: 116

BeitragVerfasst am: 26.04.2011, 11:49    Titel: Antworten mit Zitat

Die Remove-Funktion habe ich schon korrigiert.
Item() gibt jetzt die Werte zurück,
getptr() gibt die Pointer.

Insert() korrigiere ich nachher und lade die neue Version auf das Portal hoch.
_________________
Milch ftw grinsen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MilkFreeze



Anmeldungsdatum: 22.04.2011
Beiträge: 116

BeitragVerfasst am: 26.04.2011, 16:01    Titel: Antworten mit Zitat

hab gerade Insert() umgeschrieben. Hier das Ergebnis:

fb:porticula NoPaste #1255

Ich habe den Link im Eingangspost auch mal geändert.
_________________
Milch ftw grinsen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 956
Wohnort: Austria

BeitragVerfasst am: 26.04.2011, 17:36    Titel: Antworten mit Zitat

Etwas Eigenwerbung am Rande:

Warum bei jeder Änderung eines Quelltextes in fb:porticula einen neuen Eintrag erstellen, wenn dieser auch geändert werden könnte?

Für die meines Erachtens derzeit beste existierende FreeBasic IDE, FBedit, gibt es ein Addin, um genau dies komfortabel in der IDE zu erledigen:
http://users.freebasic-portal.de/stw/files/prog/fb/porticula-plugin/PorticulaPlugin.dll

Einfach in den Addins Ordner kopieren und FBedit (neu) starten. Im Menü "Werkzeuge" erscheint anschließend der Eintrag "fb:porticula NoPaste". Des weiteren wird dem "Optionen"-Menü ebenso ein Eintrag für die Einstellungen hinzugefügt.

Noch kein FBedit oder Windows Nutzer?
Dann wirds Zeit für den Umstieg auf FBedit und Windows zwinkern
Download und Infos unter http://radasm.cherrytree.at/fbedit/ und http://www.microsoft.com/windows/ lächeln
_________________
Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 26.04.2011, 17:43    Titel: Antworten mit Zitat

St_W hat Folgendes geschrieben:
Noch kein FBedit oder Windows Nutzer?
Dann wirds Zeit für den Umstieg auf FBedit und Windows zwinkern
L ooo L !!!
das is keine Eigenwerbugn das is "Religions-Zwang"

MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MilkFreeze



Anmeldungsdatum: 22.04.2011
Beiträge: 116

BeitragVerfasst am: 26.04.2011, 21:19    Titel: Antworten mit Zitat

St_W hat Folgendes geschrieben:
Warum bei jeder Änderung eines Quelltextes in fb:porticula einen neuen Eintrag erstellen, wenn dieser auch geändert werden könnte?


Das Klingt erstmal nicht schlecht... aber:

St_W hat Folgendes geschrieben:
Noch kein FBedit oder Windows Nutzer?
Dann wirds Zeit für den Umstieg auf FBedit und Windows zwinkern
Download und Infos unter http://radasm.cherrytree.at/fbedit/ und http://www.microsoft.com/windows/ lächeln


Du verlangst viel von mir. Ich benutze zwar manchmal Windows - und bin durchaus positiv überrascht von Windows 7. Aber nur um einen Porticula-Eintrag zu editieren werde ich nicht in den Laden gehen und mir eine Windows-Lizenz kaufen. Und bisher bin ich mit Geany sehr zufrieden. Immerhin kann ich damit auch den Sourcecode anderer Sprachen mit Syntaxhighlight begutachten und brauch so nur eine IDE.

Entschuldigung, aber den gefallen auf FBedit (und Windows) umzusteigen kann ich dir beim besten willen nicht erfüllen. Trotzdem danke für den Tipp.
_________________
Milch ftw grinsen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
XOR



Anmeldungsdatum: 23.07.2010
Beiträge: 161

BeitragVerfasst am: 26.04.2011, 22:27    Titel: Antworten mit Zitat

Fehler:
->bei:
    Code:
    property ##list_name##_list.getptr(index as integer, value as datatype ptr)
      'Wir benutzen get_element() und schieben den Wert gleich in p_element:
      this.get_element(index)->p_element = value
    end property

    wird p_element zu value, das alte p_element wird nicht dealloziert aber das von dir geschriebene.

->bei:
    remove(1) und remove(0) fueren zum absturz.
    bei remove(0) weil
    Code:
    if (index < 0 or index > this.i_count) then exit sub

    nur abgebrochen wird, wenn index kleiner als 0 ist und nicht gleich.
    bei remove(1) weil
    Code:
    if (index = this.i_count) then
        ? "muh"
        'p_last korrigieren:
        this.p_last = p_tmp_item->p_prev
        'p_last->p_next leeren:
        this.p_last->p_next = 0
    else
        p_tmp_item->p_next->p_prev = p_tmp_item->p_prev
        p_tmp_item->p_prev->p_next = p_tmp_item->p_next
    end if

    du bei einem nullptr "p_tmp_item->p_prev" p_next schreiben willst.

zu getptr:
ich wuerde ihn nur ausgeben, nicht aber setzen lassen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MilkFreeze



Anmeldungsdatum: 22.04.2011
Beiträge: 116

BeitragVerfasst am: 27.04.2011, 16:14    Titel: Antworten mit Zitat

Behoben. Lade gleich den Code hoch und aktualisiere den ersten Post.
_________________
Milch ftw grinsen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Luke



Anmeldungsdatum: 14.01.2009
Beiträge: 92
Wohnort: Ostfriesland !

BeitragVerfasst am: 02.05.2011, 18:26    Titel: Antworten mit Zitat

Hey, das ist auch mal ein schönes Projekt. Ich brauche für viele meiner Programme Listen, und schreibe mir dann immer behelfsmäßig ein paar funktiönchen zusammen, und halte mich daran immer auf......Ich bin auch noch nie zu einer Zusammenfassung gekommen. Dann kann ich ja deine zukünftig nutzen, wenn du nichts dagegen hast zwinkern
ist wenigstens gleich alles beisammen und funktioniert grinsen
_________________
ICH war mal schizophren, aber jetzt sind WIR okay.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MilkFreeze



Anmeldungsdatum: 22.04.2011
Beiträge: 116

BeitragVerfasst am: 04.05.2011, 23:40    Titel: Antworten mit Zitat

Wenn du meinen Namen noch irgendwo erwähnst wär das nett, ist aber nicht unbedingt nötig. Wenn ich gewollt hätte das die Liste niemand benutzt, dann hätte ich sie nicht veröffentlicht lächeln
_________________
Milch ftw grinsen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Projektvorstellungen Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz