Upload files to "DS/C/endsem-omnibus"
This commit is contained in:
parent
c53746d826
commit
091ec8cd90
132
DS/C/endsem-omnibus/order.c
Normal file
132
DS/C/endsem-omnibus/order.c
Normal file
@ -0,0 +1,132 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
// Node structure for binary tree
|
||||
struct Node {
|
||||
char data;
|
||||
struct Node *left, *right;
|
||||
};
|
||||
|
||||
// Stack structure for tree construction
|
||||
struct Stack {
|
||||
struct Node **array;
|
||||
int top;
|
||||
int capacity;
|
||||
};
|
||||
|
||||
// Function to create a new node
|
||||
struct Node* newNode(char data) {
|
||||
struct Node* node = (struct Node*)malloc(sizeof(struct Node));
|
||||
node->data = data;
|
||||
node->left = node->right = NULL;
|
||||
return node;
|
||||
}
|
||||
|
||||
// Stack operations
|
||||
struct Stack* createStack(int capacity) {
|
||||
struct Stack* stack = (struct Stack*)malloc(sizeof(struct Stack));
|
||||
stack->capacity = capacity;
|
||||
stack->top = -1;
|
||||
stack->array = (struct Node**)malloc(stack->capacity * sizeof(struct Node*));
|
||||
return stack;
|
||||
}
|
||||
|
||||
void push(struct Stack* stack, struct Node* item) {
|
||||
stack->array[++stack->top] = item;
|
||||
}
|
||||
|
||||
struct Node* pop(struct Stack* stack) {
|
||||
if (stack->top == -1) return NULL;
|
||||
return stack->array[stack->top--];
|
||||
}
|
||||
|
||||
// Search for index in inorder array
|
||||
int search(char arr[], char x, int n) {
|
||||
for (int i = 0; i < n; i++)
|
||||
if (arr[i] == x)
|
||||
return i;
|
||||
return -1;
|
||||
}
|
||||
|
||||
// Build tree from given inorder and preorder traversals
|
||||
struct Node* buildTree(char inorder[], char preorder[], int inStart, int inEnd, int* preIndex, int n) {
|
||||
if (inStart > inEnd) return NULL;
|
||||
|
||||
struct Node* node = newNode(preorder[*preIndex]);
|
||||
(*preIndex)++;
|
||||
|
||||
if (inStart == inEnd) return node;
|
||||
|
||||
int inIndex = search(inorder, node->data, n);
|
||||
|
||||
node->left = buildTree(inorder, preorder, inStart, inIndex-1, preIndex, n);
|
||||
node->right = buildTree(inorder, preorder, inIndex+1, inEnd, preIndex, n);
|
||||
|
||||
return node;
|
||||
}
|
||||
|
||||
// Different traversal functions
|
||||
void printPreorder(struct Node* node) {
|
||||
if (node == NULL) return;
|
||||
printf("%c ", node->data);
|
||||
printPreorder(node->left);
|
||||
printPreorder(node->right);
|
||||
}
|
||||
|
||||
void printInorder(struct Node* node) {
|
||||
if (node == NULL) return;
|
||||
printInorder(node->left);
|
||||
printf("%c ", node->data);
|
||||
printInorder(node->right);
|
||||
}
|
||||
|
||||
void printPostorder(struct Node* node) {
|
||||
if (node == NULL) return;
|
||||
printPostorder(node->left);
|
||||
printPostorder(node->right);
|
||||
printf("%c ", node->data);
|
||||
}
|
||||
|
||||
// Convert between different traversals
|
||||
void convertTraversal(char input[], char type1[], char type2[], int n) {
|
||||
// Create arrays to store traversals
|
||||
char inorder[100], preorder[100];
|
||||
int preIndex = 0;
|
||||
|
||||
// If input is preorder, use it directly
|
||||
if (strcmp(type1, "preorder") == 0) {
|
||||
strcpy(preorder, input);
|
||||
strcpy(inorder, type2);
|
||||
}
|
||||
// If input is inorder, use it with preorder
|
||||
else if (strcmp(type1, "inorder") == 0) {
|
||||
strcpy(inorder, input);
|
||||
strcpy(preorder, type2);
|
||||
}
|
||||
|
||||
// Build tree from traversals
|
||||
struct Node* root = buildTree(inorder, preorder, 0, n-1, &preIndex, n);
|
||||
|
||||
// Print requested traversal
|
||||
printf("\nConverted traversal: ");
|
||||
if (strcmp(type2, "preorder") == 0)
|
||||
printPreorder(root);
|
||||
else if (strcmp(type2, "inorder") == 0)
|
||||
printInorder(root);
|
||||
else if (strcmp(type2, "postorder") == 0)
|
||||
printPostorder(root);
|
||||
}
|
||||
|
||||
int main() {
|
||||
// Example usage
|
||||
char input[] = "DBEAFC"; // Input traversal
|
||||
char type1[] = "preorder"; // Type of input traversal
|
||||
char type2[] = "postorder"; // Required output traversal
|
||||
int n = strlen(input);
|
||||
|
||||
printf("Input %s traversal: %s\n", type1, input);
|
||||
convertTraversal(input, type1, type2, n);
|
||||
|
||||
return 0;
|
||||
}
|
79
DS/C/endsem-omnibus/queues.c
Normal file
79
DS/C/endsem-omnibus/queues.c
Normal file
@ -0,0 +1,79 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#define MAX 5
|
||||
|
||||
int queue[MAX];
|
||||
int front = -1, rear = -1;
|
||||
|
||||
void enqueue() {
|
||||
int item;
|
||||
if(rear == MAX-1) {
|
||||
printf("\nQueue is Full");
|
||||
}
|
||||
else {
|
||||
printf("\nEnter element to insert: ");
|
||||
scanf("%d", &item);
|
||||
if(front == -1 && rear == -1) {
|
||||
front = rear = 0;
|
||||
}
|
||||
else {
|
||||
rear++;
|
||||
}
|
||||
queue[rear] = item;
|
||||
printf("\nItem inserted successfully");
|
||||
}
|
||||
}
|
||||
|
||||
void dequeue() {
|
||||
if(front == -1 || front > rear) {
|
||||
printf("\nQueue is Empty");
|
||||
}
|
||||
else {
|
||||
printf("\nDeleted element is: %d", queue[front]);
|
||||
if(front == rear) {
|
||||
front = rear = -1;
|
||||
}
|
||||
else {
|
||||
front++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void display() {
|
||||
int i;
|
||||
if(front == -1 || front > rear) {
|
||||
printf("\nQueue is Empty");
|
||||
}
|
||||
else {
|
||||
printf("\nQueue elements are:\n");
|
||||
for(i = front; i <= rear; i++) {
|
||||
printf("%d ", queue[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int main() {
|
||||
int choice;
|
||||
while(1) {
|
||||
printf("\n\n1. Insert\n2. Delete\n3. Display\n4. Exit");
|
||||
printf("\nEnter your choice: ");
|
||||
scanf("%d", &choice);
|
||||
|
||||
switch(choice) {
|
||||
case 1:
|
||||
enqueue();
|
||||
break;
|
||||
case 2:
|
||||
dequeue();
|
||||
break;
|
||||
case 3:
|
||||
display();
|
||||
break;
|
||||
case 4:
|
||||
exit(0);
|
||||
default:
|
||||
printf("\nInvalid Choice");
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
79
DS/C/endsem-omnibus/stacks.c
Normal file
79
DS/C/endsem-omnibus/stacks.c
Normal file
@ -0,0 +1,79 @@
|
||||
#include <stdio.h>
|
||||
#define MAX_SIZE 100
|
||||
|
||||
int top = -1;
|
||||
int stack[MAX_SIZE];
|
||||
|
||||
void push(int c) {
|
||||
if (top < MAX_SIZE - 1) {
|
||||
stack[++top] = c;
|
||||
} else {
|
||||
printf("Stack overflow\n");
|
||||
}
|
||||
}
|
||||
|
||||
int pop() {
|
||||
if (top >= 0) {
|
||||
return stack[top--];
|
||||
} else {
|
||||
printf("Stack underflow\n");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
void display() {
|
||||
printf("The stack is: ");
|
||||
for (int i = top; i >= 0; i--) {
|
||||
printf("%d\t", stack[i]);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
int isEmpty() {
|
||||
return top == -1;
|
||||
}
|
||||
|
||||
int peek() {
|
||||
if (!isEmpty()) {
|
||||
return stack[top];
|
||||
} else {
|
||||
printf("Stack is empty\n");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
int main() {
|
||||
int choice;
|
||||
while (1) {
|
||||
printf("1. Push\n2. Pop\n3. Display\n4. Peek\n5. Check if Empty\n6. Exit\n");
|
||||
scanf("%d", &choice);
|
||||
switch (choice) {
|
||||
case 1:
|
||||
printf("Enter an element: ");
|
||||
int element;
|
||||
scanf("%d", &element);
|
||||
push(element);
|
||||
break;
|
||||
case 2:
|
||||
printf("The top element is: %d\n", pop());
|
||||
break;
|
||||
case 3:
|
||||
display();
|
||||
break;
|
||||
case 4:
|
||||
printf("The top element is: %d\n", peek());
|
||||
break;
|
||||
case 5:
|
||||
if (isEmpty()) {
|
||||
printf("Stack is empty\n");
|
||||
} else {
|
||||
printf("Stack is not empty\n");
|
||||
}
|
||||
break;
|
||||
case 6:
|
||||
return 0;
|
||||
default:
|
||||
printf("Invalid choice.\n");
|
||||
}
|
||||
}
|
||||
}
|
363
DS/C/endsem-omnibus/treefunc.c
Normal file
363
DS/C/endsem-omnibus/treefunc.c
Normal file
@ -0,0 +1,363 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#define MAX 10
|
||||
#define MAXQ 10
|
||||
|
||||
// Node structure for binary tree - contains data and pointers to left and right children
|
||||
typedef struct Node {
|
||||
int data;
|
||||
struct Node* lchild;
|
||||
struct Node* rchild;
|
||||
} Node;
|
||||
|
||||
// Queue structure for level order traversal
|
||||
typedef struct {
|
||||
Node* arr[MAX];
|
||||
int front;
|
||||
int rear;
|
||||
} queue;
|
||||
|
||||
// Check if queue is full
|
||||
int isFullq(queue* q) {
|
||||
return (q->rear == MAX-1);
|
||||
}
|
||||
|
||||
// Check if queue is empty
|
||||
int isEmptyq(queue* q) {
|
||||
return (q->front == -1);
|
||||
}
|
||||
|
||||
// Add element to queue
|
||||
void enqueue(queue* q, Node* value) {
|
||||
if(isFullq(q)) {
|
||||
printf("Overflow");
|
||||
return;
|
||||
}
|
||||
else {
|
||||
q->arr[++(q->rear)] = value;
|
||||
if(q->front == -1) {
|
||||
q->front = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Remove and return element from queue
|
||||
Node* dequeue(queue* q) {
|
||||
Node* x;
|
||||
if(isEmptyq(q)) {
|
||||
printf("Underflow");
|
||||
return NULL;
|
||||
}
|
||||
else if(q->front == q->rear) {
|
||||
x = q->arr[q->front];
|
||||
q->front = q->rear = -1;
|
||||
return x;
|
||||
}
|
||||
else {
|
||||
x = q->arr[(q->front)++];
|
||||
return x;
|
||||
}
|
||||
}
|
||||
|
||||
// Stack structure for iterative traversals
|
||||
typedef struct {
|
||||
Node* arr[MAX];
|
||||
int top;
|
||||
} STACK;
|
||||
|
||||
// Check if stack is full
|
||||
int isFull(STACK* s) {
|
||||
return s->top == MAX-1;
|
||||
}
|
||||
|
||||
// Check if stack is empty
|
||||
int isEmpty(STACK* s) {
|
||||
return s->top == -1;
|
||||
}
|
||||
|
||||
// Push element onto stack
|
||||
void push(STACK* s, Node* value) {
|
||||
if(isFull(s)) {
|
||||
printf("Stack Overflow");
|
||||
return;
|
||||
}
|
||||
else {
|
||||
s->arr[++(s->top)] = value;
|
||||
}
|
||||
}
|
||||
|
||||
// Pop and return element from stack
|
||||
Node* pop(STACK* s) {
|
||||
if(isEmpty(s)) {
|
||||
printf("Stack underflow");
|
||||
return NULL;
|
||||
}
|
||||
else {
|
||||
return s->arr[(s->top)--];
|
||||
}
|
||||
}
|
||||
|
||||
// Create new tree node
|
||||
Node* getNode() {
|
||||
Node* newNode = (Node*)malloc(sizeof(Node));
|
||||
newNode->data = 0;
|
||||
newNode->lchild = NULL;
|
||||
newNode->rchild = NULL;
|
||||
return newNode;
|
||||
}
|
||||
|
||||
// Recursively create binary tree
|
||||
Node* createTree(int item) {
|
||||
if(item != -1) {
|
||||
Node* t = getNode();
|
||||
t->data = item;
|
||||
|
||||
int x;
|
||||
printf("Enter the left child of %d (-1 for no child): ", item);
|
||||
scanf("%d", &x);
|
||||
t->lchild = createTree(x);
|
||||
|
||||
printf("Enter the right child of %d (-1 for no child): ", item);
|
||||
scanf("%d", &x);
|
||||
t->rchild = createTree(x);
|
||||
|
||||
return t;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// Recursive preorder traversal (Root-Left-Right)
|
||||
void preorder(Node* root) {
|
||||
if(root != NULL) {
|
||||
printf("%d ", root->data);
|
||||
preorder(root->lchild);
|
||||
preorder(root->rchild);
|
||||
}
|
||||
}
|
||||
|
||||
// Recursive inorder traversal (Left-Root-Right)
|
||||
void inorder(Node* root) {
|
||||
if(root != NULL) {
|
||||
inorder(root->lchild);
|
||||
printf("%d ", root->data);
|
||||
inorder(root->rchild);
|
||||
}
|
||||
}
|
||||
|
||||
// Recursive postorder traversal (Left-Right-Root)
|
||||
void postorder(Node* root) {
|
||||
if(root != NULL) {
|
||||
postorder(root->lchild);
|
||||
postorder(root->rchild);
|
||||
printf("%d ", root->data);
|
||||
}
|
||||
}
|
||||
|
||||
// Level order traversal using queue
|
||||
void levelorder(Node* root) {
|
||||
if(root == NULL) return;
|
||||
queue q;
|
||||
q.front = -1;
|
||||
q.rear = -1;
|
||||
Node* t = root;
|
||||
printf("%d ", t->data);
|
||||
enqueue(&q, t);
|
||||
while(!isEmptyq(&q)) {
|
||||
t = dequeue(&q);
|
||||
if(t->lchild) {
|
||||
printf("%d ", t->lchild->data);
|
||||
enqueue(&q, t->lchild);
|
||||
}
|
||||
if(t->rchild) {
|
||||
printf("%d ", t->rchild->data);
|
||||
enqueue(&q, t->rchild);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Iterative preorder traversal using stack
|
||||
void itrpre(Node* root) {
|
||||
STACK s;
|
||||
s.top = -1;
|
||||
Node* t = root;
|
||||
while(t != NULL || !isEmpty(&s)) {
|
||||
if(t != NULL) {
|
||||
printf("%d ", t->data);
|
||||
push(&s, t);
|
||||
t = t->lchild;
|
||||
}
|
||||
else {
|
||||
t = pop(&s);
|
||||
t = t->rchild;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Iterative inorder traversal using stack
|
||||
void itrin(Node* root) {
|
||||
STACK s;
|
||||
s.top = -1;
|
||||
Node* t = root;
|
||||
while(t != NULL || !isEmpty(&s)) {
|
||||
if(t != NULL) {
|
||||
push(&s, t);
|
||||
t = t->lchild;
|
||||
}
|
||||
else {
|
||||
t = pop(&s);
|
||||
printf("%d ", t->data);
|
||||
t = t->rchild;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Iterative postorder traversal using stack
|
||||
void itrpost(Node* root) {
|
||||
STACK s;
|
||||
s.top = -1;
|
||||
Node* t = root;
|
||||
Node* visit = NULL;
|
||||
while(t != NULL || !isEmpty(&s)) {
|
||||
if(t != NULL) {
|
||||
push(&s, t);
|
||||
t = t->lchild;
|
||||
}
|
||||
else {
|
||||
Node* p = s.arr[s.top];
|
||||
if(p->rchild != NULL && p->rchild != visit)
|
||||
t = p->rchild;
|
||||
else {
|
||||
printf("%d ", p->data);
|
||||
visit = pop(&s);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Count total number of nodes in tree
|
||||
int count(Node* root) {
|
||||
Node* p = root;
|
||||
int x, y;
|
||||
if(p != NULL) {
|
||||
x = count(p->lchild);
|
||||
y = count(p->rchild);
|
||||
return x + y + 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Calculate sum of all node values in tree
|
||||
int sumnodes(Node* root) {
|
||||
Node* p = root;
|
||||
int x, y;
|
||||
if(p != NULL) {
|
||||
x = sumnodes(p->lchild);
|
||||
y = sumnodes(p->rchild);
|
||||
return x + y + p->data;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Search for element in tree
|
||||
int Search(Node* root, int ele) {
|
||||
if(root == NULL)
|
||||
return 0;
|
||||
if(root->data == ele)
|
||||
return 1;
|
||||
if(Search(root->lchild, ele))
|
||||
return 1;
|
||||
return Search(root->rchild, ele);
|
||||
}
|
||||
|
||||
// Display menu of operations
|
||||
void displayMenu() {
|
||||
printf("\n=== Binary Tree Operations ===\n");
|
||||
printf("1. Create a new tree\n");
|
||||
printf("2. Recursive Preorder Traversal\n");
|
||||
printf("3. Recursive Inorder Traversal\n");
|
||||
printf("4. Recursive Postorder Traversal\n");
|
||||
printf("5. Iterative Preorder Traversal\n");
|
||||
printf("6. Iterative Inorder Traversal\n");
|
||||
printf("7. Iterative Postorder Traversal\n");
|
||||
printf("8. Level Order Traversal\n");
|
||||
printf("9. Count Nodes\n");
|
||||
printf("10. Sum of Nodes\n");
|
||||
printf("11. Search Element\n");
|
||||
printf("0. Exit\n");
|
||||
printf("Enter your choice: ");
|
||||
}
|
||||
|
||||
int main() {
|
||||
Node* root = NULL;
|
||||
int choice, rootnum, searchEle;
|
||||
|
||||
do {
|
||||
displayMenu();
|
||||
scanf("%d", &choice);
|
||||
|
||||
switch(choice) {
|
||||
case 1:
|
||||
printf("Enter data for root node: ");
|
||||
scanf("%d", &rootnum);
|
||||
root = createTree(rootnum);
|
||||
printf("Tree created successfully!\n");
|
||||
break;
|
||||
case 2:
|
||||
printf("Recursive Preorder Traversal: ");
|
||||
preorder(root);
|
||||
printf("\n");
|
||||
break;
|
||||
case 3:
|
||||
printf("Recursive Inorder Traversal: ");
|
||||
inorder(root);
|
||||
printf("\n");
|
||||
break;
|
||||
case 4:
|
||||
printf("Recursive Postorder Traversal: ");
|
||||
postorder(root);
|
||||
printf("\n");
|
||||
break;
|
||||
case 5:
|
||||
printf("Iterative Preorder Traversal: ");
|
||||
itrpre(root);
|
||||
printf("\n");
|
||||
break;
|
||||
case 6:
|
||||
printf("Iterative Inorder Traversal: ");
|
||||
itrin(root);
|
||||
printf("\n");
|
||||
break;
|
||||
case 7:
|
||||
printf("Iterative Postorder Traversal: ");
|
||||
itrpost(root);
|
||||
printf("\n");
|
||||
break;
|
||||
case 8:
|
||||
printf("Level Order Traversal: ");
|
||||
levelorder(root);
|
||||
printf("\n");
|
||||
break;
|
||||
case 9:
|
||||
printf("Number of nodes: %d\n", count(root));
|
||||
break;
|
||||
case 10:
|
||||
printf("Sum of all nodes: %d\n", sumnodes(root));
|
||||
break;
|
||||
case 11:
|
||||
printf("Enter element to search: ");
|
||||
scanf("%d", &searchEle);
|
||||
if(Search(root, searchEle))
|
||||
printf("Element found in the tree\n");
|
||||
else
|
||||
printf("Element not found in the tree\n");
|
||||
break;
|
||||
case 0:
|
||||
printf("Exiting program...\n");
|
||||
break;
|
||||
default:
|
||||
printf("Invalid choice! Please try again.\n");
|
||||
}
|
||||
} while(choice != 0);
|
||||
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue
Block a user