Element aus Array löschen oder einfügen;
-
Hi Leute,
Ich habe eine Frage. Kann man in ANSI C, in einem Array ein oder mehrere Elemente löschen oder einfügen? Oder das kann man nur mit Listen?
Wenn es möglich ist mit dem Array, dann wie ?
Viele Grüsse
lena
-
Hallo,
fanbjs schrieb:
Wenn es möglich ist mit dem Array, dann wie ?
du kannst mit realloc dynamische Arrays in der Größe verändern. Wenn du dann z.B. Platz in der Mitte brauchst, musst du nach dem Vergrößern die Elemente noch nach rechts schieben.
Trotzdem sind Listen besser geeignet, wenn du oft mitten in der Liste einfügen/löschen willst.
MfG
GPC
-
Vielen Dabk für deinen Antwort!!!!
Ich habe noch eine Frage, wie kann Ich die Zahlen in Array nach rechts schieben?
Viele Grüsse
Lena
-
fanbjs schrieb:
Ich habe noch eine Frage, wie kann Ich die Zahlen in Array nach rechts schieben?
Wie würdest du's denn machen?
Bsp:
Ein Array mit 6 Elementen, davon sind die ersten vier mit Werten belegt, die anderen zwei hast du noch nicht angefasst.
[5, 10, 15, 25, X, X]
Du willst jetzt 15 und 25 ganz nach rechts schieben, sodass nach 10 eine freie Lücke von 2 Elementen entsteht:
[5, 10, X, X, 15, 25]
Und wie geht's? Du gehst an den index von 25 und packst die Zahl zwei Stellen rechts davon wieder rein, dann rückst du eins nach links und machst das selbe mit 15. Versuch dich mal dran! Es gibt sicherlich schnellere und elegantere Lösungen, aber das reicht für den Anfang aus.
MfG
GPC
-
Hi,
Vielen Dank für deinen Antwort. Aber Ich habe überhaupt nichts verstanden.
Ich habe zwei Arrays:
Array1 {1, 4, 7, 12} : entries1 = 4; Array2 {3, 5, 8, 16, 19}: entries2 = 5;
Die Speicherplatz wurde füe beide Arrays dynamisch reserviert ( nach entries);
Array1 = (int *) calloc (entries1, sizeof(int *)); Array2 = (int *) calloc (entries2, sizeof(int *));
Jetzt möchte Ich aus Array1 die Zahl 7 löschen und dann diese Zahl in Array2 einfügen. (egal wohin, ob am Anfang, Mitte oder Ende: spielt keine Rolle);
Ich benutze jetzt realloc:
entries1 = entries1 -1; Array1 = (int *) realloc(Array1, (entries*sizeof(freq_t)));
Das hat geklappt, er hat ein Element gelöscht. Aber was kann Ich machen, damit er ein bestimmten Element (7) löscht.
Und wie kann Ich disen Element in Array2 einfügen?
Im Voraus Vielen Dank.
-
Du reservierst falsch (und casten musste in C auch nicht), so geht's:
int *Array1 = calloc (entries1, sizeof(int)); int *Array2 = calloc (entries2, sizeof(int));
Hier mal die Vorgehensweise:
1. Zuerst holst du das zu löschende Element aus Array1 raus bzw. speicherst es in einer Variablenint t = Array1[2];
2. Dann einmal links shiften der Elemente nach 7 in Array 1
3. Jetzt kannst Array1 reallokieren, also 1 kleiner machenArray1 = realloc(Array1, --entries1*sizeof(int));
4. Array2 um eins vergrößern, mit realloc
Array2 = realloc(Array2, ++entries2*sizeof(int));
5. Die zwischengespeicherte Zahl ans Ende hängen.
Array2[entries2-1] = t;
Fertig.
Btw. Hör auf "deinen Antwort" zu schreiben
MfG
GPC
-
Vielen, Vielen Vielen Dank
-
Ein Array ist ein zusammenhängender Speicherbereich, da kannst Du nicht einfach in der Mitte irgendwas rauslöschen. Du kannst bei der Konstruktion {1, 4, 7, 12} die 12 mit der 7 tauschen (im allgemeinen Fall müssen entweder mehr Elemente nach vorne gerutscht werden, oder man tauscht einfach das zu löschende mit dem letzten Element, wenn einem die Reihenfolge egal ist) und dann einfach entries1 dekrementieren.
Um die gelöschte Zahl im zweiten Array einzufügen, mußt Du dann dieses Array vergrößern (realloc mit dem erhöhten entries2) und dann das neue Element als letztes Element hineinkopieren.
Wenn Du das oft machen mußt, ist die Datenstruktur "zusammenhängender Speicherbereich" ziemlich deplaziert und man sollte stattdessen eine Liste oder das zweite Feld 'ausreichend groß' dimensionieren, je nach dem, wie dein Problem genau aussieht. Was möchtest Du also machen?
[Ich vermute, es sollte oben Array1=calloc(entries1, sizeof(int)) heißen, nicht sizeof(int*).]
edit: Huch, langsam. Ich laß das trotzdem mal so stehen.