Untitled
unknown
c_cpp
a year ago
27 kB
10
Indexable
Stack - // Stack implementation in C #include <stdio.h> #include <stdlib.h> #define MAX 10 int count = 0; // Creating a stack struct stack { int items[MAX]; int top; }; typedef struct stack st; void createEmptyStack(st *s) { s->top = -1; } // Check if the stack is full int isfull(st *s) { if (s->top == MAX - 1) return 1; else return 0; } // Check if the stack is empty int isempty(st *s) { if (s->top == -1) return 1; else return 0; } // Add elements into stack void push(st *s, int newitem) { if (isfull(s)) { printf("STACK FULL"); } else { s->top++; s->items[s->top] = newitem; } count++; } // Remove element from stack void pop(st *s) { if (isempty(s)) { printf("\n STACK EMPTY \n"); } else { printf("Item popped= %d", s->items[s->top]); s->top--; } count--; printf("\n"); } // Print elements of stack void printStack(st *s) { printf("Stack: "); for (int i = 0; i < count; i++) { printf("%d ", s->items[i]); } printf("\n"); } // Driver code int main() { int ch; st *s = (st *)malloc(sizeof(st)); createEmptyStack(s); push(s, 1); push(s, 2); push(s, 3); push(s, 4); printStack(s); pop(s); printf("\nAfter popping out\n"); printStack(s); } ------------------------------------------------------------------------------------------------------------------------------ Queue - // Queue implementation in C #include <stdio.h> #define SIZE 5 void enQueue(int); void deQueue(); void display(); int items[SIZE], front = -1, rear = -1; int main() { //deQueue is not possible on empty queue deQueue(); //enQueue 5 elements enQueue(1); enQueue(2); enQueue(3); enQueue(4); enQueue(5); // 6th element can't be added to because the queue is full enQueue(6); display(); //deQueue removes element entered first i.e. 1 deQueue(); //Now we have just 4 elements display(); return 0; } void enQueue(int value) { if (rear == SIZE - 1) printf("\nQueue is Full!!"); else { if (front == -1) front = 0; rear++; items[rear] = value; printf("\nInserted -> %d", value); } } void deQueue() { if (front == -1) printf("\nQueue is Empty!!"); else { printf("\nDeleted : %d", items[front]); front++; if (front > rear) front = rear = -1; } } // Function to print the queue void display() { if (rear == -1) printf("\nQueue is Empty!!!"); else { int i; printf("\nQueue elements are:\n"); for (i = front; i <= rear; i++) printf("%d ", items[i]); } printf("\n"); } ------------------------------------------------------------------------------------------------------------------------------ Singly Linked List - #include<stdio.h> #include<conio.h> #include<stdlib.h> void insertAtBeginning(int); void insertAtEnd(int); void insertBetween(int,int,int); void display(); void removeBeginning(); void removeEnd(); void removeSpecific(int); struct Node { int data; struct Node *next; }*head = NULL; void main() { int choice,value,choice1,loc1,loc2; clrscr(); while(1){ mainMenu: printf("\n\n****** MENU ******\n1. Insert\n2. Display\n3. Delete\n4. Exit\nEnter your choice: "); scanf("%d",&choice); switch(choice) { case 1: printf("Enter the value to be insert: "); scanf("%d",&value); while(1){ printf("Where you want to insert: \n1. At Beginning\n2. At End\n3. Between\nEnter your choice: "); scanf("%d",&choice1); switch(choice1) { case 1: insertAtBeginning(value); break; case 2: insertAtEnd(value); break; case 3: printf("Enter the two values where you wanto insert: "); scanf("%d%d",&loc1,&loc2); insertBetween(value,loc1,loc2); break; default: printf("\nWrong Input!! Try again!!!\n\n"); goto mainMenu; } goto subMenuEnd; } subMenuEnd: break; case 2: display(); break; case 3: printf("How do you want to Delete: \n1. From Beginning\n2. From End\n3. Spesific\nEnter your choice: "); scanf("%d",&choice1); switch(choice1) { case 1: removeBeginning(); break; case 2: removeEnd(); break; case 3: printf("Enter the value which you wanto delete: "); scanf("%d",&loc2); removeSpecific(loc2); break; default: printf("\nWrong Input!! Try again!!!\n\n"); goto mainMenu; } break; case 4: exit(0); default: printf("\nWrong input!!! Try again!!\n\n"); } } } void insertAtBeginning(int value) { struct Node *newNode; newNode = (struct Node*)malloc(sizeof(struct Node)); newNode->data = value; if(head == NULL) { newNode->next = NULL; head = newNode; } else { newNode->next = head; head = newNode; } printf("\nOne node inserted!!!\n"); } void insertAtEnd(int value) { struct Node *newNode; newNode = (struct Node*)malloc(sizeof(struct Node)); newNode->data = value; newNode->next = NULL; if(head == NULL) head = newNode; else { struct Node *temp = head; while(temp->next != NULL) temp = temp->next; temp->next = newNode; } printf("\nOne node inserted!!!\n"); } void insertBetween(int value, int loc1, int loc2) { struct Node *newNode; newNode = (struct Node*)malloc(sizeof(struct Node)); newNode->data = value; if(head == NULL) { newNode->next = NULL; head = newNode; } else { struct Node *temp = head; while(temp->data != loc1 && temp->data != loc2) temp = temp->next; newNode->next = temp->next; temp->next = newNode; } printf("\nOne node inserted!!!\n"); } void removeBeginning() { if(head == NULL) printf("\n\nList is Empty!!!"); else { struct Node *temp = head; if(head->next == NULL) { head = NULL; free(temp); } else { head = temp->next; free(temp); printf("\nOne node deleted!!!\n\n"); } } } void removeEnd() { if(head == NULL) { printf("\nList is Empty!!!\n"); } else { struct Node *temp1 = head,*temp2; if(head->next == NULL) head = NULL; else { while(temp1->next != NULL) { temp2 = temp1; temp1 = temp1->next; } temp2->next = NULL; } free(temp1); printf("\nOne node deleted!!!\n\n"); } } void removeSpecific(int delValue) { struct Node *temp1 = head, *temp2; while(temp1->data != delValue) { if(temp1 -> next == NULL){ printf("\nGiven node not found in the list!!!"); goto functionEnd; } temp2 = temp1; temp1 = temp1 -> next; } temp2 -> next = temp1 -> next; free(temp1); printf("\nOne node deleted!!!\n\n"); functionEnd: } void display() { if(head == NULL) { printf("\nList is Empty\n"); } else { struct Node *temp = head; printf("\n\nList elements are - \n"); while(temp->next != NULL) { printf("%d --->",temp->data); temp = temp->next; } printf("%d --->NULL",temp->data); } } ------------------------------------------------------------------------------------------------------------------------------ Doubly Linked List - #include<stdio.h> #include<conio.h> void insertAtBeginning(int); void insertAtEnd(int); void insertAtAfter(int,int); void deleteBeginning(); void deleteEnd(); void deleteSpecific(int); void display(); struct Node { int data; struct Node *previous, *next; }*head = NULL; void main() { int choice1, choice2, value, location; clrscr(); while(1) { printf("\n*********** MENU *************\n"); printf("1. Insert\n2. Delete\n3. Display\n4. Exit\nEnter your choice: "); scanf("%d",&choice1); switch() { case 1: printf("Enter the value to be inserted: "); scanf("%d",&value); while(1) { printf("\nSelect from the following Inserting options\n"); printf("1. At Beginning\n2. At End\n3. After a Node\n4. Cancel\nEnter your choice: "); scanf("%d",&choice2); switch(choice2) { case 1: insertAtBeginning(value); break; case 2: insertAtEnd(value); break; case 3: printf("Enter the location after which you want to insert: "); scanf("%d",&location); insertAfter(value,location); break; case 4: goto EndSwitch; default: printf("\nPlease select correct Inserting option!!!\n"); } } case 2: while(1) { printf("\nSelect from the following Deleting options\n"); printf("1. At Beginning\n2. At End\n3. Specific Node\n4. Cancel\nEnter your choice: "); scanf("%d",&choice2); switch(choice2) { case 1: deleteBeginning(); break; case 2: deleteEnd(); break; case 3: printf("Enter the Node value to be deleted: "); scanf("%d",&location); deleteSpecic(location); break; case 4: goto EndSwitch; default: printf("\nPlease select correct Deleting option!!!\n"); } } EndSwitch: break; case 3: display(); break; case 4: exit(0); default: printf("\nPlease select correct option!!!"); } } } void insertAtBeginning(int value) { struct Node *newNode; newNode = (struct Node*)malloc(sizeof(struct Node)); newNode -> data = value; newNode -> previous = NULL; if(head == NULL) { newNode -> next = NULL; head = newNode; } else { newNode -> next = head; head = newNode; } printf("\nInsertion success!!!"); } void insertAtEnd(int value) { struct Node *newNode; newNode = (struct Node*)malloc(sizeof(struct Node)); newNode -> data = value; newNode -> next = NULL; if(head == NULL) { newNode -> previous = NULL; head = newNode; } else { struct Node *temp = head; while(temp -> next != NULL) temp = temp -> next; temp -> next = newNode; newNode -> previous = temp; } printf("\nInsertion success!!!"); } void insertAfter(int value, int location) { struct Node *newNode; newNode = (struct Node*)malloc(sizeof(struct Node)); newNode -> data = value; if(head == NULL) { newNode -> previous = newNode -> next = NULL; head = newNode; } else { struct Node *temp1 = head, temp2; while(temp1 -> data != location) { if(temp1 -> next == NULL) { printf("Given node is not found in the list!!!"); goto EndFunction; } else { temp1 = temp1 -> next; } } temp2 = temp1 -> next; temp1 -> next = newNode; newNode -> previous = temp1; newNode -> next = temp2; temp2 -> previous = newNode; printf("\nInsertion success!!!"); } EndFunction: } void deleteBeginning() { if(head == NULL) printf("List is Empty!!! Deletion not possible!!!"); else { struct Node *temp = head; if(temp -> previous == temp -> next) { head = NULL; free(temp); } else{ head = temp -> next; head -> previous = NULL; free(temp); } printf("\nDeletion success!!!"); } } void deleteEnd() { if(head == NULL) printf("List is Empty!!! Deletion not possible!!!"); else { struct Node *temp = head; if(temp -> previous == temp -> next) { head = NULL; free(temp); } else{ while(temp -> next != NULL) temp = temp -> next; temp -> previous -> next = NULL; free(temp); } printf("\nDeletion success!!!"); } } void deleteSpecific(int delValue) { if(head == NULL) printf("List is Empty!!! Deletion not possible!!!"); else { struct Node *temp = head; while(temp -> data != delValue) { if(temp -> next == NULL) { printf("\nGiven node is not found in the list!!!"); goto FuctionEnd; } else { temp = temp -> next; } } if(temp == head) { head = NULL; free(temp); } else { temp -> previous -> next = temp -> next; free(temp); } printf("\nDeletion success!!!"); } FuctionEnd: } void display() { if(head == NULL) printf("\nList is Empty!!!"); else { struct Node *temp = head; printf("\nList elements are: \n"); printf("NULL <--- "); while(temp -> next != NULL) { printf("%d <===> ",temp -> data); } printf("%d ---> NULL", temp -> data); } } ------------------------------------------------------------------------------------------------------------------------------ Binary Tree - // Tree traversal in C #include <stdio.h> #include <stdlib.h> struct node { int item; struct node* left; struct node* right; }; // Inorder traversal void inorderTraversal(struct node* root) { if (root == NULL) return; inorderTraversal(root->left); printf("%d ->", root->item); inorderTraversal(root->right); } // Preorder traversal void preorderTraversal(struct node* root) { if (root == NULL) return; printf("%d ->", root->item); preorderTraversal(root->left); preorderTraversal(root->right); } // Postorder traversal void postorderTraversal(struct node* root) { if (root == NULL) return; postorderTraversal(root->left); postorderTraversal(root->right); printf("%d ->", root->item); } // Create a new Node struct node* createNode(value) { struct node* newNode = malloc(sizeof(struct node)); newNode->item = value; newNode->left = NULL; newNode->right = NULL; return newNode; } // Insert on the left of the node struct node* insertLeft(struct node* root, int value) { root->left = createNode(value); return root->left; } // Insert on the right of the node struct node* insertRight(struct node* root, int value) { root->right = createNode(value); return root->right; } int main() { struct node* root = createNode(1); insertLeft(root, 2); insertRight(root, 3); insertLeft(root->left, 4); printf("Inorder traversal \n"); inorderTraversal(root); printf("\nPreorder traversal \n"); preorderTraversal(root); printf("\nPostorder traversal \n"); postorderTraversal(root); } ------------------------------------------------------------------------------------------------------------------------------ Binary Search Tree - // Binary Search Tree operations in C #include <stdio.h> #include <stdlib.h> struct node { int key; struct node *left, *right; }; // Create a node struct node *newNode(int item) { struct node *temp = (struct node *)malloc(sizeof(struct node)); temp->key = item; temp->left = temp->right = NULL; return temp; } // Inorder Traversal void inorder(struct node *root) { if (root != NULL) { // Traverse left inorder(root->left); // Traverse root printf("%d -> ", root->key); // Traverse right inorder(root->right); } } // Insert a node struct node *insert(struct node *node, int key) { // Return a new node if the tree is empty if (node == NULL) return newNode(key); // Traverse to the right place and insert the node if (key < node->key) node->left = insert(node->left, key); else node->right = insert(node->right, key); return node; } // Find the inorder successor struct node *minValueNode(struct node *node) { struct node *current = node; // Find the leftmost leaf while (current && current->left != NULL) current = current->left; return current; } // Deleting a node struct node *deleteNode(struct node *root, int key) { // Return if the tree is empty if (root == NULL) return root; // Find the node to be deleted if (key < root->key) root->left = deleteNode(root->left, key); else if (key > root->key) root->right = deleteNode(root->right, key); else { // If the node is with only one child or no child if (root->left == NULL) { struct node *temp = root->right; free(root); return temp; } else if (root->right == NULL) { struct node *temp = root->left; free(root); return temp; } // If the node has two children struct node *temp = minValueNode(root->right); // Place the inorder successor in position of the node to be deleted root->key = temp->key; // Delete the inorder successor root->right = deleteNode(root->right, temp->key); } return root; } // Driver code int main() { struct node *root = NULL; root = insert(root, 8); root = insert(root, 3); root = insert(root, 1); root = insert(root, 6); root = insert(root, 7); root = insert(root, 10); root = insert(root, 14); root = insert(root, 4); printf("Inorder traversal: "); inorder(root); printf("\nAfter deleting 10\n"); root = deleteNode(root, 10); printf("Inorder traversal: "); inorder(root); } ------------------------------------------------------------------------------------------------------------------------------ DFS - // DFS algorithm in C #include <stdio.h> #include <stdlib.h> struct node { int vertex; struct node* next; }; struct node* createNode(int v); struct Graph { int numVertices; int* visited; // We need int** to store a two dimensional array. // Similary, we need struct node** to store an array of Linked lists struct node** adjLists; }; // DFS algo void DFS(struct Graph* graph, int vertex) { struct node* adjList = graph->adjLists[vertex]; struct node* temp = adjList; graph->visited[vertex] = 1; printf("Visited %d \n", vertex); while (temp != NULL) { int connectedVertex = temp->vertex; if (graph->visited[connectedVertex] == 0) { DFS(graph, connectedVertex); } temp = temp->next; } } // Create a node struct node* createNode(int v) { struct node* newNode = malloc(sizeof(struct node)); newNode->vertex = v; newNode->next = NULL; return newNode; } // Create graph struct Graph* createGraph(int vertices) { struct Graph* graph = malloc(sizeof(struct Graph)); graph->numVertices = vertices; graph->adjLists = malloc(vertices * sizeof(struct node*)); graph->visited = malloc(vertices * sizeof(int)); int i; for (i = 0; i < vertices; i++) { graph->adjLists[i] = NULL; graph->visited[i] = 0; } return graph; } // Add edge void addEdge(struct Graph* graph, int src, int dest) { // Add edge from src to dest struct node* newNode = createNode(dest); newNode->next = graph->adjLists[src]; graph->adjLists[src] = newNode; // Add edge from dest to src newNode = createNode(src); newNode->next = graph->adjLists[dest]; graph->adjLists[dest] = newNode; } // Print the graph void printGraph(struct Graph* graph) { int v; for (v = 0; v < graph->numVertices; v++) { struct node* temp = graph->adjLists[v]; printf("\n Adjacency list of vertex %d\n ", v); while (temp) { printf("%d -> ", temp->vertex); temp = temp->next; } printf("\n"); } } int main() { struct Graph* graph = createGraph(4); addEdge(graph, 0, 1); addEdge(graph, 0, 2); addEdge(graph, 1, 2); addEdge(graph, 2, 3); printGraph(graph); DFS(graph, 2); return 0; } ------------------------------------------------------------------------------------------------------------------------------ AVL Tree - // AVL tree implementation in C #include <stdio.h> #include <stdlib.h> // Create Node struct Node { int key; struct Node *left; struct Node *right; int height; }; int max(int a, int b); // Calculate height int height(struct Node *N) { if (N == NULL) return 0; return N->height; } int max(int a, int b) { return (a > b) ? a : b; } // Create a node struct Node *newNode(int key) { struct Node *node = (struct Node *) malloc(sizeof(struct Node)); node->key = key; node->left = NULL; node->right = NULL; node->height = 1; return (node); } // Right rotate struct Node *rightRotate(struct Node *y) { struct Node *x = y->left; struct Node *T2 = x->right; x->right = y; y->left = T2; y->height = max(height(y->left), height(y->right)) + 1; x->height = max(height(x->left), height(x->right)) + 1; return x; } // Left rotate struct Node *leftRotate(struct Node *x) { struct Node *y = x->right; struct Node *T2 = y->left; y->left = x; x->right = T2; x->height = max(height(x->left), height(x->right)) + 1; y->height = max(height(y->left), height(y->right)) + 1; return y; } // Get the balance factor int getBalance(struct Node *N) { if (N == NULL) return 0; return height(N->left) - height(N->right); } // Insert node struct Node *insertNode(struct Node *node, int key) { // Find the correct position to insertNode the node and insertNode it if (node == NULL) return (newNode(key)); if (key < node->key) node->left = insertNode(node->left, key); else if (key > node->key) node->right = insertNode(node->right, key); else return node; // Update the balance factor of each node and // Balance the tree node->height = 1 + max(height(node->left), height(node->right)); int balance = getBalance(node); if (balance > 1 && key < node->left->key) return rightRotate(node); if (balance < -1 && key > node->right->key) return leftRotate(node); if (balance > 1 && key > node->left->key) { node->left = leftRotate(node->left); return rightRotate(node); } if (balance < -1 && key < node->right->key) { node->right = rightRotate(node->right); return leftRotate(node); } return node; } struct Node *minValueNode(struct Node *node) { struct Node *current = node; while (current->left != NULL) current = current->left; return current; } // Delete a nodes struct Node *deleteNode(struct Node *root, int key) { // Find the node and delete it if (root == NULL) return root; if (key < root->key) root->left = deleteNode(root->left, key); else if (key > root->key) root->right = deleteNode(root->right, key); 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->key = temp->key; root->right = deleteNode(root->right, temp->key); } } if (root == NULL) return root; // Update the balance factor of each node and // balance the tree root->height = 1 + max(height(root->left), height(root->right)); int balance = getBalance(root); if (balance > 1 && getBalance(root->left) >= 0) return rightRotate(root); if (balance > 1 && getBalance(root->left) < 0) { root->left = leftRotate(root->left); return rightRotate(root); } if (balance < -1 && getBalance(root->right) <= 0) return leftRotate(root); if (balance < -1 && getBalance(root->right) > 0) { root->right = rightRotate(root->right); return leftRotate(root); } return root; } // Print the tree void printPreOrder(struct Node *root) { if (root != NULL) { printf("%d ", root->key); printPreOrder(root->left); printPreOrder(root->right); } } int main() { struct Node *root = NULL; root = insertNode(root, 2); root = insertNode(root, 1); root = insertNode(root, 7); root = insertNode(root, 4); root = insertNode(root, 5); root = insertNode(root, 3); root = insertNode(root, 8); printPreOrder(root); root = deleteNode(root, 3); printf("\nAfter deletion: "); printPreOrder(root); return 0; } ------------------------------------------------------------------------------------------------------------------------------ Hashing using Linear Probing - // C program for the above approach #include <stdio.h> #include <stdlib.h> struct HashNode { int key; int value; }; const int capacity = 20; int size = 0; struct HashNode** arr; struct HashNode* dummy; // Function to add key value pair void insert(int key, int V) { struct HashNode* temp = (struct HashNode*)malloc(sizeof(struct HashNode)); temp->key = key; temp->value = V; // Apply hash function to find // index for given key int hashIndex = key % capacity; // Find next free space while (arr[hashIndex] != NULL && arr[hashIndex]->key != key && arr[hashIndex]->key != -1) { hashIndex++; hashIndex %= capacity; } // If new node to be inserted // increase the current size if (arr[hashIndex] == NULL || arr[hashIndex]->key == -1) size++; arr[hashIndex] = temp; } // Function to delete a key value pair int delete (int key) { // Apply hash function to find // index for given key int hashIndex = key % capacity; // Finding the node with given // key while (arr[hashIndex] != NULL) { // if node found if (arr[hashIndex]->key == key) { // Insert dummy node here // for further use arr[hashIndex] = dummy; // Reduce size size--; // Return the value of the key return 1; } hashIndex++; hashIndex %= capacity; } // If not found return null return 0; } // Function to search the value // for a given key int find(int key) { // Apply hash function to find // index for given key int hashIndex = (key % capacity); int counter = 0; // Find the node with given key while (arr[hashIndex] != NULL) { int counter = 0; // If counter is greater than // capacity if (counter++ > capacity) break; // If node found return its // value if (arr[hashIndex]->key == key) return arr[hashIndex]->value; hashIndex++; hashIndex %= capacity; } // If not found return // -1 return -1; } // Driver Code int main() { // Space allocation arr = (struct HashNode**)malloc(sizeof(struct HashNode*) * capacity); // Assign NULL initially for (int i = 0; i < capacity; i++) arr[i] = NULL; dummy = (struct HashNode*)malloc(sizeof(struct HashNode)); dummy->key = -1; dummy->value = -1; insert(1, 5); insert(2, 15); insert(3, 20); insert(4, 7); if (find(4) != -1) printf("Value of Key 4 = %d\n", find(4)); else printf("Key 4 does not exists\n"); if (delete (4)) printf("Node value of key 4 is deleted " "successfully\n"); else { printf("Key does not exists\n"); } if (find(4) != -1) printf("Value of Key 4 = %d\n", find(4)); else printf("Key 4 does not exists\n"); }
Editor is loading...
Leave a Comment