Implement a doubly linked list and perform various operations to understand its properties and applications in C
// C program to implement all functions
// used in Doubly Linked List
#include <stdio.h>
#include <stdlib.h>
int i = 0;
// Node for Doubly Linked List
typedef struct node {
int key;
struct node* prev;
struct node* next;
} node;
// Head, Tail, first & temp Node
node* head = NULL;
node* first = NULL;
node* temp = NULL;
node* tail = NULL;
// Function to add a node in the
// Doubly Linked List
void addnode(int k)
{
// Allocating memory
// to the Node ptr
node* ptr
= (node*)malloc(sizeof(node));
// Assign Key to value k
ptr->key = k;
// Next and prev pointer to NULL
ptr->next = NULL;
ptr->prev = NULL;
// If Linked List is empty
if (head == NULL) {
head = ptr;
first = head;
tail = head;
}
// Else insert at the end of the
// Linked List
else {
temp = ptr;
first->next = temp;
temp->prev = first;
first = temp;
tail = temp;
}
// Increment for number of Nodes
// in the Doubly Linked List
i++;
}
// Function to traverse the Doubly
// Linked List
void traverse()
{
// Nodes points towards head node
node* ptr = head;
// While pointer is not NULL,
// traverse and print the node
while (ptr != NULL) {
// Print key of the node
printf("%d ", ptr->key);
ptr = ptr->next;
}
printf("\n");
}
// Function to insert a node at the
// beginning of the linked list
void insertatbegin(int k)
{
// Allocating memory
// to the Node ptr
node* ptr
= (node*)malloc(sizeof(node));
// Assign Key to value k
ptr->key = k;
// Next and prev pointer to NULL
ptr->next = NULL;
ptr->prev = NULL;
// If head is NULL
if (head == NULL) {
first = ptr;
first = head;
tail = head;
}
// Else insert at beginning and
// change the head to current node
else {
temp = ptr;
temp->next = head;
head->prev = temp;
head = temp;
}
i++;
}
// Function to insert Node at end
void insertatend(int k)
{
// Allocating memory
// to the Node ptr
node* ptr
= (node*)malloc(sizeof(node));
// Assign Key to value k
ptr->key = k;
// Next and prev pointer to NULL
ptr->next = NULL;
ptr->prev = NULL;
// If head is NULL
if (head == NULL) {
first = ptr;
first = head;
tail = head;
}
// Else insert at the end
else {
temp = ptr;
temp->prev = tail;
tail->next = temp;
tail = temp;
}
i++;
}
// Function to insert Node at any
// position pos
void insertatpos(int k, int pos)
{
// For Invalid Position
if (pos < 1 || pos > i + 1) {
printf("Please enter a"
" valid position\n");
}
// If position is at the front,
// then call insertatbegin()
else if (pos == 1) {
insertatbegin(k);
}
// Position is at length of Linked
// list + 1, then insert at the end
else if (pos == i + 1) {
insertatend(k);
}
// Else traverse till position pos
// and insert the Node
else {
node* src = head;
// Move head pointer to pos
while (pos--) {
src = src->next;
}
// Allocate memory to new Node
node **da, **ba;
node* ptr
= (node*)malloc(
sizeof(node));
ptr->next = NULL;
ptr->prev = NULL;
ptr->key = k;
// Change the previous and next
// pointer of the nodes inserted
// with previous and next node
ba = &src;
da = &(src->prev);
ptr->next = (*ba);
ptr->prev = (*da);
(*da)->next = ptr;
(*ba)->prev = ptr;
i++;
}
}
// Function to delete node at the
// beginning of the list
void delatbegin()
{
// Move head to next and
// decrease length by 1
head = head->next;
i--;
}
// Function to delete at the end
// of the list
void delatend()
{
// Mode tail to the prev and
// decrease length by 1
tail = tail->prev;
tail->next = NULL;
i--;
}
// Function to delete the node at
// a given position pos
void delatpos(int pos)
{
// If invalid position
if (pos < 1 || pos > i + 1) {
printf("Please enter a"
" valid position\n");
}
// If position is 1, then
// call delatbegin()
else if (pos == 1) {
delatbegin();
}
// If position is at the end, then
// call delatend()
else if (pos == i) {
delatend();
}
// Else traverse till pos, and
// delete the node at pos
else {
// Src node to find which
// node to be deleted
node* src = head;
pos--;
// Traverse node till pos
while (pos--) {
src = src->next;
}
// previous and after node
// of the src node
node **pre, **aft;
pre = &(src->prev);
aft = &(src->next);
// Change the next and prev
// pointer of pre and aft node
(*pre)->next = (*aft);
(*aft)->prev = (*pre);
// Decrease the length of the
// Linked List
i--;
}
}
// Driver Code
int main()
{
// Adding node to the linked List
addnode(2);
addnode(4);
addnode(9);
addnode(1);
addnode(21);
addnode(22);
// To print the linked List
printf("Linked List: ");
traverse();
printf("\n");
// To insert node at the beginning
insertatbegin(1);
printf("Linked List after"
" inserting 1 "
"at beginning: ");
traverse();
// To insert at the end
insertatend(0);
printf("Linked List after "
"inserting 0 at end: ");
traverse();
// To insert Node with
// value 44 after 3rd Node
insertatpos(44, 3);
printf("Linked List after "
"inserting 44 "
"after 3rd Node: ");
traverse();
printf("\n");
// To delete node at the beginning
delatbegin();
printf("Linked List after "
"deleting node "
"at beginning: ");
traverse();
// To delete at the end
delatend();
printf("Linked List after "
"deleting node at end: ");
traverse();
// To delete Node at position 5
printf("Linked List after "
"deleting node "
"at position 5: ");
delatpos(5);
traverse();
return 0;
}
Output:
Comments
Post a Comment