Skip to main content

Move vowels node at the beginning of linked list in c

C program for Move vowels node at the beginning of linked list. Here more information.

// Include header file
#include <stdio.h>
#include <stdlib.h>
/*
  C program for
  Shift the vowels node at beginning of linked list
*/
// Linked list node
typedef struct LinkNode
{
	// Define useful field of LinkNode
	char data;
	struct LinkNode * next;
}LinkNode;

LinkNode * getLinkNode(char data)
{
	// Create dynamic memory of LinkNode
	LinkNode * ref = (LinkNode * ) malloc(sizeof(LinkNode));
	if (ref == NULL)
	{
		// Failed to create memory 
		return NULL;
	}
	ref->data = data;
	ref->next = NULL;
	return ref;
}

typedef struct SingleLL
{
	// Define useful field of SingleLL
	struct LinkNode * head;
	struct LinkNode * tail;
}SingleLL;

SingleLL * getSingleLL()
{
	// Create dynamic memory of SingleLL
	SingleLL * ref = (SingleLL * ) malloc(sizeof(SingleLL));
	if (ref == NULL)
	{
		// Failed to create memory 
		return NULL;
	}
	ref->head = NULL;
	ref->tail = NULL;
	return ref;
}

// Add new node at end of linked list 
void addNode(SingleLL * ref, char data)
{
	LinkNode * node = getLinkNode(data);
	if (ref->head == NULL)
	{
		ref->head = node;
	}
	else
	{
		// Append the node at last position
		ref->tail->next = node;
	}
	ref->tail = node;
}
// Display linked list element
void display(SingleLL * ref)
{
	if (ref->head == NULL)
	{
		printf("\n Empty linked list");
		return;
	}
	LinkNode * temp = ref->head;
	// iterating linked list elements
	while (temp != NULL)
	{
		printf(" %c →", temp->data);
		// Visit to next node
		temp = temp->next;
	}
	printf(" NULL\n");
}
// Determine that given value is an vowel or not
int isVowels(char value)
{
	if (value == 'a' || value == 'e' || 
        value == 'i' || value == 'o' || 
        value == 'u' || value == 'A' || 
        value == 'E' || value == 'I' || 
        value == 'O' || value == 'U')
	{
		return 1;
	}
	return 0;
}
// Move the vowels value at beginning position
void shiftVowels(SingleLL * ref)
{
	if (ref->head == NULL)
	{
		printf("\n Empty linked list\n");
		return;
	}
	// Define some auxiliary variable
	LinkNode * node = ref->head;
	LinkNode * back = NULL;
	// iterate linked list nodes
	// And shift vowels at front of linked list
	while (node != NULL)
	{
		if (isVowels(node->data) == 1 && back != NULL)
		{
			// Enter here when
			// Node is contain vowel and 
			// its previous (any) node is not form of vowel
			if (node == ref->tail)
			{
				// When is last node
				// Set new last node
				ref->tail = back;
			}
			// Connect previous node to next node
			back->next = node->next;
			// Connect vowel node to first node
			node->next = ref->head;
			// Set new head
			ref->head = node;
			// Get back node
			node = back;
		}
		else
		{
			back = node;
		}
		// Visit to next node
		node = node->next;
	}
}
int main()
{
	SingleLL * sll = getSingleLL();
	// Constructed linked list
	addNode(sll, 'E');
	addNode(sll, 'D');
	addNode(sll, 'U');
	addNode(sll, 'C');
	addNode(sll, 'A');
	addNode(sll, 'T');
	addNode(sll, 'I');
	addNode(sll, 'O');
	addNode(sll, 'N');
	printf(" Before move vowels\n");
	// E → D → U → C → A → T → I → O → N → NULL
	display(sll);
	shiftVowels(sll);
	printf(" After move vowels\n");
	// O → I → A → U → E → D → C → T → N → NULL
	display(sll);
}

Output

 Before move vowels
 E → D → U → C → A → T → I → O → N → NULL
 After move vowels
 O → I → A → U → E → D → C → T → N → 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