2016-10-16 4 views
0

Ich habe Probleme, meine Struktur/Array zu entfernen. Im Moment kann ich Max Array auf Größe 10 definieren. Ich kann das Array mit struct füllen, das Namen, Alter usw. enthält. Meine Suchfunktion lässt mich zwischen einer Reihe von Intervallen, sagen Alter 10 bis 25 suchen. Was ich meine remove-Funktion tun möchte, ist diejenigen all jene Personen im Alter zwischen 10-25 zu entfernen. Ich sollte in der Lage sein, neue Leute in die Datenbank einzutragen, solange es mein definiertes Limit nicht überschreitet. Im Moment scheint es zufällig Dinge aus dem Array zu entfernen.Entfernen des eingestellten Intervalls von struct

struct database 
{ 
    float age,b,c,d; 
    char name[WORDLENGTH]; 
}; 
typedef struct database Database; 

search func(); 

.........

void remove(Database inv[], int *np, int *min, int *max, int *option) 
    { 
     int i; 

     if (*np == 0) 
     { 
      printf("The database is empty\n"); 
      return; 
     } 

     search(inv, *np, low, high, option); 

     if (*option == 1) 
     { 
      for (i = 0; i<*np; i++) 
      { 
       if (inv[i].age >= *low && inv[i].age <= *high) 
       { 
        (*np)--; 

       } 
      } 
     } 
    } 
+0

Es entfernt nichts aus dem Array, sondern verringert die Anzahl der Datensätze.Wenn Sie also eine Übereinstimmung finden, wird dies der letzte Datensatz im Array sein, der "entfernt" wird. –

+0

min, max, niedrig, hoch? Ist das dein echter Code? Wie auch immer, ich entferne kein Element im Array, nur indem ich 'np' dekrementiere. Sie müssen Elemente kopieren/überschreiben. – 4386427

+0

siehe http://stackoverflow.com/questions/15821123/removing-elements-from-an-array-in-c und http://stackoverflow.com/questions/37911285/fastest-way-to-remove-huge- Anzahl der Elemente von einem Array-in-c – BeyelerStudios

Antwort

1

jetzt rechts scheint es zufällig aus dem Array Material zu entfernen.

Die Elemente, die Ihr Code entfernt, sind überhaupt nicht zufällig. Diese Zeile

(*np)--; 

entfernt das letzte Element. Wenn der Bereich zwei Elemente enthält, die der Suchbedingung am Anfang von inv entsprechen, würde Ihr Code daher zwei Elemente vom Ende entfernen. Die Dinge werden ein wenig komplizierter, wenn übereinstimmende Elemente im hinteren Bereich des gültigen Bereichs von inv liegen, sodass Löschungen zufällig aussehen.

Das Löschen aus einem Array von struct s unterscheidet sich nicht vom Löschen aus einem Array von int s. Sie müssen diesen Algorithmus folgen:

  • einen Lese-Index erhalten und einen Schreibindex, anfänglich auf Null
  • einer Schleife ausgeführt, die endet, wenn der Leseindex über das Ende Bei jedem Schritt
  • geht überprüfen die Artikel bei Leseindex
  • Wenn das Element aus gelesenen Index nicht die Entfernung Bedingung übereinstimmen, kopiert Index zu schreiben, und vorzurücken beiden Indizes
  • Andernfalls vorher nur den Leseindex
  • neues Set np zu der Wert des Schreibindex am Ende der Schleife.

Dieser Algorithmus stellt sicher, dass Elemente hinter den gelöschten in Richtung der Vorderseite des Arrays verschoben werden. Eine beispielhafte Implementierung des obigen Ansatzes siehe this answer.

+0

Hallo! danke für die Tipps. Aber ich bin mir immer noch nicht sicher, wie ich das umsetzen soll. In deinem Beispiel, das du verlinkt hast, if (keep_element (array [rd])), was ist das? Ist das der Punkt, an dem ich durchschlinge und überprüfe, ob die Elemente im Array OUTSIDE von say (inv [i] .age <* niedrig && inv [i] .age> * high) sind wo niedrig und hoch ist, wo ich mein Altersintervall angegeben habe – xxFlashxx

+0

@Alex 'if (keep_element (array [rd]))' ist das Gegenteil der Löschbedingung. In Ihrem Fall liegt es außerhalb des Intervalls, das 'inv [i] .age <* low || ist inv [i] .age> * high '(beachten Sie die '||' anstelle von '&&'). – dasblinkenlight

+0

Hallo, danke. Es funktioniert immer noch nicht ... Gibt es eine Möglichkeit, direkt mit dir zu chatten? – xxFlashxx

0

Sie können ein Array-Element nicht einfach durch Verringern der Anzahl der Elemente entfernen.

Wenn Sie das n-te Element im Array entfernen wollen, müssen Sie das n-te Element mit dem (n + 1) 'ten Element überschreiben und das (n + 1)' te Element mit dem (n + 2) 'th Element und so weiter.

Etwas wie:

int arr[5] = { 1, 2, 3, 4, 5}; 
int np = 5; 

// Remove element 3 (aka index 2) 
int i; 
for (i = 2; i < (np-1); ++i) 
{ 
    arr[i] = arr[i+1]; 
} 
--np; 

Dies ist ein einfaches Konzept, das Konzept zu erklären. Aber beachten Sie, dass es viel Kopie erfordert, also sollten Sie im echten Code einen besseren Algorithmus verwenden (wenn Leistung ein Problem ist). Die Antwort von @dasblinkenlight erklärt einen guten Algorithmus.

Verwandte Themen