Friday, January 17, 2025 07:32:43 PM

ADVERTISEMENT

ADVERTISEMENT

Top 50 Data Structure Programs

array-operations.c

                    // array-operations.c - Insert, delete, search, and traverse operations in an array
#include <stdio.h>
#define MAX_SIZE 100

void insert(int arr[], int *n, int pos, int val) {
    if (*n >= MAX_SIZE || pos < 0 || pos > *n) {
        printf("Insertion failed. Invalid position or array full.\n");
        return;
    }
    for (int i = *n; i > pos; i--)
        arr[i] = arr[i - 1];
    arr[pos] = val;
    (*n)++;
    printf("Inserted %d at position %d\n", val, pos);
}

void delete(int arr[], int *n, int pos) {
    if (*n <= 0 || pos < 0 || pos >= *n) {
        printf("Deletion failed. Invalid position or array empty.\n");
        return;
    }
    for (int i = pos; i < *n - 1; i++)
        arr[i] = arr[i + 1];
    (*n)--;
    printf("Deleted element at position %d\n", pos);
}

void search(int arr[], int n, int val) {
    for (int i = 0; i < n; i++) {
        if (arr[i] == val) {
            printf("Element %d found at position %d\n", val, i);
            return;
        }
    }
    printf("Element %d not found\n", val);
}

void traverse(int arr[], int n) {
    printf("Array elements: ");
    for (int i = 0; i < n; i++)
        printf("%d ", arr[i]);
    printf("\n");
}

int main() {
    int arr[MAX_SIZE], n = 0;
    int choice, pos, val;

    while (1) {
        printf("\nArray Operations:\n");
        printf("1. Insert\n2. Delete\n3. Search\n4. Traverse\n5. Exit\nEnter your choice: ");
        scanf("%d", &choice);

        switch (choice) {
            case 1:
                printf("Enter position and value to insert: ");
                scanf("%d %d", &pos, &val);
                insert(arr, &n, pos, val);
                break;
            case 2:
                printf("Enter position to delete: ");
                scanf("%d", &pos);
                delete(arr, &n, pos);
                break;
            case 3:
                printf("Enter value to search: ");
                scanf("%d", &val);
                search(arr, n, val);
                break;
            case 4:
                traverse(arr, n);
                break;
            case 5:
                return 0;
            default:
                printf("Invalid choice. Try again.\n");
        }
    }
}                    

Last Modified: January 13, 2025 06:36:21

merge-two-arrays.c

                    // merge-two-arrays.c - Merge two sorted arrays
#include <stdio.h>
#define MAX_SIZE 100

void mergeArrays(int arr1[], int n1, int arr2[], int n2, int merged[]) {
    int i = 0, j = 0, k = 0;
    while (i < n1 && j < n2) {
        if (arr1[i] < arr2[j])
            merged[k++] = arr1[i++];
        else
            merged[k++] = arr2[j++];
    }
    while (i < n1)
        merged[k++] = arr1[i++];
    while (j < n2)
        merged[k++] = arr2[j++];
}

int main() {
    int arr1[MAX_SIZE], arr2[MAX_SIZE], merged[2 * MAX_SIZE];
    int n1, n2;

    printf("Enter size of first array: ");
    scanf("%d", &n1);
    printf("Enter elements of first sorted array: ");
    for (int i = 0; i < n1; i++)
        scanf("%d", &arr1[i]);

    printf("Enter size of second array: ");
    scanf("%d", &n2);
    printf("Enter elements of second sorted array: ");
    for (int i = 0; i < n2; i++)
        scanf("%d", &arr2[i]);

    mergeArrays(arr1, n1, arr2, n2, merged);

    printf("Merged array: ");
    for (int i = 0; i < n1 + n2; i++)
        printf("%d ", merged[i]);
    printf("\n");

    return 0;
}                    

Last Modified: January 13, 2025 06:36:48

find-second-largest.c

                    // find-second-largest.c - Find the second largest element in an array
#include <stdio.h>
#define MAX_SIZE 100

int findSecondLargest(int arr[], int n) {
    if (n < 2) {
        printf("Array must have at least two elements.\n");
        return -1;
    }

    int largest = -1, secondLargest = -1;
    for (int i = 0; i < n; i++) {
        if (arr[i] > largest) {
            secondLargest = largest;
            largest = arr[i];
        } else if (arr[i] > secondLargest && arr[i] != largest) {
            secondLargest = arr[i];
        }
    }

    return secondLargest;
}

int main() {
    int arr[MAX_SIZE], n;

    printf("Enter size of array: ");
    scanf("%d", &n);
    printf("Enter elements of array: ");
    for (int i = 0; i < n; i++)
        scanf("%d", &arr[i]);

    int secondLargest = findSecondLargest(arr, n);
    if (secondLargest != -1)
        printf("Second largest element is: %d\n", secondLargest);

    return 0;
}                    

Last Modified: January 13, 2025 06:37:06

rotate-array.c

                    // rotate-array.c - Rotate an array to the left or right
#include <stdio.h>
#define MAX_SIZE 100

void rotateLeft(int arr[], int n, int d) {
    int temp[MAX_SIZE];
    d = d % n;
    for (int i = 0; i < n; i++)
        temp[i] = arr[(i + d) % n];
    for (int i = 0; i < n; i++)
        arr[i] = temp[i];
}

void rotateRight(int arr[], int n, int d) {
    rotateLeft(arr, n, n - d % n);
}

int main() {
    int arr[MAX_SIZE], n, d, choice;

    printf("Enter size of array: ");
    scanf("%d", &n);
    printf("Enter elements of array: ");
    for (int i = 0; i < n; i++)
        scanf("%d", &arr[i]);

    printf("Enter number of rotations: ");
    scanf("%d", &d);

    printf("Rotate: 1. Left  2. Right\nEnter your choice: ");
    scanf("%d", &choice);

    if (choice == 1) {
        rotateLeft(arr, n, d);
        printf("Array after left rotation: ");
    } else {
        rotateRight(arr, n, d);
        printf("Array after right rotation: ");
    }

    for (int i = 0; i < n; i++)
        printf("%d ", arr[i]);
    printf("\n");

    return 0;
}                    

Last Modified: January 13, 2025 06:37:25

find-missing-number.c

                    // find-missing-number.c - Find the missing number in a sequence
#include <stdio.h>

int findMissingNumber(int arr[], int n) {
    int total = (n + 1) * (n + 2) / 2;
    for (int i = 0; i < n; i++)
        total -= arr[i];
    return total;
}

int main() {
    int arr[MAX_SIZE], n;

    printf("Enter size of array (excluding missing number): ");
    scanf("%d", &n);
    printf("Enter elements of array: ");
    for (int i = 0; i < n; i++)
        scanf("%d", &arr[i]);

    printf("Missing number is: %d\n", findMissingNumber(arr, n));

    return 0;
}                    

Last Modified: January 13, 2025 06:37:52

string-reversal.c

                    // string-reversal.c - Reverse a string
#include <stdio.h>
#include <string.h>
#define MAX_SIZE 100

void reverseString(char str[]) {
    int n = strlen(str);
    for (int i = 0; i < n / 2; i++) {
        char temp = str[i];
        str[i] = str[n - i - 1];
        str[n - i - 1] = temp;
    }
}

int main() {
    char str[MAX_SIZE];

    printf("Enter a string: ");
    fgets(str, MAX_SIZE, stdin);
    str[strcspn(str, "\n")] = '\0'; // Remove newline character

    reverseString(str);
    printf("Reversed string: %s\n", str);

    return 0;
}                    

Last Modified: January 13, 2025 06:40:04

string-palindrome.c

                    // string-palindrome.c - Check if a string is a palindrome
#include <stdio.h>
#include <string.h>
#define MAX_SIZE 100

int isPalindrome(char str[]) {
    int n = strlen(str);
    for (int i = 0; i < n / 2; i++) {
        if (str[i] != str[n - i - 1])
            return 0;
    }
    return 1;
}

int main() {
    char str[MAX_SIZE];

    printf("Enter a string: ");
    fgets(str, MAX_SIZE, stdin);
    str[strcspn(str, "\n")] = '\0'; // Remove newline character

    if (isPalindrome(str))
        printf("The string is a palindrome.\n");
    else
        printf("The string is not a palindrome.\n");

    return 0;
}                    

Last Modified: January 13, 2025 06:40:20

substring-search.c

                    // substring-search.c - Find a substring in a string
#include <stdio.h>
#include <string.h>
#define MAX_SIZE 100

int substringSearch(char str[], char substr[]) {
    char *pos = strstr(str, substr);
    if (pos != NULL)
        return pos - str;
    return -1;
}

int main() {
    char str[MAX_SIZE], substr[MAX_SIZE];

    printf("Enter the main string: ");
    fgets(str, MAX_SIZE, stdin);
    str[strcspn(str, "\n")] = '\0'; // Remove newline character

    printf("Enter the substring: ");
    fgets(substr, MAX_SIZE, stdin);
    substr[strcspn(substr, "\n")] = '\0'; // Remove newline character

    int pos = substringSearch(str, substr);
    if (pos != -1)
        printf("Substring found at position %d\n", pos);
    else
        printf("Substring not found.\n");

    return 0;
}                    

Last Modified: January 13, 2025 06:40:39

string-permutations.c

                    // string-permutations.c - Generate all permutations of a string
#include <stdio.h>
#include <string.h>

void swap(char *x, char *y) {
    char temp = *x;
    *x = *y;
    *y = temp;
}

void generatePermutations(char str[], int start, int end) {
    if (start == end) {
        printf("%s\n", str);
        return;
    }

    for (int i = start; i <= end; i++) {
        swap(&str[start], &str[i]);
        generatePermutations(str, start + 1, end);
        swap(&str[start], &str[i]); // Backtrack
    }
}

int main() {
    char str[MAX_SIZE];

    printf("Enter a string: ");
    fgets(str, MAX_SIZE, stdin);
    str[strcspn(str, "\n")] = '\0'; // Remove newline character

    printf("Permutations of the string:\n");
    generatePermutations(str, 0, strlen(str) - 1);

    return 0;
}                    

Last Modified: January 13, 2025 06:40:56

character-frequency.c

                    // character-frequency.c - Count the frequency of each character in a string
#include <stdio.h>
#include <string.h>
#define MAX_SIZE 100
#define ASCII_SIZE 256

void countCharacterFrequency(char str[]) {
    int freq[ASCII_SIZE] = {0};

    for (int i = 0; str[i] != '\0'; i++)
        freq[(int)str[i]]++;

    printf("Character frequencies:\n");
    for (int i = 0; i < ASCII_SIZE; i++) {
        if (freq[i] > 0)
            printf("%c: %d\n", i, freq[i]);
    }
}

int main() {
    char str[MAX_SIZE];

    printf("Enter a string: ");
    fgets(str, MAX_SIZE, stdin);
    str[strcspn(str, "\n")] = '\0'; // Remove newline character

    countCharacterFrequency(str);

    return 0;
}                    

Last Modified: January 13, 2025 06:41:13

singly-linked-list.c

                    // Program to implement a singly linked list with basic operations (insert, delete, traverse)
#include <stdio.h>
#include <stdlib.h>

// Node structure for singly linked list
struct Node {
    int data;
    struct Node* next;
};

// Function to insert a new node at the end
void insert(struct Node** head, int data) {
    struct Node* new_node = (struct Node*)malloc(sizeof(struct Node));
    struct Node* last = *head;
    new_node->data = data;
    new_node->next = NULL;

    // If the list is empty, make new node the head
    if (*head == NULL) {
        *head = new_node;
        return;
    }

    // Traverse to the last node and insert the new node
    while (last->next != NULL) {
        last = last->next;
    }
    last->next = new_node;
}

// Function to delete a node with specific data
void delete(struct Node** head, int data) {
    struct Node* temp = *head;
    struct Node* prev = NULL;

    // If the node to be deleted is the head node
    if (temp != NULL && temp->data == data) {
        *head = temp->next;
        free(temp);
        return;
    }

    // Search for the node to be deleted
    while (temp != NULL && temp->data != data) {
        prev = temp;
        temp = temp->next;
    }

    // If the data was not found
    if (temp == NULL) return;

    // Unlink the node from the list
    prev->next = temp->next;
    free(temp);
}

// Function to traverse the list
void traverse(struct Node* head) {
    struct Node* temp = head;
    while (temp != NULL) {
        printf("%d -> ", temp->data);
        temp = temp->next;
    }
    printf("NULL\n");
}

int main() {
    struct Node* head = NULL;
    
    insert(&head, 10);
    insert(&head, 20);
    insert(&head, 30);

    printf("List: ");
    traverse(head);

    delete(&head, 20);

    printf("After deletion: ");
    traverse(head);

    return 0;
}                    

Last Modified: January 13, 2025 06:45:51

doubly-linked-list.c

                    // Program to implement a doubly linked list with basic operations (insert, delete, traverse)
#include <stdio.h>
#include <stdlib.h>

// Node structure for doubly linked list
struct Node {
    int data;
    struct Node* prev;
    struct Node* next;
};

// Function to insert a new node at the end
void insert(struct Node** head, int data) {
    struct Node* new_node = (struct Node*)malloc(sizeof(struct Node));
    struct Node* last = *head;
    new_node->data = data;
    new_node->next = NULL;

    if (*head == NULL) {
        new_node->prev = NULL;
        *head = new_node;
        return;
    }

    while (last->next != NULL) {
        last = last->next;
    }
    last->next = new_node;
    new_node->prev = last;
}

// Function to delete a node with specific data
void delete(struct Node** head, int data) {
    struct Node* temp = *head;

    // If the list is empty
    if (temp == NULL) return;

    // If the node to be deleted is the head node
    if (temp != NULL && temp->data == data) {
        *head = temp->next;
        if (*head != NULL) {
            (*head)->prev = NULL;
        }
        free(temp);
        return;
    }

    // Search for the node to be deleted
    while (temp != NULL && temp->data != data) {
        temp = temp->next;
    }

    if (temp == NULL) return;

    if (temp->next != NULL) {
        temp->next->prev = temp->prev;
    }

    if (temp->prev != NULL) {
        temp->prev->next = temp->next;
    }

    free(temp);
}

// Function to traverse the list
void traverse(struct Node* head) {
    struct Node* temp = head;
    while (temp != NULL) {
        printf("%d <-> ", temp->data);
        temp = temp->next;
    }
    printf("NULL\n");
}

int main() {
    struct Node* head = NULL;

    insert(&head, 10);
    insert(&head, 20);
    insert(&head, 30);

    printf("List: ");
    traverse(head);

    delete(&head, 20);

    printf("After deletion: ");
    traverse(head);

    return 0;
}                    

Last Modified: January 13, 2025 06:46:05

circular-linked-list.c

                    // Program to implement a circular linked list with basic operations (insert, delete, traverse)
#include <stdio.h>
#include <stdlib.h>

// Node structure for circular linked list
struct Node {
    int data;
    struct Node* next;
};

// Function to insert a new node at the end
void insert(struct Node** head, int data) {
    struct Node* new_node = (struct Node*)malloc(sizeof(struct Node));
    struct Node* last = *head;
    new_node->data = data;

    if (*head == NULL) {
        new_node->next = new_node;
        *head = new_node;
        return;
    }

    while (last->next != *head) {
        last = last->next;
    }
    last->next = new_node;
    new_node->next = *head;
}

// Function to delete a node with specific data
void delete(struct Node** head, int data) {
    struct Node* temp = *head;
    struct Node* prev = NULL;

    // If the list is empty
    if (*head == NULL) return;

    // If the node to be deleted is the head node
    if (temp->data == data) {
        if (temp->next == *head) {
            free(temp);
            *head = NULL;
        } else {
            prev = *head;
            while (prev->next != *head) {
                prev = prev->next;
            }
            *head = temp->next;
            prev->next = *head;
            free(temp);
        }
        return;
    }

    // Search for the node to be deleted
    while (temp->next != *head && temp->data != data) {
        prev = temp;
        temp = temp->next;
    }

    if (temp == *head) return;

    prev->next = temp->next;
    free(temp);
}

// Function to traverse the list
void traverse(struct Node* head) {
    struct Node* temp = head;
    if (head == NULL) return;

    do {
        printf("%d -> ", temp->data);
        temp = temp->next;
    } while (temp != head);
    printf("back to head\n");
}

int main() {
    struct Node* head = NULL;

    insert(&head, 10);
    insert(&head, 20);
    insert(&head, 30);

    printf("List: ");
    traverse(head);

    delete(&head, 20);

    printf("After deletion: ");
    traverse(head);

    return 0;
}                    

Last Modified: January 13, 2025 06:46:19

merge-two-linked-lists.c

                    // Program to merge two sorted linked lists
#include <stdio.h>
#include <stdlib.h>

// Node structure for linked list
struct Node {
    int data;
    struct Node* next;
};

// Function to insert a new node at the end
void insert(struct Node** head, int data) {
    struct Node* new_node = (struct Node*)malloc(sizeof(struct Node));
    struct Node* last = *head;
    new_node->data = data;
    new_node->next = NULL;

    if (*head == NULL) {
        *head = new_node;
        return;
    }

    while (last->next != NULL) {
        last = last->next;
    }
    last->next = new_node;
}

// Function to merge two sorted linked lists
struct Node* merge(struct Node* list1, struct Node* list2) {
    struct Node* merged = NULL;
    struct Node** last_ptr = &merged;

    while (list1 != NULL && list2 != NULL) {
        if (list1->data < list2->data) {
            *last_ptr = list1;
            list1 = list1->next;
        } else {
            *last_ptr = list2;
            list2 = list2->next;
        }
        last_ptr = &((*last_ptr)->next);
    }

    if (list1 != NULL) {
        *last_ptr = list1;
    } else {
        *last_ptr = list2;
    }

    return merged;
}

// Function to traverse the list
void traverse(struct Node* head) {
    struct Node* temp = head;
    while (temp != NULL) {
        printf("%d -> ", temp->data);
        temp = temp->next;
    }
    printf("NULL\n");
}

int main() {
    struct Node* list1 = NULL;
    struct Node* list2 = NULL;
    struct Node* merged_list = NULL;

    insert(&list1, 1);
    insert(&list1, 3);
    insert(&list1, 5);

    insert(&list2, 2);
    insert(&list2, 4);
    insert(&list2, 6);

    printf("List 1: ");
    traverse(list1);
    printf("List 2: ");
    traverse(list2);

    merged_list = merge(list1, list2);
    printf("Merged List: ");
    traverse(merged_list);

    return 0;
}                    

Last Modified: January 13, 2025 06:46:38

detect-cycle-linked-list.c

                    // Program to detect a cycle in a linked list
#include <stdio.h>
#include <stdlib.h>

// Node structure for linked list
struct Node {
    int data;
    struct Node* next;
};

// Function to detect cycle in the linked list
int detectCycle(struct Node* head) {
    struct Node* slow = head;
    struct Node* fast = head;

    while (fast != NULL && fast->next != NULL) {
        slow = slow->next;
        fast = fast->next->next;

        if (slow == fast) {
            return 1; // Cycle detected
        }
    }

    return 0; // No cycle
}

// Function to insert a new node at the end
void insert(struct Node** head, int data) {
    struct Node* new_node = (struct Node*)malloc(sizeof(struct Node));
    struct Node* last = *head;
    new_node->data = data;
    new_node->next = NULL;

    if (*head == NULL) {
        *head = new_node;
        return;
    }

    while (last->next != NULL) {
        last = last->next;
    }
    last->next = new_node;
}

int main() {
    struct Node* head = NULL;

    insert(&head, 10);
    insert(&head, 20);
    insert(&head, 30);
    insert(&head, 40);
    
    // Creating a cycle for testing
    head->next->next->next->next = head->next;

    if (detectCycle(head)) {
        printf("Cycle detected in the list\n");
    } else {
        printf("No cycle in the list\n");
    }

    return 0;
}                    

Last Modified: January 13, 2025 06:46:54

stack-using-array.c

                    // Program to implement a stack using arrays
#include <stdio.h>
#include <stdlib.h>

#define MAX 10

struct Stack {
    int arr[MAX];
    int top;
};

// Function to initialize stack
void initStack(struct Stack* stack) {
    stack->top = -1;
}

// Function to check if the stack is full
int isFull(struct Stack* stack) {
    return stack->top == MAX - 1;
}

// Function to check if the stack is empty
int isEmpty(struct Stack* stack) {
    return stack->top == -1;
}

// Function to push an element onto the stack
void push(struct Stack* stack, int data) {
    if (isFull(stack)) {
        printf("Stack is full\n");
    } else {
        stack->arr[++stack->top] = data;
    }
}

// Function to pop an element from the stack
int pop(struct Stack* stack) {
    if (isEmpty(stack)) {
        printf("Stack is empty\n");
        return -1;
    } else {
        return stack->arr[stack->top--];
    }
}

// Function to peek the top element of the stack
int peek(struct Stack* stack) {
    if (isEmpty(stack)) {
        printf("Stack is empty\n");
        return -1;
    } else {
        return stack->arr[stack->top];
    }
}

int main() {
    struct Stack stack;
    initStack(&stack);

    push(&stack, 10);
    push(&stack, 20);
    push(&stack, 30);

    printf("Top element: %d\n", peek(&stack));
    printf("Popped element: %d\n", pop(&stack));
    printf("Top element after pop: %d\n", peek(&stack));

    return 0;
}                    

Last Modified: January 13, 2025 06:47:08

stack-using-linked-list.c

                    // Program to implement a stack using linked list
#include <stdio.h>
#include <stdlib.h>

// Node structure for stack
struct Node {
    int data;
    struct Node* next;
};

struct Stack {
    struct Node* top;
};

// Function to initialize stack
void initStack(struct Stack* stack) {
    stack->top = NULL;
}

// Function to check if the stack is empty
int isEmpty(struct Stack* stack) {
    return stack->top == NULL;
}

// Function to push an element onto the stack
void push(struct Stack* stack, int data) {
    struct Node* new_node = (struct Node*)malloc(sizeof(struct Node));
    new_node->data = data;
    new_node->next = stack->top;
    stack->top = new_node;
}

// Function to pop an element from the stack
int pop(struct Stack* stack) {
    if (isEmpty(stack)) {
        printf("Stack is empty\n");
        return -1;
    } else {
        struct Node* temp = stack->top;
        int popped_data = temp->data;
        stack->top = stack->top->next;
        free(temp);
        return popped_data;
    }
}

// Function to peek the top element of the stack
int peek(struct Stack* stack) {
    if (isEmpty(stack)) {
        printf("Stack is empty\n");
        return -1;
    } else {
        return stack->top->data;
    }
}

int main() {
    struct Stack stack;
    initStack(&stack);

    push(&stack, 10);
    push(&stack, 20);
    push(&stack, 30);

    printf("Top element: %d\n", peek(&stack));
    printf("Popped element: %d\n", pop(&stack));
    printf("Top element after pop: %d\n", peek(&stack));

    return 0;
}                    

Last Modified: January 13, 2025 06:47:24

stack-balanced-parentheses.c

                    // Program to check if parentheses are balanced in an expression
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// Stack structure
struct Stack {
    char arr[100];
    int top;
};

// Function to initialize stack
void initStack(struct Stack* stack) {
    stack->top = -1;
}

// Function to push an element onto the stack
void push(struct Stack* stack, char ch) {
    stack->arr[++stack->top] = ch;
}

// Function to pop an element from the stack
char pop(struct Stack* stack) {
    return stack->arr[stack->top--];
}

// Function to check if the parentheses are balanced
int isBalanced(char* expr) {
    struct Stack stack;
    initStack(&stack);

    for (int i = 0; i < strlen(expr); i++) {
        char ch = expr[i];

        if (ch == '(') {
            push(&stack, ch);
        } else if (ch == ')') {
            if (stack.top == -1 || pop(&stack) != '(') {
                return 0; // Not balanced
            }
        }
    }

    return stack.top == -1; // If stack is empty, it's balanced
}

int main() {
    char expr[] = "(a + b) * (c + d)";

    if (isBalanced(expr)) {
        printf("The expression has balanced parentheses\n");
    } else {
        printf("The expression does not have balanced parentheses\n");
    }

    return 0;
}                    

Last Modified: January 13, 2025 06:47:53

infix-to-postfix.c

                    // Program to convert infix expression to postfix
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

// Stack structure
struct Stack {
    char arr[100];
    int top;
};

// Function to initialize stack
void initStack(struct Stack* stack) {
    stack->top = -1;
}

// Function to push an element onto the stack
void push(struct Stack* stack, char ch) {
    stack->arr[++stack->top] = ch;
}

// Function to pop an element from the stack
char pop(struct Stack* stack) {
    return stack->arr[stack->top--];
}

// Function to get precedence of operators
int precedence(char ch) {
    if (ch == '+' || ch == '-') return 1;
    if (ch == '*' || ch == '/') return 2;
    return 0;
}

// Function to convert infix to postfix
void infixToPostfix(char* infix, char* postfix) {
    struct Stack stack;
    initStack(&stack);
    int j = 0;

    for (int i = 0; i < strlen(infix); i++) {
        char ch = infix[i];

        if (isalnum(ch)) {
            postfix[j++] = ch;
        } else if (ch == '(') {
            push(&stack, ch);
        } else if (ch == ')') {
            while (stack.top != -1 && stack.arr[stack.top] != '(') {
                postfix[j++] = pop(&stack);
            }
            pop(&stack); // Pop '('
        } else {
            while (stack.top != -1 && precedence(stack.arr[stack.top]) >= precedence(ch)) {
                postfix[j++] = pop(&stack);
            }
            push(&stack, ch);
        }
    }

    while (stack.top != -1) {
        postfix[j++] = pop(&stack);
    }

    postfix[j] = '\0'; // Null terminate the postfix expression
}

int main() {
    char infix[] = "(a+b)*(c+d)";
    char postfix[100];

    infixToPostfix(infix, postfix);
    printf("Postfix expression: %s\n", postfix);

    return 0;
}                    

Last Modified: January 13, 2025 06:48:05

evaluate-postfix-expression.c

                    // Program to evaluate a postfix expression
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

// Stack structure
struct Stack {
    int arr[100];
    int top;
};

// Function to initialize stack
void initStack(struct Stack* stack) {
    stack->top = -1;
}

// Function to push an element onto the stack
void push(struct Stack* stack, int value) {
    stack->arr[++stack->top] = value;
}

// Function to pop an element from the stack
int pop(struct Stack* stack) {
    return stack->arr[stack->top--];
}

// Function to evaluate postfix expression
int evaluatePostfix(char* postfix) {
    struct Stack stack;
    initStack(&stack);

    for (int i = 0; i < strlen(postfix); i++) {
        char ch = postfix[i];

        if (isdigit(ch)) {
            push(&stack, ch - '0'); // Convert char to int and push onto stack
        } else {
            int operand2 = pop(&stack);
            int operand1 = pop(&stack);

            switch (ch) {
                case '+': push(&stack, operand1 + operand2); break;
                case '-': push(&stack, operand1 - operand2); break;
                case '*': push(&stack, operand1 * operand2); break;
                case '/': push(&stack, operand1 / operand2); break;
            }
        }
    }

    return pop(&stack);
}

int main() {
    char postfix[] = "23*5+";
    printf("Result of postfix evaluation: %d\n", evaluatePostfix(postfix));

    return 0;
}                    

Last Modified: January 13, 2025 06:48:18

queue-using-array.c

                    // Program to implement a queue using arrays
#include <stdio.h>
#include <stdlib.h>

#define MAX 10

struct Queue {
    int arr[MAX];
    int front, rear;
};

// Function to initialize the queue
void initQueue(struct Queue* queue) {
    queue->front = -1;
    queue->rear = -1;
}

// Function to check if the queue is full
int isFull(struct Queue* queue) {
    return queue->rear == MAX - 1;
}

// Function to check if the queue is empty
int isEmpty(struct Queue* queue) {
    return queue->front == -1;
}

// Function to enqueue an element
void enqueue(struct Queue* queue, int data) {
    if (isFull(queue)) {
        printf("Queue is full\n");
    } else {
        if (queue->front == -1) {
            queue->front = 0;
        }
        queue->arr[++queue->rear] = data;
    }
}

// Function to dequeue an element
int dequeue(struct Queue* queue) {
    if (isEmpty(queue)) {
        printf("Queue is empty\n");
        return -1;
    } else {
        int data = queue->arr[queue->front];
        if (queue->front == queue->rear) {
            queue->front = queue->rear = -1; // Reset the queue
        } else {
            queue->front++;
        }
        return data;
    }
}

// Function to display the queue
void display(struct Queue* queue) {
    if (isEmpty(queue)) {
        printf("Queue is empty\n");
    } else {
        for (int i = queue->front; i <= queue->rear; i++) {
            printf("%d ", queue->arr[i]);
        }
        printf("\n");
    }
}

int main() {
    struct Queue queue;
    initQueue(&queue);

    enqueue(&queue, 10);
    enqueue(&queue, 20);
    enqueue(&queue, 30);

    printf("Queue: ");
    display(&queue);

    printf("Dequeued: %d\n", dequeue(&queue));
    printf("Queue after dequeue: ");
    display(&queue);

    return 0;
}                    

Last Modified: January 13, 2025 06:49:14

queue-using-linked-list.c

                    // Program to implement a queue using linked list
#include <stdio.h>
#include <stdlib.h>

// Node structure for queue
struct Node {
    int data;
    struct Node* next;
};

struct Queue {
    struct Node* front;
    struct Node* rear;
};

// Function to initialize the queue
void initQueue(struct Queue* queue) {
    queue->front = queue->rear = NULL;
}

// Function to check if the queue is empty
int isEmpty(struct Queue* queue) {
    return queue->front == NULL;
}

// Function to enqueue an element
void enqueue(struct Queue* queue, int data) {
    struct Node* new_node = (struct Node*)malloc(sizeof(struct Node));
    new_node->data = data;
    new_node->next = NULL;

    if (isEmpty(queue)) {
        queue->front = queue->rear = new_node;
    } else {
        queue->rear->next = new_node;
        queue->rear = new_node;
    }
}

// Function to dequeue an element
int dequeue(struct Queue* queue) {
    if (isEmpty(queue)) {
        printf("Queue is empty\n");
        return -1;
    } else {
        int data = queue->front->data;
        struct Node* temp = queue->front;
        queue->front = queue->front->next;
        free(temp);
        return data;
    }
}

// Function to display the queue
void display(struct Queue* queue) {
    if (isEmpty(queue)) {
        printf("Queue is empty\n");
    } else {
        struct Node* temp = queue->front;
        while (temp != NULL) {
            printf("%d ", temp->data);
            temp = temp->next;
        }
        printf("\n");
    }
}

int main() {
    struct Queue queue;
    initQueue(&queue);

    enqueue(&queue, 10);
    enqueue(&queue, 20);
    enqueue(&queue, 30);

    printf("Queue: ");
    display(&queue);

    printf("Dequeued: %d\n", dequeue(&queue));
    printf("Queue after dequeue: ");
    display(&queue);

    return 0;
}                    

Last Modified: January 13, 2025 06:49:27

circular-queue.c

                    // Program to implement a circular queue
#include <stdio.h>
#include <stdlib.h>

#define MAX 10

struct Queue {
    int arr[MAX];
    int front, rear;
};

// Function to initialize the queue
void initQueue(struct Queue* queue) {
    queue->front = queue->rear = -1;
}

// Function to check if the queue is full
int isFull(struct Queue* queue) {
    return (queue->rear + 1) % MAX == queue->front;
}

// Function to check if the queue is empty
int isEmpty(struct Queue* queue) {
    return queue->front == -1;
}

// Function to enqueue an element
void enqueue(struct Queue* queue, int data) {
    if (isFull(queue)) {
        printf("Queue is full\n");
    } else {
        if (queue->front == -1) {
            queue->front = 0;
        }
        queue->rear = (queue->rear + 1) % MAX;
        queue->arr[queue->rear] = data;
    }
}

// Function to dequeue an element
int dequeue(struct Queue* queue) {
    if (isEmpty(queue)) {
        printf("Queue is empty\n");
        return -1;
    } else {
        int data = queue->arr[queue->front];
        if (queue->front == queue->rear) {
            queue->front = queue->rear = -1; // Reset the queue
        } else {
            queue->front = (queue->front + 1) % MAX;
        }
        return data;
    }
}

// Function to display the queue
void display(struct Queue* queue) {
    if (isEmpty(queue)) {
        printf("Queue is empty\n");
    } else {
        int i = queue->front;
        while (i != queue->rear) {
            printf("%d ", queue->arr[i]);
            i = (i + 1) % MAX;
        }
        printf("%d\n", queue->arr[queue->rear]);
    }
}

int main() {
    struct Queue queue;
    initQueue(&queue);

    enqueue(&queue, 10);
    enqueue(&queue, 20);
    enqueue(&queue, 30);

    printf("Queue: ");
    display(&queue);

    printf("Dequeued: %d\n", dequeue(&queue));
    printf("Queue after dequeue: ");
    display(&queue);

    return 0;
}                    

Last Modified: January 13, 2025 06:49:46

priority-queue.c

                    // Program to implement a priority queue
#include <stdio.h>
#include <stdlib.h>

struct Node {
    int data;
    int priority;
    struct Node* next;
};

struct PriorityQueue {
    struct Node* front;
};

// Function to initialize the priority queue
void initQueue(struct PriorityQueue* pq) {
    pq->front = NULL;
}

// Function to check if the priority queue is empty
int isEmpty(struct PriorityQueue* pq) {
    return pq->front == NULL;
}

// Function to enqueue an element with priority
void enqueue(struct PriorityQueue* pq, int data, int priority) {
    struct Node* new_node = (struct Node*)malloc(sizeof(struct Node));
    new_node->data = data;
    new_node->priority = priority;
    new_node->next = NULL;

    if (isEmpty(pq) || pq->front->priority < priority) {
        new_node->next = pq->front;
        pq->front = new_node;
    } else {
        struct Node* temp = pq->front;
        while (temp->next != NULL && temp->next->priority >= priority) {
            temp = temp->next;
        }
        new_node->next = temp->next;
        temp->next = new_node;
    }
}

// Function to dequeue an element
int dequeue(struct PriorityQueue* pq) {
    if (isEmpty(pq)) {
        printf("Priority queue is empty\n");
        return -1;
    } else {
        struct Node* temp = pq->front;
        int data = temp->data;
        pq->front = pq->front->next;
        free(temp);
        return data;
    }
}

// Function to display the priority queue
void display(struct PriorityQueue* pq) {
    if (isEmpty(pq)) {
        printf("Priority queue is empty\n");
    } else {
        struct Node* temp = pq->front;
        while (temp != NULL) {
            printf("%d(%d) ", temp->data, temp->priority);
            temp = temp->next;
        }
        printf("\n");
    }
}

int main() {
    struct PriorityQueue pq;
    initQueue(&pq);

    enqueue(&pq, 10, 2);
    enqueue(&pq, 20, 1);
    enqueue(&pq, 30, 3);

    printf("Priority Queue: ");
    display(&pq);

    printf("Dequeued: %d\n", dequeue(&pq));
    printf("Priority Queue after dequeue: ");
    display(&pq);

    return 0;
}                    

Last Modified: January 13, 2025 06:50:11

deque-implementation.c

                    // Program to implement a double-ended queue (Deque)
#include <stdio.h>
#include <stdlib.h>

#define MAX 10

struct Deque {
    int arr[MAX];
    int front, rear;
};

// Function to initialize the deque
void initDeque(struct Deque* deque) {
    deque->front = deque->rear = -1;
}

// Function to check if the deque is full
int isFull(struct Deque* deque) {
    return (deque->front == 0 && deque->rear == MAX - 1) || (deque->rear == deque->front - 1);
}

// Function to check if the deque is empty
int isEmpty(struct Deque* deque) {
    return deque->front == -1;
}

// Function to add an element at the front
void insertFront(struct Deque* deque, int data) {
    if (isFull(deque)) {
        printf("Deque is full\n");
    } else {
        if (deque->front == -1) {
            deque->front = deque->rear = 0;
        } else if (deque->front == 0) {
            deque->front = MAX - 1;
        } else {
            deque->front--;
        }
        deque->arr[deque->front] = data;
    }
}

// Function to add an element at the rear
void insertRear(struct Deque* deque, int data) {
    if (isFull(deque)) {
        printf("Deque is full\n");
    } else {
        if (deque->front == -1) {
            deque->front = deque->rear = 0;
        } else if (deque->rear == MAX - 1) {
            deque->rear = 0;
        } else {
            deque->rear++;
        }
        deque->arr[deque->rear] = data;
    }
}

// Function to delete an element from the front
int deleteFront(struct Deque* deque) {
    if (isEmpty(deque)) {
        printf("Deque is empty\n");
        return -1;
    } else {
        int data = deque->arr[deque->front];
        if (deque->front == deque->rear) {
            deque->front = deque->rear = -1; // Reset the deque
        } else if (deque->front == MAX - 1) {
            deque->front = 0;
        } else {
            deque->front++;
        }
        return data;
    }
}

// Function to delete an element from the rear
int deleteRear(struct Deque* deque) {
    if (isEmpty(deque)) {
        printf("Deque is empty\n");
        return -1;
    } else {
        int data = deque->arr[deque->rear];
        if (deque->front == deque->rear) {
            deque->front = deque->rear = -1; // Reset the deque
        } else if (deque->rear == 0) {
            deque->rear = MAX - 1;
        } else {
            deque->rear--;
        }
        return data;
    }
}

// Function to display the deque
void display(struct Deque* deque) {
    if (isEmpty(deque)) {
        printf("Deque is empty\n");
    } else {
        int i = deque->front;
        while (i != deque->rear) {
            printf("%d ", deque->arr[i]);
            i = (i + 1) % MAX;
        }
        printf("%d\n", deque->arr[deque->rear]);
    }
}

int main() {
    struct Deque deque;
    initDeque(&deque);

    insertRear(&deque, 10);
    insertRear(&deque, 20);
    insertFront(&deque, 30);

    printf("Deque: ");
    display(&deque);

    printf("Deleted from front: %d\n", deleteFront(&deque));
    printf("Deque after deletion from front: ");
    display(&deque);

    printf("Deleted from rear: %d\n", deleteRear(&deque));
    printf("Deque after deletion from rear: ");
    display(&deque);

    return 0;
}                    

Last Modified: January 13, 2025 06:50:27

binary-tree-traversal.c

                    // Program for preorder, inorder, and postorder traversal of a binary tree
#include <stdio.h>
#include <stdlib.h>

// Binary tree node
struct Node {
    int data;
    struct Node* left;
    struct Node* right;
};

// Function to create a new node
struct Node* newNode(int data) {
    struct Node* node = (struct Node*)malloc(sizeof(struct Node));
    node->data = data;
    node->left = node->right = NULL;
    return node;
}

// Preorder traversal (Root, Left, Right)
void preorder(struct Node* root) {
    if (root != NULL) {
        printf("%d ", root->data);
        preorder(root->left);
        preorder(root->right);
    }
}

// Inorder traversal (Left, Root, Right)
void inorder(struct Node* root) {
    if (root != NULL) {
        inorder(root->left);
        printf("%d ", root->data);
        inorder(root->right);
    }
}

// Postorder traversal (Left, Right, Root)
void postorder(struct Node* root) {
    if (root != NULL) {
        postorder(root->left);
        postorder(root->right);
        printf("%d ", root->data);
    }
}

int main() {
    // Example tree
    struct Node* root = newNode(1);
    root->left = newNode(2);
    root->right = newNode(3);
    root->left->left = newNode(4);
    root->left->right = newNode(5);

    printf("Preorder traversal: ");
    preorder(root);
    printf("\n");

    printf("Inorder traversal: ");
    inorder(root);
    printf("\n");

    printf("Postorder traversal: ");
    postorder(root);
    printf("\n");

    return 0;
}                    

Last Modified: January 13, 2025 06:50:42

binary-search-tree.c

                    // Program to implement a binary search tree (BST)
#include <stdio.h>
#include <stdlib.h>

// Binary tree node
struct Node {
    int data;
    struct Node* left;
    struct Node* right;
};

// Function to create a new node
struct Node* newNode(int data) {
    struct Node* node = (struct Node*)malloc(sizeof(struct Node));
    node->data = data;
    node->left = node->right = NULL;
    return node;
}

// Function to insert a node in the BST
struct Node* insert(struct Node* root, int data) {
    if (root == NULL) {
        return newNode(data);
    }

    if (data < root->data) {
        root->left = insert(root->left, data);
    } else if (data > root->data) {
        root->right = insert(root->right, data);
    }

    return root;
}

// Function to search for a value in the BST
struct Node* search(struct Node* root, int data) {
    if (root == NULL || root->data == data) {
        return root;
    }

    if (data < root->data) {
        return search(root->left, data);
    }

    return search(root->right, data);
}

int main() {
    struct Node* root = NULL;
    root = insert(root, 10);
    insert(root, 20);
    insert(root, 5);

    struct Node* found = search(root, 10);
    if (found) {
        printf("Node found with data: %d\n", found->data);
    } else {
        printf("Node not found\n");
    }

    return 0;
}                    

Last Modified: January 13, 2025 06:50:56

lowest-common-ancestor.c

                    // Program to find the lowest common ancestor (LCA) in a binary search tree
#include <stdio.h>
#include <stdlib.h>

// Binary tree node
struct Node {
    int data;
    struct Node* left;
    struct Node* right;
};

// Function to create a new node
struct Node* newNode(int data) {
    struct Node* node = (struct Node*)malloc(sizeof(struct Node));
    node->data = data;
    node->left = node->right = NULL;
    return node;
}

// Function to find the LCA of two nodes in a BST
struct Node* findLCA(struct Node* root, int n1, int n2) {
    if (root == NULL) return NULL;

    // If both nodes are smaller than root, LCA lies in the left subtree
    if (root->data > n1 && root->data > n2) {
        return findLCA(root->left, n1, n2);
    }

    // If both nodes are greater than root, LCA lies in the right subtree
    if (root->data < n1 && root->data < n2) {
        return findLCA(root->right, n1, n2);
    }

    return root;
}

int main() {
    struct Node* root = newNode(20);
    root->left = newNode(10);
    root->right = newNode(30);
    root->left->left = newNode(5);
    root->left->right = newNode(15);

    struct Node* lca = findLCA(root, 5, 15);
    if (lca) {
        printf("Lowest Common Ancestor: %d\n", lca->data);
    } else {
        printf("LCA not found\n");
    }

    return 0;
}                    

Last Modified: January 13, 2025 06:51:09

height-of-tree.c

                    // Program to calculate the height of a binary tree
#include <stdio.h>
#include <stdlib.h>

// Binary tree node
struct Node {
    int data;
    struct Node* left;
    struct Node* right;
};

// Function to create a new node
struct Node* newNode(int data) {
    struct Node* node = (struct Node*)malloc(sizeof(struct Node));
    node->data = data;
    node->left = node->right = NULL;
    return node;
}

// Function to calculate the height of a binary tree
int height(struct Node* root) {
    if (root == NULL) {
        return 0;
    }

    int leftHeight = height(root->left);
    int rightHeight = height(root->right);

    return (leftHeight > rightHeight ? leftHeight : rightHeight) + 1;
}

int main() {
    struct Node* root = newNode(1);
    root->left = newNode(2);
    root->right = newNode(3);
    root->left->left = newNode(4);
    root->left->right = newNode(5);

    printf("Height of tree: %d\n", height(root));

    return 0;
}                    

Last Modified: January 13, 2025 06:51:22

level-order-traversal.c

                    // Program for level-order traversal of a binary tree
#include <stdio.h>
#include <stdlib.h>

// Binary tree node
struct Node {
    int data;
    struct Node* left;
    struct Node* right;
};

// Function to create a new node
struct Node* newNode(int data) {
    struct Node* node = (struct Node*)malloc(sizeof(struct Node));
    node->data = data;
    node->left = node->right = NULL;
    return node;
}

// Queue structure for level-order traversal
struct Queue {
    struct Node* arr[100];
    int front, rear;
};

// Function to initialize the queue
void initQueue(struct Queue* queue) {
    queue->front = queue->rear = -1;
}

// Function to check if the queue is empty
int isEmpty(struct Queue* queue) {
    return queue->front == -1;
}

// Function to enqueue an element
void enqueue(struct Queue* queue, struct Node* node) {
    if (queue->rear == 99) {
        printf("Queue is full\n");
    } else {
        if (queue->front == -1) {
            queue->front = 0;
        }
        queue->arr[++queue->rear] = node;
    }
}

// Function to dequeue an element
struct Node* dequeue(struct Queue* queue) {
    if (isEmpty(queue)) {
        printf("Queue is empty\n");
        return NULL;
    } else {
        struct Node* node = queue->arr[queue->front];
        if (queue->front == queue->rear) {
            queue->front = queue->rear = -1;
        } else {
            queue->front++;
        }
        return node;
    }
}

// Function for level-order traversal
void levelOrder(struct Node* root) {
    if (root == NULL) return;

    struct Queue queue;
    initQueue(&queue);

    enqueue(&queue, root);

    while (!isEmpty(&queue)) {
        struct Node* node = dequeue(&queue);
        printf("%d ", node->data);

        if (node->left) enqueue(&queue, node->left);
        if (node->right) enqueue(&queue, node->right);
    }
}

int main() {
    struct Node* root = newNode(1);
    root->left = newNode(2);
    root->right = newNode(3);
    root->left->left = newNode(4);
    root->left->right = newNode(5);

    printf("Level-order traversal: ");
    levelOrder(root);
    printf("\n");

    return 0;
}                    

Last Modified: January 13, 2025 06:51:34

min-heap.c

                    // Program to implement a Min-Heap
#include <stdio.h>
#include <stdlib.h>

#define MAX 100

// Min-Heap structure
struct MinHeap {
    int arr[MAX];
    int size;
};

// Function to initialize the Min-Heap
void initMinHeap(struct MinHeap* heap) {
    heap->size = 0;
}

// Function to get the parent index of a node
int parent(int i) {
    return (i - 1) / 2;
}

// Function to get the left child index of a node
int leftChild(int i) {
    return 2 * i + 1;
}

// Function to get the right child index of a node
int rightChild(int i) {
    return 2 * i + 2;
}

// Function to heapify the Min-Heap
void heapify(struct MinHeap* heap, int i) {
    int left = leftChild(i);
    int right = rightChild(i);
    int smallest = i;

    if (left < heap->size && heap->arr[left] < heap->arr[smallest]) {
        smallest = left;
    }
    if (right < heap->size && heap->arr[right] < heap->arr[smallest]) {
        smallest = right;
    }
    if (smallest != i) {
        int temp = heap->arr[i];
        heap->arr[i] = heap->arr[smallest];
        heap->arr[smallest] = temp;
        heapify(heap, smallest);
    }
}

// Function to insert a new element in the Min-Heap
void insert(struct MinHeap* heap, int key) {
    if (heap->size == MAX) {
        printf("Heap is full\n");
        return;
    }
    heap->size++;
    heap->arr[heap->size - 1] = key;

    // Fix the min-heap property
    int i = heap->size - 1;
    while (i != 0 && heap->arr[parent(i)] > heap->arr[i]) {
        int temp = heap->arr[i];
        heap->arr[i] = heap->arr[parent(i)];
        heap->arr[parent(i)] = temp;
        i = parent(i);
    }
}

// Function to extract the minimum element
int extractMin(struct MinHeap* heap) {
    if (heap->size <= 0) {
        return -1;
    }
    if (heap->size == 1) {
        heap->size--;
        return heap->arr[0];
    }

    // Store the minimum value and replace the root with the last element
    int root = heap->arr[0];
    heap->arr[0] = heap->arr[heap->size - 1];
    heap->size--;
    heapify(heap, 0);

    return root;
}

// Function to print the Min-Heap
void printMinHeap(struct MinHeap* heap) {
    for (int i = 0; i < heap->size; i++) {
        printf("%d ", heap->arr[i]);
    }
    printf("\n");
}

int main() {
    struct MinHeap heap;
    initMinHeap(&heap);

    insert(&heap, 3);
    insert(&heap, 2);
    insert(&heap, 15);

    printf("Min-Heap: ");
    printMinHeap(&heap);

    printf("Extracted Min: %d\n", extractMin(&heap));
    printf("Min-Heap after extraction: ");
    printMinHeap(&heap);

    return 0;
}                    

Last Modified: January 13, 2025 07:03:39

max-heap.c

                    // Program to implement a Max-Heap
#include <stdio.h>
#include <stdlib.h>

#define MAX 100

// Max-Heap structure
struct MaxHeap {
    int arr[MAX];
    int size;
};

// Function to initialize the Max-Heap
void initMaxHeap(struct MaxHeap* heap) {
    heap->size = 0;
}

// Function to get the parent index of a node
int parent(int i) {
    return (i - 1) / 2;
}

// Function to get the left child index of a node
int leftChild(int i) {
    return 2 * i + 1;
}

// Function to get the right child index of a node
int rightChild(int i) {
    return 2 * i + 2;
}

// Function to heapify the Max-Heap
void heapify(struct MaxHeap* heap, int i) {
    int left = leftChild(i);
    int right = rightChild(i);
    int largest = i;

    if (left < heap->size && heap->arr[left] > heap->arr[largest]) {
        largest = left;
    }
    if (right < heap->size && heap->arr[right] > heap->arr[largest]) {
        largest = right;
    }
    if (largest != i) {
        int temp = heap->arr[i];
        heap->arr[i] = heap->arr[largest];
        heap->arr[largest] = temp;
        heapify(heap, largest);
    }
}

// Function to insert a new element in the Max-Heap
void insert(struct MaxHeap* heap, int key) {
    if (heap->size == MAX) {
        printf("Heap is full\n");
        return;
    }
    heap->size++;
    heap->arr[heap->size - 1] = key;

    // Fix the max-heap property
    int i = heap->size - 1;
    while (i != 0 && heap->arr[parent(i)] < heap->arr[i]) {
        int temp = heap->arr[i];
        heap->arr[i] = heap->arr[parent(i)];
        heap->arr[parent(i)] = temp;
        i = parent(i);
    }
}

// Function to extract the maximum element
int extractMax(struct MaxHeap* heap) {
    if (heap->size <= 0) {
        return -1;
    }
    if (heap->size == 1) {
        heap->size--;
        return heap->arr[0];
    }

    // Store the maximum value and replace the root with the last element
    int root = heap->arr[0];
    heap->arr[0] = heap->arr[heap->size - 1];
    heap->size--;
    heapify(heap, 0);

    return root;
}

// Function to print the Max-Heap
void printMaxHeap(struct MaxHeap* heap) {
    for (int i = 0; i < heap->size; i++) {
        printf("%d ", heap->arr[i]);
    }
    printf("\n");
}

int main() {
    struct MaxHeap heap;
    initMaxHeap(&heap);

    insert(&heap, 3);
    insert(&heap, 2);
    insert(&heap, 15);

    printf("Max-Heap: ");
    printMaxHeap(&heap);

    printf("Extracted Max: %d\n", extractMax(&heap));
    printf("Max-Heap after extraction: ");
    printMaxHeap(&heap);

    return 0;
}                    

Last Modified: January 13, 2025 07:03:55

heap-sort.c

                    // Program to perform Heap Sort
#include <stdio.h>
#include <stdlib.h>

#define MAX 100

// Function to swap two elements
void swap(int* a, int* b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

// Function to heapify a subtree rooted at index i
void heapify(int arr[], int n, int i) {
    int largest = i;
    int left = 2 * i + 1;
    int right = 2 * i + 2;

    if (left < n && arr[left] > arr[largest]) {
        largest = left;
    }
    if (right < n && arr[right] > arr[largest]) {
        largest = right;
    }

    if (largest != i) {
        swap(&arr[i], &arr[largest]);
        heapify(arr, n, largest);
    }
}

// Function to perform heap sort
void heapSort(int arr[], int n) {
    // Build a max-heap
    for (int i = n / 2 - 1; i >= 0; i--) {
        heapify(arr, n, i);
    }

    // Extract elements one by one from the heap
    for (int i = n - 1; i >= 0; i--) {
        swap(&arr[0], &arr[i]);
        heapify(arr, i, 0);
    }
}

// Function to print an array
void printArray(int arr[], int n) {
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

int main() {
    int arr[] = {12, 11, 13, 5, 6, 7};
    int n = sizeof(arr) / sizeof(arr[0]);

    heapSort(arr, n);

    printf("Sorted array: ");
    printArray(arr, n);

    return 0;
}                    

Last Modified: January 13, 2025 07:04:09

kth-largest-element.c

                    // Program to find the kth largest element using a heap
#include <stdio.h>
#include <stdlib.h>

#define MAX 100

// Function to heapify a subtree rooted at index i
void heapify(int arr[], int n, int i) {
    int largest = i;
    int left = 2 * i + 1;
    int right = 2 * i + 2;

    if (left < n && arr[left] > arr[largest]) {
        largest = left;
    }
    if (right < n && arr[right] > arr[largest]) {
        largest = right;
    }

    if (largest != i) {
        int temp = arr[i];
        arr[i] = arr[largest];
        arr[largest] = temp;
        heapify(arr, n, largest);
    }
}

// Function to find the kth largest element
int kthLargest(int arr[], int n, int k) {
    // Build a max-heap
    for (int i = n / 2 - 1; i >= 0; i--) {
        heapify(arr, n, i);
    }

    // Extract max k times
    for (int i = n - 1; i >= n - k; i--) {
        int temp = arr[0];
        arr[0] = arr[i];
        arr[i] = temp;
        heapify(arr, i, 0);
    }

    return arr[n - k];
}

int main() {
    int arr[] = {12, 3, 5, 7, 19};
    int n = sizeof(arr) / sizeof(arr[0]);
    int k = 2;

    printf("The %dth largest element is %d\n", k, kthLargest(arr, n, k));

    return 0;
}                    

Last Modified: January 13, 2025 07:04:24

merge-k-sorted-arrays.c

                    // Program to merge k sorted arrays using a heap
#include <stdio.h>
#include <stdlib.h>

#define MAX 100

// A structure to store a heap node
struct HeapNode {
    int val;
    int row;
    int col;
};

// Min-Heap to store the heap nodes
struct MinHeap {
    struct HeapNode arr[MAX];
    int size;
};

// Function to initialize the Min-Heap
void initMinHeap(struct MinHeap* heap) {
    heap->size = 0;
}

// Function to swap two elements
void swap(struct HeapNode* a, struct HeapNode* b) {
    struct HeapNode temp = *a;
    *a = *b;
    *b = temp;
}

// Function to heapify the Min-Heap
void heapify(struct MinHeap* heap, int i) {
    int smallest = i;
    int left = 2 * i + 1;
    int right = 2 * i + 2;

    if (left < heap->size && heap->arr[left].val < heap->arr[smallest].val) {
        smallest = left;
    }
    if (right < heap->size && heap->arr[right].val < heap->arr[smallest].val) {
        smallest = right;
    }
    if (smallest != i) {
        swap(&heap->arr[i], &heap->arr[smallest]);
        heapify(heap, smallest);
    }
}

// Function to insert a new element into the heap
void insert(struct MinHeap* heap, struct HeapNode node) {
    if (heap->size == MAX) {
        return;
    }
    heap->arr[heap->size] = node;
    int i = heap->size;
    heap->size++;

    while (i != 0 && heap->arr[(i - 1) / 2].val > heap->arr[i].val) {
        swap(&heap->arr[i], &heap->arr[(i - 1) / 2]);
        i = (i - 1) / 2;
    }
}

// Function to extract the minimum element
struct HeapNode extractMin(struct MinHeap* heap) {
    struct HeapNode root = heap->arr[0];
    heap->arr[0] = heap->arr[heap->size - 1];
    heap->size--;
    heapify(heap, 0);
    return root;
}

// Function to merge k sorted arrays using a Min-Heap
void mergeKSortedArrays(int arr[][MAX], int n, int k) {
    struct MinHeap heap;
    initMinHeap(&heap);

    // Insert the first element of each array into the heap
    for (int i = 0; i < k; i++) {
        struct HeapNode node = {arr[i][0], i, 0};
        insert(&heap, node);
    }

    // Extract the minimum element and insert the next element from the same array
    while (heap.size > 0) {
        struct HeapNode node = extractMin(&heap);
        printf("%d ", node.val);

        if (node.col + 1 < n) {
            struct HeapNode newNode = {arr[node.row][node.col + 1], node.row, node.col + 1};
            insert(&heap, newNode);
        }
    }
}

int main() {
    int arr[3][5] = {{1, 4, 7, 8, 10},
                     {2, 5, 8, 9, 11},
                     {3, 6, 9, 10, 12}};
    int k = 3;
    int n = 5;

    printf("Merged array: ");
    mergeKSortedArrays(arr, n, k);
    printf("\n");

    return 0;
}                    

Last Modified: January 13, 2025 07:04:46

graph-representation.c

                    // Program to represent a graph using adjacency matrix and adjacency list
#include <stdio.h>
#include <stdlib.h>

#define MAX_VERTICES 5

// Graph using adjacency matrix
struct GraphMatrix {
    int adjMatrix[MAX_VERTICES][MAX_VERTICES];
};

// Graph using adjacency list
struct GraphList {
    struct Node* adjList[MAX_VERTICES];
};

// Node for adjacency list
struct Node {
    int data;
    struct Node* next;
};

// Function to create a new adjacency list node
struct Node* createNode(int data) {
    struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
    newNode->data = data;
    newNode->next = NULL;
    return newNode;
}

// Function to add an edge to adjacency matrix
void addEdgeMatrix(struct GraphMatrix* graph, int u, int v) {
    graph->adjMatrix[u][v] = 1;
    graph->adjMatrix[v][u] = 1;
}

// Function to add an edge to adjacency list
void addEdgeList(struct GraphList* graph, int u, int v) {
    struct Node* newNode = createNode(v);
    newNode->next = graph->adjList[u];
    graph->adjList[u] = newNode;

    newNode = createNode(u);
    newNode->next = graph->adjList[v];
    graph->adjList[v] = newNode;
}

// Function to print the adjacency matrix
void printGraphMatrix(struct GraphMatrix* graph) {
    for (int i = 0; i < MAX_VERTICES; i++) {
        for (int j = 0; j < MAX_VERTICES; j++) {
            printf("%d ", graph->adjMatrix[i][j]);
        }
        printf("\n");
    }
}

// Function to print the adjacency list
void printGraphList(struct GraphList* graph) {
    for (int i = 0; i < MAX_VERTICES; i++) {
        struct Node* temp = graph->adjList[i];
        printf("Vertex %d: ", i);
        while (temp != NULL) {
            printf("%d ", temp->data);
            temp = temp->next;
        }
        printf("\n");
    }
}

int main() {
    struct GraphMatrix graphMatrix;
    struct GraphList graphList;

    // Initialize graph
    for (int i = 0; i < MAX_VERTICES; i++) {
        for (int j = 0; j < MAX_VERTICES; j++) {
            graphMatrix.adjMatrix[i][j] = 0;
        }
        graphList.adjList[i] = NULL;
    }

    // Add edges
    addEdgeMatrix(&graphMatrix, 0, 1);
    addEdgeMatrix(&graphMatrix, 0, 2);
    addEdgeList(&graphList, 0, 1);
    addEdgeList(&graphList, 0, 2);

    // Print graph
    printf("Adjacency Matrix:\n");
    printGraphMatrix(&graphMatrix);

    printf("Adjacency List:\n");
    printGraphList(&graphList);

    return 0;
}                    

Last Modified: January 13, 2025 07:05:16

dfs-traversal.c

                    // Program to perform Depth First Search (DFS) traversal of a graph
#include <stdio.h>
#include <stdlib.h>

#define MAX_VERTICES 5

// Graph representation using adjacency list
struct Graph {
    struct Node* adjList[MAX_VERTICES];
};

// Node for adjacency list
struct Node {
    int data;
    struct Node* next;
};

// Function to create a new adjacency list node
struct Node* createNode(int data) {
    struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
    newNode->data = data;
    newNode->next = NULL;
    return newNode;
}

// Function to add an edge to the graph
void addEdge(struct Graph* graph, int u, int v) {
    struct Node* newNode = createNode(v);
    newNode->next = graph->adjList[u];
    graph->adjList[u] = newNode;

    newNode = createNode(u);
    newNode->next = graph->adjList[v];
    graph->adjList[v] = newNode;
}

// DFS function
void dfs(struct Graph* graph, int visited[], int vertex) {
    printf("%d ", vertex);
    visited[vertex] = 1;

    struct Node* temp = graph->adjList[vertex];
    while (temp != NULL) {
        int adjacent = temp->data;
        if (!visited[adjacent]) {
            dfs(graph, visited, adjacent);
        }
        temp = temp->next;
    }
}

int main() {
    struct Graph graph;
    for (int i = 0; i < MAX_VERTICES; i++) {
        graph.adjList[i] = NULL;
    }

    // Add edges
    addEdge(&graph, 0, 1);
    addEdge(&graph, 0, 2);
    addEdge(&graph, 1, 3);
    addEdge(&graph, 2, 3);
    addEdge(&graph, 3, 4);

    int visited[MAX_VERTICES] = {0};
    printf("DFS Traversal: ");
    dfs(&graph, visited, 0);

    return 0;
}                    

Last Modified: January 13, 2025 07:05:29

bfs-traversal.c

                    // Program to perform Breadth First Search (BFS) traversal of a graph
#include <stdio.h>
#include <stdlib.h>

#define MAX_VERTICES 5

// Graph representation using adjacency list
struct Graph {
    struct Node* adjList[MAX_VERTICES];
};

// Node for adjacency list
struct Node {
    int data;
    struct Node* next;
};

// Function to create a new adjacency list node
struct Node* createNode(int data) {
    struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
    newNode->data = data;
    newNode->next = NULL;
    return newNode;
}

// Function to add an edge to the graph
void addEdge(struct Graph* graph, int u, int v) {
    struct Node* newNode = createNode(v);
    newNode->next = graph->adjList[u];
    graph->adjList[u] = newNode;

    newNode = createNode(u);
    newNode->next = graph->adjList[v];
    graph->adjList[v] = newNode;
}

// BFS function
void bfs(struct Graph* graph, int start) {
    int visited[MAX_VERTICES] = {0};
    int queue[MAX_VERTICES];
    int front = 0, rear = -1;

    visited[start] = 1;
    queue[++rear] = start;

    while (front <= rear) {
        int vertex = queue[front++];
        printf("%d ", vertex);

        struct Node* temp = graph->adjList[vertex];
        while (temp != NULL) {
            int adjacent = temp->data;
            if (!visited[adjacent]) {
                visited[adjacent] = 1;
                queue[++rear] = adjacent;
            }
            temp = temp->next;
        }
    }
}

int main() {
    struct Graph graph;
    for (int i = 0; i < MAX_VERTICES; i++) {
        graph.adjList[i] = NULL;
    }

    // Add edges
    addEdge(&graph, 0, 1);
    addEdge(&graph, 0, 2);
    addEdge(&graph, 1, 3);
    addEdge(&graph, 2, 3);
    addEdge(&graph, 3, 4);

    printf("BFS Traversal starting from vertex 0: ");
    bfs(&graph, 0);

    return 0;
}                    

Last Modified: January 13, 2025 07:05:41

dijkstra-algorithm.c

                    // Program to find the shortest path using Dijkstra's algorithm
#include <stdio.h>
#include <limits.h>

#define V 5

// Function to find the vertex with the minimum distance value
int minDistance(int dist[], int sptSet[]) {
    int min = INT_MAX, minIndex;
    for (int v = 0; v < V; v++) {
        if (!sptSet[v] && dist[v] <= min) {
            min = dist[v];
            minIndex = v;
        }
    }
    return minIndex;
}

// Dijkstra's algorithm
void dijkstra(int graph[V][V], int src) {
    int dist[V];
    int sptSet[V];  // Shortest Path Tree Set

    for (int i = 0; i < V; i++) {
        dist[i] = INT_MAX;
        sptSet[i] = 0;
    }

    dist[src] = 0;

    for (int count = 0; count < V - 1; count++) {
        int u = minDistance(dist, sptSet);
        sptSet[u] = 1;

        for (int v = 0; v < V; v++) {
            if (!sptSet[v] && graph[u][v] && dist[u] != INT_MAX && dist[u] + graph[u][v] < dist[v]) {
                dist[v] = dist[u] + graph[u][v];
            }
        }
    }

    printf("Vertex Distance from Source (%d)\n", src);
    for (int i = 0; i < V; i++) {
        printf("%d \t\t %d\n", i, dist[i]);
    }
}

int main() {
    int graph[V][V] = {{0, 10, 0, 0, 20},
                       {10, 0, 50, 0, 0},
                       {0, 50, 0, 10, 0},
                       {0, 0, 10, 0, 5},
                       {20, 0, 0, 5, 0}};

    dijkstra(graph, 0);

    return 0;
}                    

Last Modified: January 13, 2025 07:05:55

kruskal-algorithm.c

                    // Program to find the Minimum Spanning Tree using Kruskal's algorithm
#include <stdio.h>
#include <stdlib.h>

#define V 4
#define E 5

// Edge structure for Kruskal's algorithm
struct Edge {
    int u, v, weight;
};

// Subset structure for Union-Find
struct Subset {
    int parent;
    int rank;
};

// Function to find the subset of an element
int find(struct Subset subsets[], int i) {
    if (subsets[i].parent != i) {
        subsets[i].parent = find(subsets, subsets[i].parent);
    }
    return subsets[i].parent;
}

// Function to do union of two subsets
void unionSets(struct Subset subsets[], int x, int y) {
    int rootX = find(subsets, x);
    int rootY = find(subsets, y);

    if (subsets[rootX].rank < subsets[rootY].rank) {
        subsets[rootX].parent = rootY;
    } else if (subsets[rootX].rank > subsets[rootY].rank) {
        subsets[rootY].parent = rootX;
    } else {
        subsets[rootY].parent = rootX;
        subsets[rootX].rank++;
    }
}

// Function to compare edges (used for sorting)
int compare(const void* a, const void* b) {
    return ((struct Edge*)a)->weight - ((struct Edge*)b)->weight;
}

// Kruskal's algorithm to find MST
void kruskal(struct Edge edges[], int V) {
    struct Subset* subsets = (struct Subset*)malloc(V * sizeof(struct Subset));

    // Sort edges by weight
    qsort(edges, E, sizeof(edges[0]), compare);

    // Initialize subsets
    for (int i = 0; i < V; i++) {
        subsets[i].parent = i;
        subsets[i].rank = 0;
    }

    // Construct MST
    printf("Edges in MST:\n");
    for (int i = 0; i < E; i++) {
        int x = find(subsets, edges[i].u);
        int y = find(subsets, edges[i].v);

        if (x != y) {
            printf("%d-%d (%d)\n", edges[i].u, edges[i].v, edges[i].weight);
            unionSets(subsets, x, y);
        }
    }

    free(subsets);
}

int main() {
    struct Edge edges[] = {{0, 1, 10}, {0, 3, 20}, {1, 2, 30}, {2, 3, 40}, {1, 3, 50}};
    kruskal(edges, V);
    return 0;
}                    

Last Modified: January 13, 2025 07:06:10

hash-table.c

                    // Program to implement a hash table with linear probing
#include <stdio.h>
#include <stdlib.h>

#define TABLE_SIZE 10

// Hash table structure
struct HashTable {
    int* table;
};

// Hash function
int hash(int key) {
    return key % TABLE_SIZE;
}

// Function to initialize the hash table
void initTable(struct HashTable* ht) {
    ht->table = (int*)malloc(TABLE_SIZE * sizeof(int));
    for (int i = 0; i < TABLE_SIZE; i++) {
        ht->table[i] = -1;  // -1 represents an empty slot
    }
}

// Function to insert an element using linear probing
void insert(struct HashTable* ht, int key) {
    int index = hash(key);
    while (ht->table[index] != -1) {
        index = (index + 1) % TABLE_SIZE;  // Linear probing
    }
    ht->table[index] = key;
}

// Function to search for an element
int search(struct HashTable* ht, int key) {
    int index = hash(key);
    while (ht->table[index] != -1) {
        if (ht->table[index] == key) {
            return index;  // Found
        }
        index = (index + 1) % TABLE_SIZE;  // Linear probing
    }
    return -1;  // Not found
}

// Function to display the hash table
void display(struct HashTable* ht) {
    for (int i = 0; i < TABLE_SIZE; i++) {
        if (ht->table[i] != -1) {
            printf("Index %d: %d\n", i, ht->table[i]);
        } else {
            printf("Index %d: (empty)\n", i);
        }
    }
}

int main() {
    struct HashTable ht;
    initTable(&ht);

    insert(&ht, 10);
    insert(&ht, 20);
    insert(&ht, 30);
    insert(&ht, 40);
    insert(&ht, 50);

    display(&ht);

    int key = 20;
    int index = search(&ht, key);
    if (index != -1) {
        printf("Element %d found at index %d\n", key, index);
    } else {
        printf("Element %d not found\n", key);
    }

    return 0;
}                    

Last Modified: January 13, 2025 07:07:32

chaining-hashing.c

                    // Program to implement separate chaining for collision resolution in hashing
#include <stdio.h>
#include <stdlib.h>

// Linked list node for separate chaining
struct Node {
    int data;
    struct Node* next;
};

// Hash table structure
struct HashTable {
    struct Node** table;
    int size;
};

// Hash function
int hash(int key, int size) {
    return key % size;
}

// Function to create a new node
struct Node* createNode(int data) {
    struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
    newNode->data = data;
    newNode->next = NULL;
    return newNode;
}

// Function to initialize the hash table
void initTable(struct HashTable* ht, int size) {
    ht->size = size;
    ht->table = (struct Node**)malloc(size * sizeof(struct Node*));
    for (int i = 0; i < size; i++) {
        ht->table[i] = NULL;
    }
}

// Function to insert an element
void insert(struct HashTable* ht, int key) {
    int index = hash(key, ht->size);
    struct Node* newNode = createNode(key);
    newNode->next = ht->table[index];
    ht->table[index] = newNode;
}

// Function to search for an element
int search(struct HashTable* ht, int key) {
    int index = hash(key, ht->size);
    struct Node* temp = ht->table[index];
    while (temp != NULL) {
        if (temp->data == key) {
            return 1;  // Found
        }
        temp = temp->next;
    }
    return 0;  // Not found
}

// Function to display the hash table
void display(struct HashTable* ht) {
    for (int i = 0; i < ht->size; i++) {
        struct Node* temp = ht->table[i];
        printf("Index %d: ", i);
        while (temp != NULL) {
            printf("%d -> ", temp->data);
            temp = temp->next;
        }
        printf("NULL\n");
    }
}

int main() {
    struct HashTable ht;
    initTable(&ht, 10);

    insert(&ht, 10);
    insert(&ht, 20);
    insert(&ht, 30);
    insert(&ht, 40);
    insert(&ht, 50);

    display(&ht);

    int key = 20;
    if (search(&ht, key)) {
        printf("Element %d found in the hash table.\n", key);
    } else {
        printf("Element %d not found in the hash table.\n", key);
    }

    return 0;
}                    

Last Modified: January 13, 2025 07:07:43

check-anagram.c

                    // Program to check if two strings are anagrams using hashing
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAX_CHAR 256

// Function to check if two strings are anagrams
int areAnagrams(char* str1, char* str2) {
    int count[MAX_CHAR] = {0};

    if (strlen(str1) != strlen(str2)) {
        return 0;
    }

    for (int i = 0; i < strlen(str1); i++) {
        count[str1[i]]++;
        count[str2[i]]--;
    }

    for (int i = 0; i < MAX_CHAR; i++) {
        if (count[i] != 0) {
            return 0; // Not anagrams
        }
    }
    return 1; // Anagrams
}

int main() {
    char str1[] = "listen";
    char str2[] = "silent";

    if (areAnagrams(str1, str2)) {
        printf("The strings are anagrams.\n");
    } else {
        printf("The strings are not anagrams.\n");
    }

    return 0;
}                    

Last Modified: January 13, 2025 07:08:25

count-distinct-elements.c

                    // Program to count distinct elements in an array using hashing
#include <stdio.h>
#include <stdlib.h>

// Function to count distinct elements
int countDistinct(int arr[], int n) {
    int* hashTable = (int*)calloc(n, sizeof(int));
    int count = 0;

    for (int i = 0; i < n; i++) {
        if (hashTable[arr[i]] == 0) {
            hashTable[arr[i]] = 1;
            count++;
        }
    }

    free(hashTable);
    return count;
}

int main() {
    int arr[] = {10, 20, 20, 10, 30, 40};
    int n = sizeof(arr) / sizeof(arr[0]);

    printf("Number of distinct elements: %d\n", countDistinct(arr, n));

    return 0;
}                    

Last Modified: January 13, 2025 07:08:42

subarray-with-sum.c

                    // Program to find a subarray with a given sum using hashing
#include <stdio.h>
#include <stdlib.h>
#include <unordered_map>

int subArrayWithSum(int arr[], int n, int sum) {
    std::unordered_map<int, int> hashMap;
    int currentSum = 0;

    for (int i = 0; i < n; i++) {
        currentSum += arr[i];
        
        if (currentSum == sum) {
            return 1;  // Subarray found
        }

        if (hashMap.find(currentSum - sum) != hashMap.end()) {
            return 1;  // Subarray found
        }

        hashMap[currentSum] = i;
    }

    return 0;  // No subarray found
}

int main() {
    int arr[] = {1, 4, 20, 3, 10, 5};
    int n = sizeof(arr) / sizeof(arr[0]);
    int sum = 33;

    if (subArrayWithSum(arr, n, sum)) {
        printf("Subarray with given sum found.\n");
    } else {
        printf("Subarray with given sum not found.\n");
    }

    return 0;
}                    

Last Modified: January 13, 2025 07:08:54

tower-of-hanoi.c

                    // Program to solve the Tower of Hanoi problem
#include <stdio.h>

// Function to solve Tower of Hanoi
void towerOfHanoi(int n, char from, char to, char aux) {
    if (n == 1) {
        printf("Move disk 1 from %c to %c\n", from, to);
        return;
    }
    towerOfHanoi(n - 1, from, aux, to);
    printf("Move disk %d from %c to %c\n", n, from, to);
    towerOfHanoi(n - 1, aux, to, from);
}

int main() {
    int n = 3;  // Number of disks
    towerOfHanoi(n, 'A', 'C', 'B');
    return 0;
}                    

Last Modified: January 13, 2025 07:09:11

job-scheduling.c

                    // Program to solve the job scheduling problem using greedy techniques
#include <stdio.h>
#include <stdlib.h>

// Job structure
struct Job {
    int id;
    int deadline;
    int profit;
};

// Comparator function for sorting jobs by profit
int compare(const void* a, const void* b) {
    return ((struct Job*)b)->profit - ((struct Job*)a)->profit;
}

// Function to find the maximum profit from job scheduling
void jobScheduling(struct Job jobs[], int n) {
    qsort(jobs, n, sizeof(jobs[0]), compare);

    int result[n];
    bool slot[n];
    for (int i = 0; i < n; i++) {
        slot[i] = false;
    }

    for (int i = 0; i < n; i++) {
        for (int j = jobs[i].deadline - 1; j >= 0; j--) {
            if (!slot[j]) {
                result[j] = i;
                slot[j] = true;
                break;
            }
        }
    }

    int totalProfit = 0;
    for (int i = 0; i < n; i++) {
        if (slot[i]) {
            totalProfit += jobs[result[i]].profit;
        }
    }

    printf("Total profit from job scheduling: %d\n", totalProfit);
}

int main() {
    struct Job jobs[] = {{1, 4, 50}, {2, 1, 60}, {3, 1, 20}, {4, 1, 30}};
    int n = sizeof(jobs) / sizeof(jobs[0]);

    jobScheduling(jobs, n);

    return 0;
}                    

Last Modified: January 13, 2025 07:09:25

knapsack-problem.c

                    // Program to solve the 0/1 Knapsack problem using dynamic programming
#include <stdio.h>

int knapsack(int W, int wt[], int val[], int n) {
    int dp[n + 1][W + 1];

    for (int i = 0; i <= n; i++) {
        for (int w = 0; w <= W; w++) {
            if (i == 0 || w == 0) {
                dp[i][w] = 0;
            } else if (wt[i - 1] <= w) {
                dp[i][w] = (val[i - 1] + dp[i - 1][w - wt[i - 1]] > dp[i - 1][w]) ? 
                            val[i - 1] + dp[i - 1][w - wt[i - 1]] : dp[i - 1][w];
            } else {
                dp[i][w] = dp[i - 1][w];
            }
        }
    }

    return dp[n][W];
}

int main() {
    int val[] = {60, 100, 120};
    int wt[] = {10, 20, 30};
    int W = 50;
    int n = sizeof(val) / sizeof(val[0]);

    printf("Maximum value in knapsack: %d\n", knapsack(W, wt, val, n));
    return 0;
}                    

Last Modified: January 13, 2025 07:09:41

longest-common-subsequence.c

                    // Program to find the longest common subsequence
#include <stdio.h>
#include <string.h>

int lcs(char* X, char* Y, int m, int n) {
    int dp[m + 1][n + 1];

    for (int i = 0; i <= m; i++) {
        for (int j = 0; j <= n; j++) {
            if (i == 0 || j == 0) {
                dp[i][j] = 0;
            } else if (X[i - 1] == Y[j - 1]) {
                dp[i][j] = dp[i - 1][j - 1] + 1;
            } else {
                dp[i][j] = (dp[i - 1][j] > dp[i][j - 1]) ? dp[i - 1][j] : dp[i][j - 1];
            }
        }
    }

    return dp[m][n];
}

int main() {
    char X[] = "AGGTAB";
    char Y[] = "GXTXAYB";
    int m = strlen(X);
    int n = strlen(Y);

    printf("Length of LCS: %d\n", lcs(X, Y, m, n));
    return 0;
}                    

Last Modified: January 13, 2025 07:09:54

trie-implementation.c

                    // Program to implement a Trie for storing strings
#include <stdio.h>
#include <stdlib.h>

#define ALPHABET_SIZE 26

// Trie node structure
struct TrieNode {
    struct TrieNode* children[ALPHABET_SIZE];
    int isEndOfWord;
};

// Function to create a new Trie node
struct TrieNode* createNode() {
    struct TrieNode* newNode = (struct TrieNode*)malloc(sizeof(struct TrieNode));
    newNode->isEndOfWord = 0;
    for (int i = 0; i < ALPHABET_SIZE; i++) {
        newNode->children[i] = NULL;
    }
    return newNode;
}

// Function to insert a word into the Trie
void insert(struct TrieNode* root, char* word) {
    struct TrieNode* node = root;
    for (int i = 0; word[i] != '\0'; i++) {
        int index = word[i] - 'a';
        if (node->children[index] == NULL) {
            node->children[index] = createNode();
        }
        node = node->children[index];
    }
    node->isEndOfWord = 1;
}

// Function to search for a word in the Trie
int search(struct TrieNode* root, char* word) {
    struct TrieNode* node = root;
    for (int i = 0; word[i] != '\0'; i++) {
        int index = word[i] - 'a';
        if (node->children[index] == NULL) {
            return 0; // Word not found
        }
        node = node->children[index];
    }
    return node->isEndOfWord;
}

int main() {
    struct TrieNode* root = createNode();

    insert(root, "hello");
    insert(root, "world");

    if (search(root, "hello")) {
        printf("Word 'hello' found in Trie.\n");
    } else {
        printf("Word 'hello' not found in Trie.\n");
    }

    if (search(root, "world")) {
        printf("Word 'world' found in Trie.\n");
    } else {
        printf("Word 'world' not found in Trie.\n");
    }

    return 0;
}                    

Last Modified: January 13, 2025 07:10:09

ADVERTISEMENT

Career Trends: Skills in Demand for 2025 How to Protect Your Privacy on Social Media The Importance of Backlinks in SEO Boost Your Website Traffic with These SEO Tips! What’s Behind the Rise of Electric Cars in America?
Career Trends: Skills in Demand for 2025 How to Protect Your Privacy on Social Media The Importance of Backlinks in SEO Boost Your Website Traffic with These SEO Tips! What’s Behind the Rise of Electric Cars in America?