Skip to main content

Delete all prime nodes from a singly linked list in c

C program for Delete all prime nodes from a singly linked list. Here problem description and explanation.

/*
    C program for
    Delete all prime nodes 
*/
#include <stdio.h>
#include <stdlib.h>

// Linked List LinkNode
struct LinkNode
{
	int data;
	struct LinkNode *next;
};
// Singly linked list 
struct SingleLL
{
	struct LinkNode *head;
};
// Returns the new linked list
struct SingleLL *newLinkedList()
{
	// Create new linked list
	struct SingleLL *sll = (struct SingleLL *)
	malloc(sizeof(struct SingleLL));
	if (sll == NULL)
	{
		printf("Memory overflow\n");
	}
	else
	{
		sll->head = NULL;
	}
	return sll;
}
// Handles the request of adding new node at end of linked list
void addNode(struct SingleLL *sll, int data)
{
	// Create dynamic node
	struct LinkNode *node = (struct LinkNode *)
	malloc(sizeof(struct LinkNode));
	if (node == NULL)
	{
		// Handle memory overflow 
		printf("Memory overflow to Create LinkNode\n");
		return;
	}
	else
	{
		// Set initial node value
		node->data = data;
		node->next = NULL;
	}
	if (sll->head == NULL)
	{
		// First node in linked list
		sll->head = node;
	}
	else
	{
		struct LinkNode *temp = sll->head;
		// Find the last node
		while (temp != NULL && temp->next != NULL)
		{
			temp = temp->next;
		}
		// Add node at last position
		temp->next = node;
	}
}
// Display linked list element
void display(struct LinkNode *node)
{
	if (node == NULL)
	{
		return;
	}
	struct LinkNode *temp = node;
	// iterating linked list elements
	while (temp != NULL)
	{
		printf(" %d →", temp->data);
		// Visit to next node
		temp = temp->next;
	}
	printf(" NULL\n");
}
//return given value is prime or not
int check_prime(int value)
{
	if (value == 1)
	{
		return 0;
	}
	else
	{
		unsigned int flag = 1;
		for (int i = 2; i <= value / 2; i++)
		{
			// None prime number
			if (value % i == 0)
			{
				flag = 0;
				break;
			}
		}
		return flag;
	}
}
// deleted prime node in linked list
void delete_prime(struct SingleLL *sll)
{
	if (sll->head == NULL)
	{
		printf("\nEmpty linked List");
	}
	else
	{
		struct LinkNode *temp = sll->head, *hold = NULL, *prev = NULL;
		while (temp != NULL)
		{
			if (check_prime(temp->data) == 1)
			{
				//delete node found
				hold = temp;
			}
			else
			{
				prev = temp;
			}
			temp = temp->next;
			if (hold != NULL)
			{
				if (hold == sll->head)
				{
					//when delete head node
					sll->head = temp;
					free(hold);
					hold = NULL;
				}
				else
				{
					if (prev != NULL)
					{
						prev->next = temp;
					}
					free(hold);
					hold = NULL;
				}
			}
		}
	}
}
int main(int argc, char
	const *argv[])
{
	struct SingleLL *sll = newLinkedList();
	// Linked list
	// 7 → 1 → 8 → 2 → 4 → 23 → 37 → NULL
	addNode(sll, 7);
	addNode(sll, 1);
	addNode(sll, 8);
	addNode(sll, 2);
	addNode(sll, 4);
	addNode(sll, 23);
	addNode(sll, 37);

	printf(" Before Delete prime nodes \n");
	display(sll->head);
	delete_prime(sll);
	printf(" After Delete prime nodes \n");
	display(sll->head);
	return 0;
}

Output

 Before Delete prime nodes
 7 → 1 → 8 → 2 → 4 → 23 → 37 → NULL
 After Delete prime nodes
 1 → 8 → 4 → NULL




Comment

Please share your knowledge to improve code and content standard. Also submit your doubts, and test case. We improve by your feedback. We will try to resolve your query as soon as possible.

New Comment