2016-07-02 20 views
1

Kann nicht scheinen, einen Weg zu finden, wie es zu tun ....Wie entfernt man ein Element aus einem Array in C?

zum Beispiel, wenn ich

a = { 1,2,3 } 

ein Array haben, und ich möchte ein [1], so das Ergebnis löschen be

a = { 1,3 } 

Wie kann dies getan werden?

+2

Beachten Sie, dass, wenn Sie dies viel tun ein Array wahrscheinlich nicht die richtige Datenstruktur für Ihr Problem ist. Eine verknüpfte Liste oder eine Art Baum funktioniert möglicherweise besser – Vality

Antwort

1

Das Beste, was Sie tun können, ist, alle Elemente nach dem entfernten Element um 1 nach oben zu verschieben und einen Größenzähler beizubehalten, der die Anzahl der Elemente im Array angibt. Ein C-Array ist nicht viel mehr als ein zusammenhängender Speicherblock und kann nicht in der Größe verändert werden.

1

Es kommt darauf an. Wenn das Array als static deklariert wurde oder über eine automatische Speicherdauer verfügt, können Sie dies nicht tun, da Sie die effektive Größe des Arrays nicht ändern können.

Eine Abhilfe könnte darin bestehen, alle Elemente nach dem zu verschieben, das nach links entfernt wird, und dann eine sekundäre Variable zu aktualisieren, die zum Speichern der effektiven Länge des Arrays verwendet wird.

Wenn das Array dynamisch zugewiesen wurde, können Sie einfach ein neues, kürzeres Array zuweisen. Kopieren Sie alle Elemente abzüglich der Elemente, die gelöscht werden sollen, und Sie sind fertig.

+0

Wie erstellen Sie ein statisches Array? Ist ein Array nicht als Konstante definiert? – Gregborrelly

+0

Sie setzen das statische Präfix, wenn Sie das Array deklarieren: '' 'static int a = {1, 2, 3};' – ifma

+0

@BackSlash 'static' und' const' sind verschiedene Dinge: In C gibt es drei Speicherdauern: statisch, automatisch und allokiert. ISO/IEC 9899: TC3, 6.2.4 - 1. Jack möchte einfach "nicht von der zugewiesenen Speicherdauer" sagen und tat dies formell korrekt. –

1

könnten Sie verschieben nur die gewünschten Elemente auf dem Index abhängig wie so zu löschen:

Edit: robuster nur in ein neues Array kopieren Sie, dann würde nicht mehr brauchen letzte Element zu ignorieren, wenn nur die Arbeit mit ein Array.

int a = {1, 2, 3}; 
int new_a[sizeof(a)/sizeof(a[0]) - 1]; // new array will hold one less value 
int pos = 3; // delete the item at the third index 

for (i = pos - 1; i < sizeof(a)/sizeof(a[0]) - 1; i++) { 
    new_a[i] = a[i+1]; 
} 
+0

Ich sehe, werde versuchen, dies zu implementieren. Vielen Dank. – Gregborrelly

+5

'sizeof (a)/sizeof (a [0])' wäre besser als 'sizeof (a)/4', anstatt anzunehmen, dass" int "4 Bytes ist. Bei diesem Ansatz ist es außerdem wichtig, den Überblick darüber zu behalten, wie viel von dem Array verwendet wird, oder Sie haben nach dem Löschen einiger Elemente unerwünschte Reste am Ende.Mit dem obigen Beispielcode ändert sich der Array-Inhalt nicht - am Ende steht immer noch '{1, 2, 3}' ', es sei denn, Sie wissen, dass Sie das letzte Element nach dem Löschen ignorieren. Wenn Sie die 2. anstelle der 3. gelöscht hätten, hätten Sie '{1, 3, 3}' - wo sich der Array-Inhalt ändert, aber Sie müssen immer noch das letzte Element ignorieren. – Dmitri

+0

@Dmitri Vielen Dank für diese wertvollen Informationen. – ifma

1

wie ein Element aus einem Array in C entfernen?
Wie kann das gemacht werden?

Elemente eines Arrays in C können nicht gelöscht werden.

Ein Element kann ignoriert, aber nicht gelöscht werden. Die sizeof(a) kann nicht geändert werden. Sobald das Array definiert ist, ist die Anzahl der Elemente festgelegt.

Vielleicht ein neuer Ansatz für Ihre Aufgabe auf höherer Ebene?

+0

Was würde vorschlagen? Ich versuche, meine Implementierung der Auswahl zu schreiben. Nachdem ich den Mindestwert eines gegebenen Arrays gefunden habe, muss ich es entfernen oder ignorieren. Also beim nächsten Mal geht die Schleife herum. Es wird den nächsten minimalen Wert finden und so weiter. – Gregborrelly

+0

Verwenden Sie eine andere Datenstruktur als ein C-Array. Jemand schlug eine verkettete Liste vor, die Antwort, die ich oben gegeben habe, ist jedes Mal sehr teuer, wenn Sie ein Element löschen wollen - O (n) Leistung, aber eine verkettete Liste, die ich glaube, ist O (1). – ifma

+0

@BackSlash Schlagen Sie vor, die Frage mit "wie Daten mit einer Abschnittsart zu entfernen" suchen. Wenn du keine gefunden hast, poste deine Frage, was du getan hast und wo die Herausforderung besteht. – chux

0

Sie können dies nicht mit Array tun. Verwenden Sie stattdessen die verknüpfte Liste.

+0

Über meine Forschung zu verknüpften Listen zu starten. Danke für Ihre Hilfe. – Gregborrelly

Verwandte Themen