Untitled
unknown
plain_text
4 years ago
10 kB
4
Indexable
#include <stdio.h>
#include <stdlib.h>
struct Node{
int data;
struct Node* next;
};
typedef struct Node Node;
Node *takeInput();
void printLL(Node *head);
Node *insertElement(Node *head);
Node *insertAtEnd(Node *head, int value);
Node *insertAtBeginning(Node *head, int value);
Node *insertBeforeGivenElement(Node *head, int value, int elem);
Node *insertAfterGivenElement(Node* head, int value, int elem);
Node *deleteElement(Node *head);
Node *deleteFirst(Node *head);
Node *deleteLast(Node *head);
Node *deleteGivenElement(Node *head, int value);
int searchElement(Node *head, int value);
int sizeofLL(Node *head);
int main()
{
Node *head = takeInput();
int opt;
do
{
printf("\tMain Menu \n");
printf("1. Insert an element \n2. Delete an element \n3. Search for an element \n4. Count total number of nodes \n5. Print Linked List \n6. '0' for exit \n");
printf("Enter your choice: ");
fflush(stdin);
scanf("%d", &opt);
int flag, value;
int Size = 0;
switch (opt)
{
case 1:
head = insertElement(head);
break;
case 2:
head = deleteElement(head);
break;
case 3:
printf("Enter the target value: ");
fflush(stdin);
scanf("%d", &value);
flag = searchElement(head, value);
if (flag == 1)
printf("Element found. \n");
else
printf("Element not found. \n");
break;
case 4:
Size = sizeofLL(head);
printf("Size of Linked List is: %d \n", Size);
break;
case 5:
printLL(head);
break;
}
} while (opt != 0);
return 0;
}
Node* takeInput()
{
Node *head, *tail;
head = tail = NULL;
char opt;
do
{
printf("Do you want to add data: \n");
fflush(stdin);
scanf("%c", &opt);
if(opt == 'y')
{
int data;
printf("Enter data: ");
scanf("%d", &data);
Node* newNode = (Node*)malloc(sizeof(Node));
newNode -> data = data;
newNode -> next = head;
if(head == NULL)
{
head = newNode;
tail = newNode;
}
else
{
tail -> next = newNode;
tail = tail -> next;
}
}
}while(opt != 'n');
return head;
}
void printLL(Node* head)
{
if(head == NULL)
{
printf("Linked List is empty \n");
}
else
{
printf("Linked List is: ");
Node* temp = head;
do
{
printf("%d ", temp -> data);
temp = temp -> next;
}while(temp != head);
printf("\n");
}
}
Node *insertElement(Node *head)
{
int opt;
printf("\n");
printf("\tInsert Menu: \n");
printf("1. Insert at beginning \n2. Insert at end \n3. Insert before a given element \n4. Insert after a given element \n");
printf("Enter your choice: ");
scanf("%d", &opt);
switch (opt)
{
int value, elem;
case 1:
printf("Enter value to insert: ");
fflush(stdin);
scanf("%d", &value);
printf("Before Insertion: \n");
printLL(head);
head = insertAtBeginning(head, value);
printf("After Insertion: \n");
printLL(head);
printf("\n");
break;
case 2:
printf("Enter value to insert: ");
fflush(stdin);
scanf("%d", &value);
printf("Before Insertion: \n");
printLL(head);
head = insertAtEnd(head, value);
printf("After Insertion: \n");
printLL(head);
printf("\n");
break;
case 3:
printf("Enter value to insert: ");
fflush(stdin);
scanf("%d", &value);
printf("Enter the element before insert: ");
fflush(stdin);
scanf("%d", &elem);
printf("Before Insertion: \n");
printLL(head);
head = insertBeforeGivenElement(head, value, elem);
printf("After Insertion: \n");
printLL(head);
printf("\n");
break;
case 4:
printf("Enter value to insert: ");
fflush(stdin);
scanf("%d", &value);
printf("Enter the element after insert: ");
fflush(stdin);
scanf("%d", &elem);
printf("Before Insertion: \n");
printLL(head);
head = insertAfterGivenElement(head, value, elem);
printf("After Insertion: \n");
printLL(head);
printf("\n");
break;
}
return head;
}
Node* insertAtBeginning(Node* head, int value)
{
Node* newNode = (Node*)malloc(sizeof(Node));
newNode -> data = value;
newNode -> next = head;
if(head == NULL)
{
newNode -> data = value;
head = newNode;
newNode -> next = head;
}
else
{
Node* temp = head;
while(temp -> next != head)
{
temp = temp -> next;
}
head = newNode;
temp -> next = head;
}
return head;
}
Node* insertAtEnd(Node* head, int value)
{
Node* newNode = (Node*)malloc(sizeof(Node));
newNode -> data = value;
newNode -> next = head;
if(head == NULL)
{
newNode -> data = value;
head = newNode;
newNode -> next = head;
}
else
{
Node* temp = head;
while(temp -> next != head)
{
temp = temp -> next;
}
temp -> next = newNode;
newNode -> next = head;
}
return head;
}
Node *insertBeforeGivenElement(Node *head, int value, int elem)
{
if (head == NULL)
{
printf("Linked List is empty \n");
return head;
}
if(head -> data == elem)
{
head = insertAtBeginning(head, value);
return head;
}
Node *temp, *ptr;
temp = head -> next;
ptr = head;
while(temp -> next != head && temp -> data != elem)
{
temp = temp -> next;
ptr = ptr -> next;
}
if(temp -> data != elem)
{
printf("Target element not found \n");
return head;
}
Node* newNode = (Node*)malloc(sizeof(Node));
newNode -> data = value;
newNode -> next = head;
ptr -> next = newNode;
newNode -> next = temp;
return head;
}
Node* insertAfterGivenElement(Node* head, int value, int elem)
{
if(head == NULL)
{
printf("LinkedList is empty \n");
return head;
}
Node* temp = head;
while(temp -> next != head && temp -> data != elem)
{
temp = temp -> next;
}
if(temp -> data == elem)
{
Node* newNode = (Node*)malloc(sizeof(Node));
newNode -> data = value;
newNode -> next = temp -> next;
temp -> next = newNode;
}
if(temp -> data != elem)
{
printf("Target Element not found \n");
return head;
}
return head;
}
Node *deleteElement(Node *head)
{
printf("\n");
printf("\tDelete Menu \n");
printf("1. Delete the first element \n2. Delete the last element \n3. Delete a given element \n");
int opt;
printf("Enter choice: ");
scanf("%d", &opt);
switch (opt)
{
case 1:
printf("Before Deletion: \n");
printLL(head);
head = deleteFirst(head);
printf("After Deletion: \n");
printLL(head);
break;
case 2:
printf("Before Deletion: \n");
printLL(head);
head = deleteLast(head);
printf("After Deletion: \n");
printLL(head);
break;
case 3:
printf("Enter element: ");
int elem;
fflush(stdin);
scanf("%d", &elem);
printf("Before Deletion: \n");
printLL(head);
head = deleteGivenElement(head, elem);
printf("After Deletion: \n");
printLL(head);
break;
}
return head;
}
Node* deleteFirst(Node* head)
{
if(head == NULL)
{
printf("Linked List is empty: \n");
return head;
}
Node* temp = head;
Node* ptr = head;
if(temp -> next == head)
{
free(temp);
head = NULL;
return head;
}
while(temp -> next != head)
{
temp = temp -> next;
}
head = ptr -> next;
temp -> next = head;
free(ptr);
return head;
}
Node* deleteLast(Node* head)
{
if(head == NULL)
{
printf("Linked List is empty: \n");
return head;
}
Node* temp = head -> next;
Node* ptr = head;
while(temp -> next != head)
{
temp = temp -> next;
ptr = ptr -> next;
}
ptr -> next = head;
free(temp);
return head;
}
Node* deleteGivenElement(Node* head, int elem)
{
if(head == NULL)
{
printf("Linked List is empty \n");
return head;
}
Node* temp = head;
if(temp -> data == elem)
{
head = deleteFirst(temp);
return head;
}
temp = head -> next;
Node* ptr = head;
while(temp -> next != head && temp -> data != elem)
{
temp = temp -> next;
ptr = ptr -> next;
}
if(temp -> data == elem)
{
ptr -> next = temp -> next;
free(temp);
}
if(temp -> data != elem)
{
printf("Target element not found \n");
}
return head;
}
int sizeofLL(Node* head)
{
int cnt = 0;
Node* temp = head;
do
{
cnt++;
temp = temp -> next;
}while(temp != head);
return cnt;
}
int searchElement(Node* head, int value)
{
Node* temp = head;
int flag = 0;
do
{
if(temp -> data == value)
{
flag = 1;
break;
}
temp = temp -> next;
}while(temp != head);
return flag;
}
Editor is loading...