struct node {
HINTERNET hInternetConnect; // handle from InternetConnect
HINTERNET hOpenRequest;
struct node *next;
};
struct node *n = NULL;
struct node **list_search(struct node **n, HINTERNET hInternetConnect) {
while (*n != NULL) {
if ((*n)->hInternetConnect == hInternetConnect) {
return n;
}
n = &(*n)->next;
}
return NULL;
}
struct node *list_add(struct node **p, HINTERNET hInternetConnect) {
if (list_search(&(*p), hInternetConnect) == NULL) {
struct node *n = (node*)malloc(sizeof(struct node));
if (n == NULL)
return NULL;
n->next = *p;
*p = n;
n->hInternetConnect = hInternetConnect;
return *p;
}
}
void list_remove(struct node **p) {
if (*p != NULL) {
struct node *n = *p;
*p = (*p)->next;
free(n);
}
}
void list_update(struct node **p, LPCTSTR hOpenRequest) {
if (*p != NULL) {
(*p)->hOpenRequest= hOpenRequest;
}
}
при добавлении все работает
list_add(&n, hInternet);
поиск отдельно тоже работает — list_search(&n, hConnect)
но если сделать удаление, то все крашится.
list_remove(list_search(&n, hConnect));
никак не могу понять в чем причина.. вроде все верно :(
Здравствуйте, forston, Вы писали:
F>никак не могу понять в чем причина.. вроде все верно 
В чем причина написания велосипеда?
Почему нельзя взять стандартный list. Или на худой конец, нестандартный slist?
Здравствуйте, forston, Вы писали:
F>struct node **list_search(struct node **n, HINTERNET hInternetConnect) {
зачем ** в сигнатуре? достаточно node* list_search(node* n)
skipped
F>F>void list_remove(struct node **p) {
F> if (*p != NULL) {
F> struct node *n = *p;
F> *p = (*p)->next;
F> free(n);
F> }
F>}
F>
неверный алгоритм работы remove(node* p).
шаг 1: найти ноду перед p (такую что n->next == p)
шаг 2: n->next = p->next; // иначе получится "несвязный список"
шаг 3: free(p);
а вообще причина в неоправданном велосипедостроении.