mirror of
https://github.moeyy.xyz/https://github.com/TheAlgorithms/C.git
synced 2023-10-11 15:56:24 +08:00
Created doubly-linked-list
This commit is contained in:
parent
e5dad3fa8d
commit
3c2538880d
237
doubly-linked-list
Normal file
237
doubly-linked-list
Normal file
@ -0,0 +1,237 @@
|
||||
/* Implementation of doubly linked list */
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
struct node {
|
||||
struct node *prev;
|
||||
struct node *next;
|
||||
int data;
|
||||
};
|
||||
|
||||
struct node *head;
|
||||
|
||||
void insertion_beginning();
|
||||
void insertion_last();
|
||||
void insertion_specified();
|
||||
void deletion_beginning();
|
||||
void deletion_last();
|
||||
void deletion_specified();
|
||||
void display();
|
||||
void search();
|
||||
|
||||
void main() {
|
||||
int choice = 0;
|
||||
while (choice != 9) {
|
||||
printf("\n*********Main Menu*********\n");
|
||||
printf("\nChoose one option from the following list ...\n");
|
||||
printf("\n===============================================\n");
|
||||
printf("\n1.Insert in beginning\n2.Insert at last\n3.Insert at any random location\n4.Delete from Beginning\n5.Delete from last\n6.Delete the node after the given data\n7.Search\n8.Show\n9.Exit\n");
|
||||
printf("\nEnter your choice?\n");
|
||||
scanf("\n%d", &choice);
|
||||
switch (choice) {
|
||||
case 1:
|
||||
insertion_beginning();
|
||||
break;
|
||||
case 2:
|
||||
insertion_last();
|
||||
break;
|
||||
case 3:
|
||||
insertion_specified();
|
||||
break;
|
||||
case 4:
|
||||
deletion_beginning();
|
||||
break;
|
||||
case 5:
|
||||
deletion_last();
|
||||
break;
|
||||
case 6:
|
||||
deletion_specified();
|
||||
break;
|
||||
case 7:
|
||||
search();
|
||||
break;
|
||||
case 8:
|
||||
display();
|
||||
break;
|
||||
case 9:
|
||||
exit(0);
|
||||
break;
|
||||
default:
|
||||
printf("Please enter valid choice..");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void insertion_beginning() {
|
||||
struct node *ptr;
|
||||
int item;
|
||||
ptr = (struct node *)malloc(sizeof(struct node));
|
||||
if (ptr == NULL) {
|
||||
printf("\nOVERFLOW");
|
||||
} else {
|
||||
printf("\nEnter Item value");
|
||||
scanf("%d", &item);
|
||||
|
||||
if (head == NULL) {
|
||||
ptr->next = NULL;
|
||||
ptr->prev = NULL;
|
||||
ptr->data = item;
|
||||
head = ptr;
|
||||
} else {
|
||||
ptr->data = item;
|
||||
ptr->prev = NULL;
|
||||
ptr->next = head;
|
||||
head->prev = ptr;
|
||||
head = ptr;
|
||||
}
|
||||
printf("\nNode inserted\n");
|
||||
}
|
||||
}
|
||||
|
||||
void insertion_last() {
|
||||
struct node *ptr, *temp;
|
||||
int item;
|
||||
ptr = (struct node *)malloc(sizeof(struct node));
|
||||
if (ptr == NULL) {
|
||||
printf("\nOVERFLOW");
|
||||
} else {
|
||||
printf("\nEnter value");
|
||||
scanf("%d", &item);
|
||||
ptr->data = item;
|
||||
if (head == NULL) {
|
||||
ptr->next = NULL;
|
||||
ptr->prev = NULL;
|
||||
head = ptr;
|
||||
} else {
|
||||
temp = head;
|
||||
while (temp->next != NULL) {
|
||||
temp = temp->next;
|
||||
}
|
||||
temp->next = ptr;
|
||||
ptr->prev = temp;
|
||||
ptr->next = NULL;
|
||||
}
|
||||
printf("\nnode inserted\n");
|
||||
}
|
||||
}
|
||||
|
||||
void insertion_specified() {
|
||||
struct node *ptr, *temp;
|
||||
int item, loc, i;
|
||||
ptr = (struct node *)malloc(sizeof(struct node));
|
||||
if (ptr == NULL) {
|
||||
printf("\n OVERFLOW");
|
||||
} else {
|
||||
temp = head;
|
||||
printf("Enter the location");
|
||||
scanf("%d", &loc);
|
||||
for (i = 0; i < loc; i++) {
|
||||
temp = temp->next;
|
||||
if (temp == NULL) {
|
||||
printf("\n There are less than %d elements", loc);
|
||||
return;
|
||||
}
|
||||
}
|
||||
printf("Enter value");
|
||||
scanf("%d", &item);
|
||||
ptr->data = item;
|
||||
ptr->next = temp->next;
|
||||
ptr->prev = temp;
|
||||
temp->next = ptr;
|
||||
temp->next->prev = ptr;
|
||||
printf("\nnode inserted\n");
|
||||
}
|
||||
}
|
||||
|
||||
void deletion_beginning() {
|
||||
struct node *ptr;
|
||||
if (head == NULL) {
|
||||
printf("\n UNDERFLOW");
|
||||
} else if (head->next == NULL) {
|
||||
head = NULL;
|
||||
free(head);
|
||||
printf("\nnode deleted\n");
|
||||
} else {
|
||||
ptr = head;
|
||||
head = head->next;
|
||||
head->prev = NULL;
|
||||
free(ptr);
|
||||
printf("\nnode deleted\n");
|
||||
}
|
||||
}
|
||||
|
||||
void deletion_last() {
|
||||
struct node *ptr;
|
||||
if (head == NULL) {
|
||||
printf("\n UNDERFLOW");
|
||||
} else if (head->next == NULL) {
|
||||
head = NULL;
|
||||
free(head);
|
||||
printf("\nnode deleted\n");
|
||||
} else {
|
||||
ptr = head;
|
||||
if (ptr->next != NULL) {
|
||||
ptr = ptr->next;
|
||||
}
|
||||
ptr->prev->next = NULL;
|
||||
free(ptr);
|
||||
printf("\nnode deleted\n");
|
||||
}
|
||||
}
|
||||
|
||||
void deletion_specified() {
|
||||
struct node *ptr, *temp;
|
||||
int val;
|
||||
printf("\n Enter the data after which the node is to be deleted : ");
|
||||
scanf("%d", &val);
|
||||
ptr = head;
|
||||
while (ptr->data != val)
|
||||
ptr = ptr->next;
|
||||
if (ptr->next == NULL) {
|
||||
printf("\nCan't delete\n");
|
||||
} else if (ptr->next->next == NULL) {
|
||||
ptr->next = NULL;
|
||||
} else {
|
||||
temp = ptr->next;
|
||||
ptr->next = temp->next;
|
||||
temp->next->prev = ptr;
|
||||
free(temp);
|
||||
printf("\nnode deleted\n");
|
||||
}
|
||||
}
|
||||
|
||||
void display() {
|
||||
struct node *ptr;
|
||||
printf("\n printing values...\n");
|
||||
ptr = head;
|
||||
while (ptr != NULL) {
|
||||
printf("%d\n", ptr->data);
|
||||
ptr = ptr->next;
|
||||
}
|
||||
}
|
||||
|
||||
void search() {
|
||||
struct node *ptr;
|
||||
int item, i = 0, flag;
|
||||
ptr = head;
|
||||
if (ptr == NULL) {
|
||||
printf("\nEmpty List\n");
|
||||
} else {
|
||||
printf("\nEnter item which you want to search?\n");
|
||||
scanf("%d", &item);
|
||||
while (ptr != NULL) {
|
||||
if (ptr->data == item) {
|
||||
printf("\nitem found at location %d ", i + 1);
|
||||
flag = 0;
|
||||
break;
|
||||
} else {
|
||||
flag = 1;
|
||||
}
|
||||
i++;
|
||||
ptr = ptr->next;
|
||||
}
|
||||
if (flag == 1) {
|
||||
printf("\nItem not found\n");
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user