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