Witam, piszę na zajęcia program, który wykorzystuje listę dwukierunkową cykliczną. Wszystko szło bezproblemowo, dopóki nie trafiłem na usuwanie elementu, wygląda na to że coś zrobiłem nie tak, jeśli chodzi o wskaźniki na poprzednie elementy. Kod poniżej:
#include <stdlib.h>
#include <stdio.h>
typedef struct str_glowna {
int id;
int val;
struct str_glowna *nxt, *prv;
} Accelerator;
Accelerator *pozycja=NULL; //wskaznik na aktualna pozycje akceleratora
/* AddElement - funkcja dodaje element do listy. Przyjmuje wskaznik na element
* po którym ma znajdować się nowy element i przechowywaną wartość.
*/
Accelerator * AddElement(Accelerator *where, int wartosc) {
Accelerator *newlyAdded;
newlyAdded = malloc(sizeof(Accelerator));
if (pozycja==NULL) { // lista jest pusta
newlyAdded->id = 1;
newlyAdded->val = wartosc;
newlyAdded->nxt = newlyAdded;
newlyAdded->prv = newlyAdded;
pozycja=newlyAdded;
} else {
newlyAdded->id = where->id + 1;
newlyAdded->val = wartosc;
newlyAdded->nxt = where->nxt;
where->nxt = newlyAdded;
newlyAdded->prv = where;
}
return newlyAdded;
}
/* DeleteElement - usuwa element z listy. Przyjmuje wskaźnik na element do usunięcia
* Zwraca 0 w przypadku błedu, 1 w przypadku powodzenia.
*/
int DeleteElement(Accelerator *which) {
if (pozycja==NULL) // lista jest pusta
return 0;
else {
if (pozycja==which)
pozycja=which->nxt;
Accelerator *setprv, *setnxt;
setprv = which->prv;
setnxt = which->nxt;
setprv->nxt = setnxt;
setnxt->prv = setprv;
free(which);
which=NULL;
return 1;
}
}
void PrintList() {
if (pozycja==NULL) { // lista jest pusta
printf("Lista jest pusta");
} else {
Accelerator *print = pozycja;
int firstid = print->id;
do {
printf("%d ", print->val);
print = print->nxt;
} while(firstid != print->id);
}
}
int main(int argc, char** argv) {
Accelerator *a, *b, *c, *d, *e, *f, *g, *h, *i, *j;
a = AddElement(pozycja, 11);
b = AddElement(a, 12);
c = AddElement(b, 13);
d = AddElement(b, 14);
e = AddElement(b, 15);
f = AddElement(b, 16);
g = AddElement(c, 17);
h = AddElement(c, 18);
i = AddElement(c, 19);
j = AddElement(c, 20);
PrintList();
DeleteElement(c);
printf("\n");
PrintList();
return (EXIT_SUCCESS);
}
Zanim cokolwiek usunę, jest ładnie, lista wygląda, tak jak wyglądać powinna. Wynikiem jest "11 12 16 15 14 13 20 19 18 17". Po usunięciu lista się skraca do "11 12 20 19 18 17". Pół dnia szukam błędu, pomożecie? Co ciekawe, jest w porządku, jeśli elementy dodaje po kolei, po elemencie a następuje b, potem c, d i tak dalej.