Can you please point out any problems with this C forward list with remove node functionality?
I believe this can be way simpler ( removeNode
function ) but I somehow cannot grasp it
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
struct node
{
int val;
struct node* next;
};
typedef struct node node;
node* newNode(int val)
{
node* n = (node*)malloc(sizeof(node));
n->val = val;
n->next = NULL;
return n;
}
void printList(node* head)
{
if (head == NULL) return;
do
{
printf("%d, ", head->val);
head = head->next;
} while (head->next);
printf("\n");
}
void clean(node* head)
{
while (head)
{
node* curr = head;
if (head->next == NULL)
{
free(head);
return;
}
head = head->next;
free(curr);
}
}
void insert(node* head, int val)
{
while (head)
{
if (head->next)
{
head = head->next;
}
else
{
head->next = newNode(val);
return;
}
}
}
void removeIf(node** head, int val)
{
if (head == NULL) return;
if (*head == NULL)
{
head = NULL;
return;
}
while (*head && (*head)->val == val)
{
if ((*head)->next == NULL)
{
free(*head);
*head = NULL;
return;
}
node* tofree = *head;
*head = (*head)->next;
free(tofree);
}
node* curr = (*head)->next;
node* prev = *head;
while (curr)
{
if (curr->next == NULL) return;
if (curr->val == val)
{
prev->next = curr->next;
node* tofree = curr;
curr = curr->next;
free(tofree);
}
else
{
prev = prev->next;
curr = curr->next;
}
}
}
int size(node* root)
{
if (root == NULL) return 0;
int sz = 1;
while (root->next)
{
root = root->next;
++sz;
}
return sz;
}
void tests();
int main()
{
tests();
}
/*
* Here are the tests for lists functionalities
*/
void tests()
{
{
node* root = newNode(1);
insert(root, 2);
assert(size(root) == 2);
clean(root);
}
{
node* root = newNode(8);
insert(root, 2);
insert(root, 2);
assert(size(root) == 3);
clean(root);
}
{
node* root = newNode(8);
insert(root, 123);
insert(root, 123);
insert(root, 123);
insert(root, 123);
assert(size(root) == 5);
clean(root);
}
{
node* root = newNode(8);
insert(root, 123);
assert(size(root) == 2);
removeIf(&root, 1);
assert(size(root) == 2);
clean(root);
}
{
node* root = newNode(1);
insert(root, 1);
insert(root, 1);
insert(root, 1);
insert(root, 2);
insert(root, 3);
insert(root, 3);
insert(root, 4);
insert(root, 4);
insert(root, 5);
assert(size(root) == 10);
removeIf(&root, 1);
assert(size(root) == 6);
clean(root);
}
{
node* root = newNode(1);
insert(root, 1);
insert(root, 1);
insert(root, 1);
insert(root, 2);
insert(root, 3);
insert(root, 3);
insert(root, 4);
insert(root, 4);
insert(root, 5);
assert(size(root) == 10);
removeIf(&root, 3);
assert(size(root) == 8);
clean(root);
}
{
node* root = newNode(1);
insert(root, 1);
assert(size(root) == 2);
removeIf(&root, 1);
assert(size(root) == 0);
clean(root);
}
{
node* root = newNode(1);
insert(root, 1);
insert(root, 1);
insert(root, 1);
assert(size(root) == 4);
removeIf(&root, 1);
assert(size(root) == 0);
clean(root);
}
}