Frage zu Liste?



  • Hallo!!

    Ich habe eine Frage ?

    Ich habe eine Liste mit Elementen;

    Ich möchte jetzt alle Elemente aus dieser Liste löschen und neue Elemente einfügen.

    Ich möchte keine neue Liste erstellen, sondern nur alle Elemente löschen und neue einfügen.

    Wie geht das ?

    Im Voraus Vielen Dank L

    Lena



  • Du löschst zuerst solange Elemente, bis die Liste leer ist, danach fügst du die neuen Elemente ein (dazu benötigt die Liste - was für eine Struktur verwendest du überhaupt? - eine Funktion erase() und insert()). Alternativ kannst du die vorhandenen Elemente auch einfach mit neuen Werten überschreiben.

    Wie war nochmal die Frage?



  • Hi,

    Danke für deine Antwort!!!

    Ich habe zwei Strukturen:

    typedef struct freq freq_t;
    typedef struct lut lut_t;
    typedef struct list list_t;
    
    typedef struct freq {
        uintst_t instr;
    };
    
    typedef struct lut {
      freq_t  *tab;
      int entries;
      list_t *init ; 
    };
    
    typedef struct list
    {
      uintst_t instr;
      list_t *next;
    };
    
    lut_t *TmpTables; 
    lut_t * BetterTables;
    

    Ich möchte die Liste aus lut_t Tables[5] und lut_t Tables[6] löschen;

    void FreeList()
    {
      int s; 
      list_t *pointer, *pointer1;
    
      for ( s = 5; s<=6; s++)
      {
        if(TmpTables[s].init != NULL) {
          pointer=TmpTables[s].init->next;
          while(pointer != NULL)
          {
             pointer1=TmpTables[s].init->next->next;
             TmpTables[s].init->next=pointer1;
             free(pointer->next);
             free(pointer);
             pointer=pointer1;
          }
          /* Jetzt löschen wir erst den Anfang der Liste */
          free(TmpTables[s].init->next);
          free(TmpTables[s].init);
          TmpTables[s].init=NULL;
          printf("Liste erfolgreich gelöscht!!\n");
       }
       else
          fprintf(stderr,"Keine Liste zum Löschen vorhanden!!\n");
      }
    }
    

    Ich kriege immer Fehler bei freeList in der Zeile free(pointer->next);
    Unbehandelte Ausnahme bei 0x004228b2 in SimulatedAnnealing.exe: 0xC0000005: Zugriffsverletzung-Leseposition 0xfeeefee8.

    Was mache Ich falsch?

    void UpdateList()
    {
      int  j, k;
      int s; 
      list_t* pointer;
    
      for ( s =5; s <= 6; s++)
      {
        for ( j =0; j < BetterTables[s].entries; j++)
        { 
           if(TmpTables[s].init == NULL) 
           {
    
             if((TmpTables[s].init = ( list_t *) malloc(sizeof( list_t))) == NULL)
             {
    	     fprintf(stderr, "No mamory is for init\n");
    	     return;
    	 }
    
             TmpTables[s].init->instr = BetterTables[s].tab[j].instr;
             TmpTables[s].init->next = NULL;
           }else{
    	  pointer=TmpTables[s].init;
              while(pointer->next != NULL)
    	     pointer = pointer->next;
              pointer->next=NULL;
    
    	  if((pointer->next =(list_t *)malloc(sizeof(list_t))) == NULL)           	  {
    	     fprintf(stderr,"Kein Speicherplatz für das letzte Element\n");
    	     return;
    	  }
    
    	  pointer=pointer->next; 
    	  pointer->instr = BetterTables[s].tab[j].instr;
    	  pointer->next=NULL;
    	}
        }
     } 
    }
    

    Ist alles richtig bei UpdateList?

    Im Voraus Vielen Dank

    lena



  • Sorry, bei deinem Zeiger-Gekurve blicke ich nicht mehr wirklich durch, aber vermutlich sägst du dir da selber den Ast ab. Versuch's mal lieber so:

    ptr=TmpTables[s].init;
    while(ptr!=NULL)
    {
      ptr1=ptr->next;
      free(ptr);
      ptr=ptr1;
    }
    

    (PS: deine typedef's sehen auch merkwürdig aus - schluckt DAS der Compiler?)



  • Vielen Dank für deine Antwort;

    Die Methode FreeList hat funktioniert.

    Aber es kommt jetzt immer ein Problem bei UpdateList;

    Ich habe 20 Elemente, die eingefügt werden sollen.

    aber er fügt nur 3 Elemente hinzu, und kommt zu zeile:

    if((pointer->next =(list_t *)malloc(sizeof(list_t))) == NULL) 
    {
       fprintf(stderr,"Kein Speicherplatz für das letzte Element\n");
       return;
    }
    

    und geht aus der Methode raus;

    void UpdateList()
    {
      int  j, k;
      int s;
      list_t* pointer;
    
      for ( s =5; s <= 6; s++)
      {
        for ( j =0; j < BetterTables[s].entries; j++)
        {
           if(TmpTables[s].init == NULL)
           {
    
             if((TmpTables[s].init = ( list_t *) malloc(sizeof( list_t))) == NULL)
             {
             fprintf(stderr, "No mamory is for init\n");
             return;
             }
    
             TmpTables[s].init->instr = BetterTables[s].tab[j].instr;
             TmpTables[s].init->next = NULL;
           }else{
              pointer=TmpTables[s].init;
              while(pointer->next != NULL)
                   pointer = pointer->next;
              pointer->next=NULL;
    
          if((pointer->next =(list_t *)malloc(sizeof(list_t))) == NULL)                      
          {
             fprintf(stderr,"Kein Speicherplatz für das letzte Element\n");
             return;
          }
    
          pointer=pointer->next;
          pointer->instr = BetterTables[s].tab[j].instr;
          pointer->next=NULL;
        }
        }
     }
    }
    

    Ps: Der compiler funktioniert bei meiner typedef. Aber wenn es falsch ist, werde Ich das ändern. 🙂

    Im Voraus Vielen Dank

    lena



  • also wenn malloc() NULL zurückliefert, hast du ein ernstes Problem mit deiner Speicherauslastung - wieviele Objekte hast du denn in etwa in deinen Strukturen verteilt?

    PS: Ob die typedef-Konstruktion richtig ist, bin ich mir nicht sicher, aber ich habe den Eindruck, da fehlt der definierte Name:

    typedef struct freq {
        uintst_t instr;
    }/*hier fehlt evt etwas*/;
    

    PPS: was bitteschön ist "mamory"? 😃



  • Hi

    Eigentlich sehen meine Strukturen so aus:

    struct in {
      char alp[32];
      uintst_t instr;
    };
    
    struct freq {
      uintst_t instr;
      uintst_t  frequency;
      uintst_t pos;
      int  clength;
      char str[32];
      int select;
      char posstr[32];
      int p; 
      int index;
    
    };
    
     struct lut {
    
      freq_t  *tab;
      int bits;
      int entries;
      int tmpentries;
      int rest;
      int colums[32];
      in_t *Choice;
      int deletInstr;
      int sum_good;
      int cc;
      int u; 
      int ch;
      in_t *InstrSet;
      list_t *init ; 
    };
    
     struct list
    {
      uintst_t instr;
      uintst_t frequency;
      uintst_t pos;
      char str[32];
      int select;
      char posstr[32];
      int p; 
      int index;
      list_t *next;
      in_t *Choice;
      int deletInstr;
      int sum_good;
      int cc;
      int u; 
      int ch;
      in_t *InstrSet;
      list_t *init ; 
    };
    
     struct list
    {
      uintst_t instr;
      uintst_t frequency;
      uintst_t pos;
      char str[32];
      int select;
      char posstr[32];
      int p; 
      int index;
      list_t *next;
    };
    

    Was kann Ich tun, danit malloc kein NULL mehr liefert ?

    Viele Grüsse

    Lena



  • Und wieviele Objekte von den einzelnen Typen schwirren so im Schnitt durch dein Programm?

    Was kann Ich tun, danit malloc kein NULL mehr liefert ?

    Weniger Speicherplatz anfordern (und aufpassen, daß dieser Speicher auch wieder freigegeben wird, wenn du ihn nicht mehr benötigst).



  • Danke,

    Ich versuche jetzt mehr Speicherplatz zu kriegen!

    Vielen Dank!!

    Viele Grüsse

    Lena


Anmelden zum Antworten