Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Faule Socke

Community-Fossil

  • »Faule Socke« ist der Autor dieses Themas

Beiträge: 1 915

Wohnort: Schreibtischstuhl

  • Private Nachricht senden

11

16.12.2006, 23:04

Re: Element aus Array das mit new erzeugt wurde löschen

Zitat von »"David_pb"«


Wenn dich verlinkte Listen interessieren und du gern selbst eine implementieren willst: Das Prinzip ist das jeder Listeneintrag einen Zeiger auf den nächsten (und evtl verherigen) Eintrag besitzt. So kann man z.B. sehr schnell Listeneinträge löschen, indem man nämlich einfach die Zeiger ändert.
Der Vorteil gegenüber normalen Arrays ist, das der Aufwand hierbei sehr viel weniger komplex ist.

grüße


So wie dot das da oben präsetiert hat klingen listen nach der lösung all meiner probleme! Also interessiere ich mich dafür! Allerdings klingt es für mich nach einem speicherleg wenn du zb einen eintrag löschen willst setzt du einfach den zeiger des vorherigen eintrages(der auf den nächsten zeigen soll) auf den nächsten eintrag und den zeiger des nächsten eintrages(der auf den vorherigen zeigen soll) auf den vorherigen eintrag! damit bleibt aber in der mitte ein eintrag auf den kein zeiger mehr zeigt! Dazu habe ich mal das paint bemüht:

Einen Eintrag löschen(rechtsklick für Download)


mfg,

Faule Socke

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

12

16.12.2006, 23:07

klar^^

du musst halt den "gelöschten" eintrag auch freigeben...

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

13

16.12.2006, 23:09

Re: Element aus Array das mit new erzeugt wurde löschen

Zitat von »"Faule Socke"«

Zitat von »"David_pb"«


Wenn dich verlinkte Listen interessieren und du gern selbst eine implementieren willst: Das Prinzip ist das jeder Listeneintrag einen Zeiger auf den nächsten (und evtl verherigen) Eintrag besitzt. So kann man z.B. sehr schnell Listeneinträge löschen, indem man nämlich einfach die Zeiger ändert.
Der Vorteil gegenüber normalen Arrays ist, das der Aufwand hierbei sehr viel weniger komplex ist.

grüße


So wie dot das da oben präsetiert hat klingen listen nach der lösung all meiner probleme! Also interessiere ich mich dafür! Allerdings klingt es für mich nach einem speicherleg wenn du zb einen eintrag löschen willst setzt du einfach den zeiger des vorherigen eintrages(der auf den nächsten zeigen soll) auf den nächsten eintrag und den zeiger des nächsten eintrages(der auf den vorherigen zeigen soll) auf den vorherigen eintrag! damit bleibt aber in der mitte ein eintrag auf den kein zeiger mehr zeigt! Dazu habe ich mal das paint bemüht:

Einen Eintrag löschen(rechtsklick für Download)


mfg,

Faule Socke


Das Prinzip hast du verstanden. Ich bin davon ausgegangen das es klar sein sollte das der Speicher des gelöschten Elements wieder freigegeben werden muss. Daher hab ich das nicht nochmal extra erwähnt.
Aber klar, nach dem umbiegen der Zeiger den speicher freigeben!

grüße
@D13_Dreinig

Faule Socke

Community-Fossil

  • »Faule Socke« ist der Autor dieses Themas

Beiträge: 1 915

Wohnort: Schreibtischstuhl

  • Private Nachricht senden

14

16.12.2006, 23:20

hmmm und wie soll ich das dann machen? ich meine wenn ich für jedes element eine neue variable erstelle ist das ganze ja nicht synamisch! wenn ich ein array nehme(und dann new und delete verwende) kann ich ja nicht einfach mit delete ein element "mittenraus" löschen!

Kannst du vllt mal etwas praktischen code posten?


mfg,

Faule Socke

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

15

16.12.2006, 23:45

Was ist da nicht dynamisch, wenn man für jedes Element eine neue Variable erstellt?

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
template <typename Type>
class ListItem
{
public:
  Type actual;
  ListItem<Type> *prev, *next;
};

template <typename Type>
class List
{
private:
  ListItem<Type> *_first, *_last;
public:
  // verwaltung der Liste

};


das mal als ein Beispiel, wie es gaanz ca. aussehen könnte

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

16

17.12.2006, 00:41

Der Typ von *last und *next ist aber falsch. Das müsste ein ListItem-Zeiger sein. Und last würde ich prev nennen.

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

17

17.12.2006, 10:09

Sry... hast ja recht - hab das eher mal schnell hingeklatscht als grobe Vorlage

*korrigiert*

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

18

17.12.2006, 10:19

Oder so:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
template< typename T >
class LinkedList
{
private:
    LinkedList* head;
    LinkedList* prev;
    LinkedList* next;
    T* content;

public:
    LinkedList();
    ~LinkedList();

    void Insert( ... );
    // ...

};
@D13_Dreinig

Faule Socke

Community-Fossil

  • »Faule Socke« ist der Autor dieses Themas

Beiträge: 1 915

Wohnort: Schreibtischstuhl

  • Private Nachricht senden

19

17.12.2006, 14:23

Zitat von »"grek40"«

Was ist da nicht dynamisch, wenn man für jedes Element eine neue Variable erstellt?


Ist doch logisch... wenn ich jedes mal eine neue Variable erstellen muss kann das ganze nicht vollautomatisch ablaufen, da mir die namen für die variablen ja irgendwann ausgehen....

Habe das problem jetzt aber sowieso anderst gelöst, indem ich das Array mit einer for-schleife einfach in ein neues kopiere(was ein element kleiner ist) und dann bein x-ten element einfach continue mache!


mfg,

Faule Socke

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

20

17.12.2006, 14:50

Jo, ziemlich ineffizient! Stell dir vor du hast ein Array mit vielen 100 Elementen und jedes Element ist ein Objekt mit mehreren Kilobyte. Das bremmst ganz gewaltig. Eine verlinkte Liste is da viel schneller und sehr dynamisch.

Zitat


wenn ich jedes mal eine neue Variable erstellen muss kann das ganze nicht vollautomatisch ablaufen, da mir die namen für die variablen ja irgendwann ausgehen....


Du solltest dir das Prinzip wirklich nochmal genau ansehe! :)

grüße
@D13_Dreinig

Werbeanzeige