Final RKMKC
Final RKMKC
1. Stack(2-3)
2. Queue(3-4)
3. Linked List(5-16)
4. Binary Tree Traversal(16-17)
5. B+(17-20)
6. B-(20-23)
7. AVL(23-28)
8. Splay Tree(28-31)
9. Sequential Search(31-32)
10. Binary Search(32)
11. Breadth First Search(32-34)
12. Depth First Search(34-35)
13. Insertion Sort(35-36)
14. Sequential Search(36-37)
15. shell sort(37)
16. Merge Sort(37-39)
17. Quick Sort(39-40)
18. Heap Sort(40-41)
19. Krushal’s Algo.(41-42)
20. Prim’s Algo.(42-43)
21. Selection Sort(43-44)
22. TBT(44-46)
23. Dijkstra Algo(46-47)
24. Tower of Hanoi(47-48)
25. Doubly Linked List(48-52)
26. Circular Linked List(52-58)
SB
# stack
#include <stdio.h>
#include <stdlib.h>
#define MAX 100
typedef struct {
int top;
int arr[MAX];
} Stack;
void init(Stack *s) {
s->top = -1;
}
int isEmpty(Stack *s) {
return s->top == -1;
}
int isFull(Stack *s) {
return s->top == MAX - 1;
}
void push(Stack *s, int value) {
if (isFull(s)) {
printf("Stack Overflow!\n");
return;
}
s->arr[++(s->top)] = value;
printf("Pushed %d onto stack.\n", value);
}
int pop(Stack *s) {
if (isEmpty(s)) {
printf("Stack Underflow!\n");
return -1;
}
return s->arr[(s->top)--];
}
int peek(Stack *s) {
if (isEmpty(s)) {
printf("Stack is empty!\n");
return -1;
}
return s->arr[s->top];
}
void display(Stack *s) {
if (isEmpty(s)) {
printf("Stack is empty!\n");
return;
}
printf("Stack elements: ");
for (int i = 0; i <= s->top; i++) {
printf("%d ", s->arr[i]);
}
printf("\n");
}
int main() {
Stack s;
init(&s);
push(&s, 10);
push(&s, 20);
push(&s, 30);
display(&s);
printf("Top element: %d\n", peek(&s));
printf("Popped element: %d\n", pop(&s));
display(&s);
return 0;
}
# Queue
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include "LL.c"
typedef struct Queue {
LinkedList* list;
} Queue;
Queue* createQueue() {
Queue* queue = (Queue*)malloc(sizeof(Queue));
if (queue == NULL) {
return NULL;
}
queue->list = createList();
return queue;
}
bool enqueue(Queue* queue, int data) {
if (queue == NULL) {
return false;
}
return insertAtEnd(queue->list, data);
}
int dequeue(Queue* queue) {
if (queue == NULL || isEmpty(queue->list)) {
return -1;
}
int data = queue->list->head->data;
deleteFromBeginning(queue->list);
return data;
}
int peek(Queue* queue) {
if (queue == NULL || isEmpty(queue->list)) {
return -1;
}
return queue->list->head->data;
}
bool isQueueEmpty(Queue* queue) {
return isEmpty(queue->list);
}
int main() {
Queue* queue = createQueue();
printf("--- Queue Operations ---\n");
enqueue(queue, 10);
enqueue(queue, 20);
enqueue(queue, 30);
printf("Front element: %d\n", peek(queue));
printf("Dequeued: %d\n", dequeue(queue));
printf("Front element after dequeue: %d\n", peek(queue));
printf("Is queue empty? %s\n", isQueueEmpty(queue) ? "Yes" : "No");
freeList(queue->list);
free(queue);
return 0;
}
#Linked List
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
// Node structure
typedef struct Node {
int data;
struct Node* next;
} Node;
// Function prototypes
LinkedList* createList();
void freeList(LinkedList* list);
void display(LinkedList* list);
bool isEmpty(LinkedList* list);
bool insertAtBeginning(LinkedList* list, int data);
bool insertAtEnd(LinkedList* list, int data);
bool insertAtPosition(LinkedList* list, int data, size_t position);
bool deleteFromBeginning(LinkedList* list);
bool deleteFromEnd(LinkedList* list);
bool deleteFromPosition(LinkedList* list, size_t position);
bool deleteByValue(LinkedList* list, int data);
Node* search(LinkedList* list, int data);
int countOccurrences(LinkedList* list, int data);
bool update(LinkedList* list, int oldData, int newData);
bool updateAtPosition(LinkedList* list, size_t position, int newData);
void sort(LinkedList* list);
LinkedList* merge(LinkedList* list1, LinkedList* list2);
void reverse(LinkedList* list);
printf("Inorder: ");
inorderTraversal(root);
printf("\n");
printf("Preorder: ");
preorderTraversal(root);
printf("\n");
printf("Postorder: ");
postorder(root);
printf("\n");
}
#B+
#include <stdio.h>
#include <stdlib.h>
#define MAX_KEYS 3
#define MIN_KEYS (MAX_KEYS / 2)
struct BPlusNode {
int keys[MAX_KEYS];
struct BPlusNode *children[MAX_KEYS + 1];
struct BPlusNode *next;
int num_keys;
int leaf;
};
struct BPlusNode *createNode(int leaf) {
struct BPlusNode *node = (struct BPlusNode *)malloc(sizeof(struct BPlusNode));
node->num_keys = 0;
node->leaf = leaf;
node->next = NULL;
for (int i = 0; i <= MAX_KEYS; i++) {
node->children[i] = NULL;
}
return node;
}
struct BPlusNode *findLeaf(struct BPlusNode *root, int key) {
struct BPlusNode *cur = root;
while (!cur->leaf) {
int i = 0;
while (i < cur->num_keys && key >= cur->keys[i]) {
i++;
}
cur = cur->children[i];
}
return cur;
}
void insertIntoLeaf(struct BPlusNode *leaf, int key) {
int i;
for (i = leaf->num_keys - 1; i >= 0 && leaf->keys[i] > key; i--) {
leaf->keys[i + 1] = leaf->keys[i];
}
leaf->keys[i + 1] = key;
leaf->num_keys++;
}
struct BPlusNode *insert(struct BPlusNode *root, int key) {
if (root == NULL) {
root = createNode(1);
root->keys[0] = key;
root->num_keys = 1;
return root;
}
struct BPlusNode *leaf = findLeaf(root, key);
insertIntoLeaf(leaf, key);
if (leaf->num_keys == MAX_KEYS) {
struct BPlusNode *newLeaf = createNode(1);
int mid = MAX_KEYS / 2;
for (int i = mid, j = 0; i < MAX_KEYS; i++, j++) {
newLeaf->keys[j] = leaf->keys[i];
}
newLeaf->num_keys = MAX_KEYS - mid;
leaf->num_keys = mid;
newLeaf->next = leaf->next;
leaf->next = newLeaf;
if (leaf == root) {
struct BPlusNode *newRoot = createNode(0);
newRoot->keys[0] = newLeaf->keys[0];
newRoot->children[0] = leaf;
newRoot->children[1] = newLeaf;
newRoot->num_keys = 1;
return newRoot;
}
}
return root;
}
void traverse(struct BPlusNode *root) {
if (root == NULL) {
printf("Tree is empty.\n");
return;
}
struct BPlusNode *cur = root;
while (!cur->leaf) {
cur = cur->children[0];
}
while (cur) {
for (int i = 0; i < cur->num_keys; i++) {
printf("%d ", cur->keys[i]);
}
cur = cur->next;
}
printf("\n");
}
int main() {
struct BPlusNode *root = NULL;
root = insert(root, 10);
root = insert(root, 20);
root = insert(root, 5);
root = insert(root, 6);
root = insert(root, 12);
root = insert(root, 30);
root = insert(root, 7);
root = insert(root, 17);
printf("B+ Tree traversal:\n");
traverse(root);
return 0;
}
#B-
#include <stdio.h>
#include <stdlib.h>
#define MAX_KEYS 3
#define MIN_KEYS (MAX_KEYS / 2)
#define MAX_CHILDREN (MAX_KEYS + 1)
struct BTreeNode {
int keys[MAX_KEYS];
struct BTreeNode *children[MAX_CHILDREN];
int num_keys;
int leaf;
};
struct BTreeNode *createNode(int leaf) {
struct BTreeNode *node = (struct BTreeNode *)malloc(sizeof(struct BTreeNode));
node->num_keys = 0;
node->leaf = leaf;
for (int i = 0; i <= MAX_KEYS; i++) {
node->children[i] = NULL;
}
return node;
}
void traverse(struct BTreeNode *root) {
if (root == NULL) return;
int i;
for (i = 0; i < root->num_keys; i++) {
if (!root->leaf) {
traverse(root->children[i]);
}
printf("%d ", root->keys[i]);
}
if (!root->leaf) {
traverse(root->children[i]);
}
}
struct BTreeNode *findChild(struct BTreeNode *root, int key) {
int i = 0;
while (i < root->num_keys && key > root->keys[i]) {
i++;
}
return root->children[i];
}
void splitChild(struct BTreeNode *parent, int index, struct BTreeNode *child) {
struct BTreeNode *newNode = createNode(child->leaf);
int mid = MAX_KEYS / 2;
int median = child->keys[mid];
for (int i = mid + 1, j = 0; i < MAX_KEYS; i++, j++) {
newNode->keys[j] = child->keys[i];
}
newNode->num_keys = MAX_KEYS - mid - 1;
child->num_keys = mid;
if (!child->leaf) {
for (int i = mid + 1, j = 0; i <= MAX_KEYS; i++, j++) {
newNode->children[j] = child->children[i];
}
}
for (int i = parent->num_keys; i > index; i--) {
parent->children[i + 1] = parent->children[i];
}
parent->children[index + 1] = newNode;
for (int i = parent->num_keys - 1; i >= index; i--) {
parent->keys[i + 1] = parent->keys[i];
}
parent->keys[index] = median;
parent->num_keys++;
}
void insertNonFull(struct BTreeNode *node, int key) {
int i = node->num_keys - 1;
if (node->leaf) {
while (i >= 0 && node->keys[i] > key) {
node->keys[i + 1] = node->keys[i];
i--;
}
node->keys[i + 1] = key;
node->num_keys++;
} else {
while (i >= 0 && node->keys[i] > key) {
i--;
}
i++;
if (node->children[i]->num_keys == MAX_KEYS) {
splitChild(node, i, node->children[i]);
if (key > node->keys[i]) {
i++;
}
}
insertNonFull(node->children[i], key);
}
}
struct BTreeNode *insert(struct BTreeNode *root, int key) {
if (root == NULL) {
root = createNode(1);
root->keys[0] = key;
root->num_keys = 1;
return root;
}
if (root->num_keys == MAX_KEYS) {
struct BTreeNode *newRoot = createNode(0);
newRoot->children[0] = root;
splitChild(newRoot, 0, root);
root = newRoot;
}
insertNonFull(root, key);
return root;
}
int main() {
struct BTreeNode *root = NULL;
root = insert(root, 10);
root = insert(root, 20);
root = insert(root, 5);
root = insert(root, 6);
root = insert(root, 12);
root = insert(root, 30);
root = insert(root, 7);
root = insert(root, 17);
printf("B- Tree traversal:\n");
traverse(root);
printf("\n");
return 0;
}
#AVL
#include <stdio.h>
#include <stdlib.h>
struct Node {
int data;
struct Node *left;
struct Node *right;
int height;
};
x->right = y;
y->left = T2;
return x;
}
y->left = x;
x->right = T2;
return y;
}
return node;
}
return current;
}
else {
if ((root->left == NULL) || (root->right == NULL)) {
struct Node *temp = root->left ? root->left : root->right;
if (temp == NULL) {
temp = root;
root = NULL;
} else
*root = *temp;
free(temp);
} else {
struct Node* temp = minValueNode(root->right);
root->data = temp->data;
root->right = deleteNode(root->right, temp->data);
}
}
if (root == NULL)
return root;
return root;
}
void preorder(struct Node *root) {
if (root != NULL) {
printf("%d ", root->data);
preorder(root->left);
preorder(root->right);
}
}
void inorder(struct Node *root) {
if (root != NULL) {
inorder(root->left);
printf("%d ", root->data);
inorder(root->right);
}
}
void postorder(struct Node* root){
if(root == NULL){
return;
}
postorder(root->left);
postorder(root->right);
printf("%d ",root->data);
}
int main() {
struct Node *root = NULL;
root = insert(root, 4);
root = insert(root, 5);
root = insert(root, 6);
root = insert(root, 7);
root = insert(root, 8);
root = insert(root, 9);
return 0;
}
#Splay Tree
#include <stdio.h>
#include <stdlib.h>
struct SplayNode {
int data;
struct SplayNode *left, *right;
};
struct SplayNode* createNode(int data) {
struct SplayNode* node = (struct SplayNode*)malloc(sizeof(struct SplayNode));
node->data = data;
node->left = node->right = NULL;
return node;
}
struct SplayNode* rightRotate(struct SplayNode* x) {
struct SplayNode* y = x->left;
x->left = y->right;
y->right = x;
return y;
}
struct SplayNode* leftRotate(struct SplayNode* x) {
struct SplayNode* y = x->right;
x->right = y->left;
y->left = x;
return y;
}
struct SplayNode* splay(struct SplayNode* root, int key) {
if (root == NULL || root->data == key)
return root;
if (key < root->data) {
if (root->left == NULL)
return root;
if (key < root->left->data) {
root->left->left = splay(root->left->left, key);
root = rightRotate(root);
}
else if (key > root->left->data) {
root->left->right = splay(root->left->right, key);
if (root->left->right != NULL)
root->left = leftRotate(root->left);
}
return (root->left == NULL) ? root : rightRotate(root);
}
else {
if (root->right == NULL)
return root;
if (key < root->right->data) {
root->right->left = splay(root->right->left, key);
if (root->right->left != NULL)
root->right = rightRotate(root->right);
}
else if (key > root->right->data) {
root->right->right = splay(root->right->right, key);
root = leftRotate(root);
}
return (root->right == NULL) ? root : leftRotate(root);
}
}
struct SplayNode* insert(struct SplayNode* root, int key) {
if (root == NULL)
return createNode(key);
if (root->data == key)
return root;
return 0;
}
#Sequential search
#include <stdio.h>
int sequentialSearch(int arr[], int size, int key) {
for (int i = 0; i < size; i++) {
if (arr[i] == key) {
return i;
}
}
return -1;
}
int main() {
int arr[] = {10, 20, 30, 40, 50};
int size = sizeof(arr) / sizeof(arr[0]);
int key;
printf("Enter the element to search: ");
scanf("%d", &key);
int result = sequentialSearch(arr, size, key);
if (result != -1) {
printf("Element found at index %d\n", result);
} else {
printf("Element not found\n");
}
return 0;
}
#Binary Search
#include <stdio.h>
int binarySearch(int arr[], int left, int right, int key) {
while (left <= right) {
int mid = left + (right - left) / 2;
if (arr[mid] == key)
return mid;
if (arr[mid] < key)
left = mid + 1;
else
right = mid - 1;
}
return -1;
}
int main() {
int arr[] = {10, 20, 30, 40, 50};
int size = sizeof(arr) / sizeof(arr[0]);
int key;
printf("Enter the element to search: ");
scanf("%d", &key);
int result = binarySearch(arr, 0, size - 1, key);
if (result != -1) {
printf("Element found at index %d\n", result);
} else {
printf("Element not found\n");
}
return 0;
}
#Breadth First Search
#include <stdio.h>
#include <stdlib.h>
#define MAX 100
typedef struct {
int items[MAX];
int front, rear;
} Queue;
void initQueue(Queue *q) {
q->front = -1;
q->rear = -1;
}
int isEmpty(Queue *q) {
return q->front == -1;
}
void enqueue(Queue *q, int value) {
if (q->rear == MAX - 1) {
printf("Queue is full!\n");
return;
}
if (q->front == -1) q->front = 0;
q->items[++(q->rear)] = value;
}
int dequeue(Queue *q) {
if (isEmpty(q)) {
printf("Queue is empty!\n");
return -1;
}
int item = q->items[q->front];
if (q->front >= q->rear) {
q->front = -1;
q->rear = -1;
} else {
q->front++;
}
return item;
}
void BFS(int graph[MAX][MAX], int startVertex, int vertices) {
int visited[MAX] = {0};
Queue q;
initQueue(&q);
printf("BFS Traversal: ");
visited[startVertex] = 1;
enqueue(&q, startVertex);
while (!isEmpty(&q)) {
int currentVertex = dequeue(&q);
printf("%d ", currentVertex);
for (int i = 0; i < vertices; i++) {
if (graph[currentVertex][i] == 1 && !visited[i]) {
visited[i] = 1;
enqueue(&q, i);
}
}
}
printf("\n");
}
int main() {
int vertices = 5;
int graph[MAX][MAX] = {
{0, 1, 1, 0, 0},
{1, 0, 0, 1, 1},
{1, 0, 0, 1, 0},
{0, 1, 1, 0, 1},
{0, 1, 0, 1, 0}
};
int startVertex;
printf("Enter the starting vertex: ");
scanf("%d", &startVertex);
BFS(graph, startVertex, vertices);
return 0;
}
# Depth First Search
#include <stdio.h>
#define MAX 100
void DFS(int graph[MAX][MAX], int vertex, int visited[], int vertices) {
printf("%d ", vertex);
visited[vertex] = 1;
for (int i = 0; i < vertices; i++) {
if (graph[vertex][i] == 1 && !visited[i]) {
DFS(graph, i, visited, vertices);
}
}
}
int main() {
int vertices = 5;
int graph[MAX][MAX] = {
{0, 1, 1, 0, 0},
{1, 0, 0, 1, 1},
{1, 0, 0, 1, 0},
{0, 1, 1, 0, 1},
{0, 1, 0, 1, 0}
};
int visited[MAX] = {0};
int startVertex;
printf("Enter the starting vertex: ");
scanf("%d", &startVertex);
printf("DFS Traversal: ");
DFS(graph, startVertex, visited, vertices);
printf("\n");
return 0;
}
#Insertion Sort
#include <stdio.h>
void insertionSort(int arr[], int size) {
for (int i = 1; i < size; i++) {
int key = arr[i];
int j = i - 1;
while (j >= 0 && arr[j] > key) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = key;
}
}
void printArray(int arr[], int size) {
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
int main() {
int arr[] = {64, 25, 12, 22, 11};
int size = sizeof(arr) / sizeof(arr[0]);
printf("Original array: ");
printArray(arr, size);
insertionSort(arr, size);
printf("Sorted array: ");
printArray(arr, size);
return 0;
}
#Selection Sort
#include <stdio.h>
void selectionSort(int arr[], int n) {
int i, j, minIndex, temp;
for (i = 0; i < n - 1; i++) {
minIndex = i;
for (j = i + 1; j < n; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j;
}
}
if (minIndex != i) {
temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
}
}
void printArray(int arr[], int n) {
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
int main() {
int arr[] = {64, 25, 12, 22, 11};
int n = sizeof(arr) / sizeof(arr[0]);
printf("Original array: ");
printArray(arr, n);
selectionSort(arr, n);
printf("Sorted array: ");
printArray(arr, n);
return 0;
}
#Shell Sort
#include <stdio.h>
void shellSort(int arr[], int n) {
for (int gap = n / 2; gap > 0; gap /= 2) {
for (int i = gap; i < n; i++) {
int temp = arr[i];
int j;
for (j = i; j >= gap && arr[j - gap] > temp; j -= gap) {
arr[j] = arr[j - gap];
}
arr[j] = temp;
}
}
}
void printArray(int arr[], int n) {
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
int main() {
int arr[] = {12, 34, 54, 2, 3};
int n = sizeof(arr) / sizeof(arr[0]);
printf("Original array: ");
printArray(arr, n);
shellSort(arr, n);
printf("Sorted array: ");
printArray(arr, n);
return 0;
}
# Merge Sort
#include <stdio.h>
void merge(int arr[], int left, int mid, int right) {
int n1 = mid - left + 1;
int n2 = right - mid;
int L[n1], R[n2];
for (int i = 0; i < n1; i++)
L[i] = arr[left + i];
for (int j = 0; j < n2; j++)
R[j] = arr[mid + 1 + j];
int i = 0, j = 0, k = left;
while (i < n1 && j < n2) {
if (L[i] <= R[j]) {
arr[k] = L[i];
i++;
} else {
arr[k] = R[j];
j++;
}
k++;
}
while (i < n1) {
arr[k] = L[i];
i++;
k++;
}
while (j < n2) {
arr[k] = R[j];
j++;
k++;
}
}
void mergeSort(int arr[], int left, int right) {
if (left < right) {
int mid = left + (right - left) / 2;
mergeSort(arr, left, mid);
mergeSort(arr, mid + 1, right);
merge(arr, left, mid, right);
}
}
void printArray(int arr[], int size) {
for (int i = 0; i < size; i++)
printf("%d ", arr[i]);
printf("\n");
}
int main() {
int arr[] = {12, 11, 13, 5, 6, 7};
int n = sizeof(arr) / sizeof(arr[0]);
printf("Original array: ");
printArray(arr, n);
mergeSort(arr, 0, n - 1);
printf("Sorted array: ");
printArray(arr, n);
return 0;
}
#Quick Sort
#include <stdio.h>
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
int partition(int arr[], int low, int high) {
int pivot = arr[high];
int i = low - 1;
return root;
}
struct TBTNode* leftmost(struct TBTNode* root) {
while (root != NULL && root->lthread == 0)
root = root->left;
return root;
}
void inorderTBT(struct TBTNode* root) {
struct TBTNode* cur = leftmost(root);
while (cur != NULL) {
printf("%d ", cur->data);
if (cur->rthread == 1) {
cur = cur->right;
} else {
cur = leftmost(cur->right);
}
}
}
int main() {
struct TBTNode* root = NULL;
root = insertTBT(root, 50);
root = insertTBT(root, 30);
root = insertTBT(root, 70);
root = insertTBT(root, 20);
root = insertTBT(root, 40);
root = insertTBT(root, 60);
root = insertTBT(root, 80);
printf("Inorder Traversal of Threaded Binary Tree:\n");
inorderTBT(root);
return 0;
}
#Dijkstra Algo
#include <iostream>
#include <climits>
using namespace std;
#define V 5
int minDistance(int dist[], bool visited[]) {
int min = INT_MAX, minIndex;
for (int v = 0; v < V; v++)
if (!visited[v] && dist[v] <= min)
min = dist[v], minIndex = v;
return minIndex;
}
void dijkstra(int graph[V][V], int src) {
int dist[V];
bool visited[V];
for (int i = 0; i < V; i++)
dist[i] = INT_MAX, visited[i] = false;
dist[src] = 0;
for (int count = 0; count < V - 1; count++) {
int u = minDistance(dist, visited);
visited[u] = true;
for (int v = 0; v < V; v++)
if (!visited[v] && graph[u][v] && dist[u] + graph[u][v] < dist[v])
dist[v] = dist[u] + graph[u][v];
}
for (int i = 0; i < V; i++)
cout << "Vertex " << i << ": Distance " << dist[i] << endl;
}
int main() {
int graph[V][V] = {{0, 10, 0, 30, 100},
{10, 0, 50, 0, 0},
{0, 50, 0, 20, 10},
{30, 0, 20, 0, 60},
{100, 0, 10, 60, 0}};
cout<<"Dijkstra: ";
dijkstra(graph, 0);
return 0;
}
#Tower of Hanoi
#include <stdio.h>
void towerOfHanoi(int n, char source, char auxiliary, char destination) {
if (n == 1) {
printf("Move disk 1 from %c to %c\n", source, destination);
return;
}
towerOfHanoi(n - 1, source, destination, auxiliary);
printf("Move disk %d from %c to %c\n", n, source, destination);
towerOfHanoi(n - 1, auxiliary, source, destination);
}
int main() {
int n;
printf("Enter the number of disks: ");
scanf("%d", &n);
printf("Solution for %d disks:\n", n);
towerOfHanoi(n, 'A', 'B', 'C');
return 0;
}
#Doubly Linked List
#include <stdio.h>
#include <stdlib.h>
if (*head != NULL)
(*head)->prev = newNode;
*head = newNode;
}
if (*head == NULL) {
*head = newNode;
return;
}
temp->next = newNode;
newNode->prev = temp;
}
// Insert after a given node (by value)
void insertAfter(struct Node* head, int afterValue, int data) {
struct Node* temp = head;
if (temp == NULL) {
printf("Node with value %d not found.\n", afterValue);
return;
}
if (temp->next != NULL)
temp->next->prev = newNode;
temp->next = newNode;
}
if (*head != NULL)
(*head)->prev = NULL;
free(temp);
}
if (temp->prev != NULL)
temp->prev->next = NULL;
else
*head = NULL;
free(temp);
}
if (temp == NULL) {
printf("Node with value %d not found.\n", value);
return;
}
if (temp->prev != NULL)
temp->prev->next = temp->next;
else
*head = temp->next;
if (temp->next != NULL)
temp->next->prev = temp->prev;
free(temp);
}
if (temp == NULL) {
printf("List is empty.\n");
return;
}
insertAtEnd(&head, 10);
insertAtEnd(&head, 20);
insertAtBeginning(&head, 5);
insertAfter(head, 10, 15);
displayForward(head);
displayReverse(head);
deleteFromBeginning(&head);
deleteFromEnd(&head);
deleteNode(&head, 15);
displayForward(head);
displayReverse(head);
return 0;
}
#Circular Linked List
#include <stdio.h>
#include <stdlib.h>
// Node structure
struct Node {
int data;
struct Node* next;
};
// Insert at beginning
void insertAtBeginning(struct Node** head, int data) {
struct Node* newNode = createNode(data);
if (*head == NULL) {
newNode->next = newNode;
*head = newNode;
return;
}
struct Node* temp = *head;
while (temp->next != *head)
temp = temp->next;
newNode->next = *head;
temp->next = newNode;
*head = newNode;
}
// Insert at end
void insertAtEnd(struct Node** head, int data) {
struct Node* newNode = createNode(data);
if (*head == NULL) {
newNode->next = newNode;
*head = newNode;
return;
}
temp->next = newNode;
newNode->next = *head;
}
if (pos == 1) {
insertAtBeginning(head, data);
return;
}
newNode->next = temp->next;
temp->next = newNode;
}
last->next = temp->next;
*head = temp->next;
free(temp);
}
prev->next = *head;
free(temp);
}
if (pos == 1) {
deleteFromBeginning(head);
return;
}
prev->next = temp->next;
free(temp);
}
// Delete by value
void deleteByValue(struct Node** head, int value) {
if (*head == NULL) {
printf("List is empty.\n");
return;
}
// If head is to be deleted
if (curr->data == value) {
deleteFromBeginning(head);
return;
}
do {
prev = curr;
curr = curr->next;
if (curr->data == value) {
prev->next = curr->next;
free(curr);
return;
}
} while (curr != *head);
// Display
void display(struct Node* head) {
if (head == NULL) {
printf("List is empty.\n");
return;
}
// Main function
int main() {
struct Node* head = NULL;
insertAtEnd(&head, 10);
insertAtEnd(&head, 20);
insertAtBeginning(&head, 5);
insertAtEnd(&head, 30);
insertAtPosition(&head, 15, 3);
display(head);
deleteFromBeginning(&head);
display(head);
deleteFromEnd(&head);
display(head);
deleteFromPosition(&head, 2);
display(head);
deleteByValue(&head, 15);
display(head);
return 0;
}