Я не совсем уверен, что должен делать ваш deleteNumber
, но следующая версия освобождает все элементы списка, соответствующие номеру, возвращая указатель на первый элемент оставшегося списка (или NULL
если список теперь пуст).
#include <stdlib.h>
typedef struct node_t { int val; struct node_t *next; } node;
node* deleteNumber(node* start, int i) {
node* n = start;
node* p = NULL;
node* t;
while (n) {
t = n;
n = n->next;
if (t->val == i) {
if (p)
p->next = n;
else
start = n;
free(t);
} else {
p = t;
}
}
return start;
}
Вот некоторые дополнительные функции для тестирования выше:
#include <stdio.h>
/* append number to list, returning start of list */
node* addNumber(node* start, int i) {
node* t;
t = malloc(sizeof(*t));
if (t == NULL)
return start;
t->next = NULL;
t->val = i;
if (start) {
node* p = start;
while (p->next)
p = p->next;
p->next = t;
} else {
start = t;
}
return start;
}
/* print elements of list */
void printList(node* list) {
while (list) {
printf(" %d", list->val);
list = list->next;
}
}
/* free whole list */
void deleteList(node* list) {
node* t;
while (list) {
t = list;
list = list->next;
free(t);
}
}
int main(void) {
const int test[] = { 2, 3, 4, 2, 5 };
node* start = NULL;
int i;
/* construct a list */
for (i = 0; i < sizeof(test) / sizeof(test[0]); i++)
start = addNumber(start, test[i]);
/* report initial list contents */
printf("Before:");
printList(start);
printf("\n");
/* delete a number from the list */
start = deleteNumber(start, 2);
/* report updated list contents */
printf("After:");
printList(start);
printf("\n");
/* delete remaining elements of the list to appease Valgrind */
deleteList(start);
return 0;
}
В вышеуказанном коде не должно быть ошибок Valgrind.