Mehrdimensionales Array Wert enfernen



  • Hallo C Freunde,

    ich habe folgende Herausforderung, bei der ich um Hilfe bitte.

    Bei dem Versuch in einem 2 dimensionalem Array die doppelten Werte zu entfernen lauf ich in einen Speicherfehler.
    Ziel für mich ist es eine Array Zeile die doppelt ist "x[i]" komplett zu entfernen das heißt Index und Wert.
    Hier die Zeilen um die es geht.
    Das Array sieht von den Werten wie folgt aus:
    x 0 12345
    x 1 12345
    x 2 123456

    for(i = 0; i < y; ++i){
    for(j = i + 1; j < y; ++j){
    if(strcmp(x[i], x[j]) == 0){
    x[i] = NULL;
    }
    }
    }
    for( blabla)
    printf("%s",x[i])

    Vielen dank im Voraus



  • Du kannst Array-Elemente nicht "entfernen", du kannst sie höchstens mit einem Eintrag für "hier steht nichts" überschreiben oder die nachfolgenden Elemente entsprechend aufrücken lassen.



  • Du könntest auch ein neues Array aufbauen ohne doppelte Einträge.



  • Danke erst ma für die Antworten.

    @cstoll Wie lass ich es aufrücken ohne Speicherverletzung?
    "x[i--]" geht ja au net so recht

    @wutz Das wäre auch ne Lösung genauso wie es beim Ausgeben mit einer If Abfrage aussortieren "if(x[i]=="")".
    Aber das will ich net aus Performance Gründen daher würd ich mich sehr freuen wenn ihr mir einen anderen Ansatz liefern könntet.

    Danke fürs Gehirnschmalz 🙂



  • Ich denke, man liesst den Array, vergleicht die Inhalte, und schreibt ihn zunächst in einen anderen Array neu. Zum Finden gleicher Werte eignet sich ein Sort. Anschliessend umkopieren oder Zeiger ändern. Kommt auf die Grösse des Arrays an!



  • @berniebutt aber sort ist das nicht ein C++ Befehl?
    Ich würde auch ungern das Programm mit einem weiterem Array füttern wollen.
    Es sollte doch eine Möglichkeit geben das ich sagen kann, wenn Char Array 0 mit char Array 1 gleich ist, entferne eines von beiden und korrigiere den Index.



  • SnowDevil schrieb:

    Es sollte doch eine Möglichkeit geben das ich sagen kann, wenn Char Array 0 mit char Array 1 gleich ist, entferne eines von beiden und korrigiere den Index.

    Klar gibt es die.
    Musst du aber selber machen.
    In der Art

    for(int k=i;k<y-1;++k)
     x[k]=x[k+1];
    --y;
    


  • Eine einfache Stringliste könnte so aussehen.
    Zum Verständnis schaue am besten erstmal in main.
    Die konkreten Implementierungen sind natürlich nur sehr einfach gehalten, ohne Fehlerbehandlung usw. und auf ein char-Array konstanter Länge hin abgestimmt.

    #include <stdlib.h>
    #include <string.h>
    #include <stdio.h>
    
    typedef struct {
      char str[100];
    } EinTyp; /* erweiterbarer Datentyp, hier der Einfachheit halber nur ein char-Array */
    
    typedef struct Liste Liste;
    
    struct Liste {
      void (*add)(Liste*,void*);
      void (*delat)(Liste*,int);
      void (*delall)(Liste*);
      void (*loop)(Liste*,void(*)(void*));
      void (*sort)(Liste*);
      void (*unique)(Liste*);
      void (*release)(Liste*);
      int n;
      EinTyp *liste;
    };
    
    void add(Liste*l,EinTyp*e) /* Hinzufügen eines Elements */
    {
      l->liste=realloc(l->liste,++l->n*sizeof*l->liste);
      l->liste[l->n-1]=*e;
    }
    
    void delat(Liste*l,int i) /* "Lösche" Element bei Index  ( 0 basiert ) */
    {
      memmove(l->liste+i,l->liste+i+1,(--l->n-i)*sizeof*l->liste);
    }
    
    void delall(Liste*l) /* keine Einträge */
    {
      l->n=0;
    }
    
    void loop(Liste*l,void(*f)(void*)) /* Durchlaufen aller Elemente mit angegebener Funktion */
    {
      int i=0;
      for(;i<l->n;f(l->liste+i++));
    }
    
    void sort(Liste*l) /* aufsteigend sortieren */
    {
      qsort(l->liste,l->n,sizeof*l->liste,strcmp);
    }
    
    void unique(Liste*l) /* nur einzige Werte */
    {
      int i,found;
      l->sort(l);
      do {
        found=0;
        for(i=1;i<l->n;++i)
          if( !memcmp(l->liste+i-1,l->liste+i,sizeof*l->liste) ) {found=1;l->delat(l,i);break;}
      } while( found );
    }
    
    void release(Liste*l) /* Speicherfreigabe */
    {
      free(l->liste);
      l->n=0;
    }
    
    int main()
    {
      Liste l={add,delat,delall,loop,sort,unique,release};
    
      l.add(&l,"sieben");
      l.add(&l,"sechs");
      l.add(&l,"eins");
      l.add(&l,"eins");
      l.loop(&l,puts);
    
      l.sort(&l);
      l.loop(&l,puts);
    
      l.unique(&l);
      l.loop(&l,puts);
    
      l.delat(&l,1);
      l.loop(&l,puts);
    
      l.delall(&l);
      l.loop(&l,puts);
    
      l.release(&l);
    
      return 0;
    }
    

    Hier nochmal als Link:

    http://ideone.com/Dkchg


Anmelden zum Antworten