Project 1 - Creation of user defined data type to implement the user interfaces for working with ‘Set’ (Mathematical Set theory)
Code:
|
// C program to find union // and intersection of two unsorted // linked lists #include <stdbool.h> #include<stdio.h> #include<stdlib.h> /* Link list node */ struct Node { int data; struct Node* next; }; /* A utility function to insert a node at the beginning of a linked list*/ /* 2. put in the data */ //new_node->data = new_data// /* 3. Make next of new node as head */ //new_node->next = (*file_ref)// /* 4. move the head to point to the new node */ //(*file_ref) = new_node// void push(struct Node** file_ref, int new_data); /* A utility function to check if given data is present in a list */ bool isPresent(struct Node* file, int data); /* Function to get union of two linked lists file1 and file2 */ struct Node* getUnion(struct Node* file1, struct Node* file2) { struct Node* result = NULL; struct Node *t1 = file1, *t2 = file2; // Insert all elements of // list1 to the result list while (t1 != NULL) { push(&result, t1->data); t1 = t1->next; } // Insert those elements of list2 // which are not present in result list while (t2 != NULL) { if (!isPresent(result, t2->data)) push(&result, t2->data); t2 = t2->next; } return result; } /* Function to get intersection of two linked lists file1 and file2 */ struct Node* getIntersection(struct Node* file1, struct Node* file2) { struct Node* result = NULL; struct Node* t1 = file1; struct Node* t2=file2; // Traverse list1 and search each element of it in // list2. If the element is present in list 2, then // insert the element to result while (t1 != NULL) { if (isPresent(result, t1->data)) push(&result, t1->data); t1 = t1->next; } while (t2 != NULL) { if (!isPresent(result, t2->data)) push(&result, t2->data); t2 = t2->next; } return result; } /* A utility function to insert a node at the beginning of a linked list*/ void push(struct Node** file_ref, int new_data) { /* allocate node */ struct Node* new_node = (struct Node*)malloc(sizeof(struct Node)); /* put in the data */ new_node->data = new_data; /* link the old list off the new node */ new_node->next = (*file_ref); /* move the head to point to the new node */ (*file_ref) = new_node; } /* A utility function to print a linked list*/ void printList(struct Node* node) { while (node != NULL) { printf("%d ", node->data); node = node->next; } } /* A utility function that returns true if data is present in linked list else return false */ bool isPresent(struct Node* file, int data) { struct Node* t = file; while (t != NULL) { if (t->data == data) return 1; t = t->next; } return 0; } /* Driver program to test above function*/ int main() { /* Start with the empty list */ struct Node* file1 = NULL; struct Node* file2 = NULL; struct Node* intersecn = NULL; struct Node* unin = NULL; /*create a linked lists 15310245->15310246->15310247->15310248 */ push(&file1, 15310245); push(&file1, 15310246); push(&file1, 15310247); push(&file1, 15310248); /*create a linked lists 15310245->15310248->15310249->15310250 */ push(&file2, 15310245); push(&file2, 15310248); push(&file2, 15310249); push(&file2, 15310250); intersecn = getIntersection(file1, file2); unin = getUnion(file1,file2); printf("\n First list is \n"); printList(file1); printf("\n Second list is \n"); printList(file2); printf("\n Intersection list is \n"); printList(intersecn); printf("\n Union list is \n"); printList(unin); return 0; } |
comment:
- Time Complexity: O(m*n).
O(m+n) it means that the algorithm will take O(m) time when m>n and O(n) when m<n. - For union: For every element in list-2 we check if that element is already present in the resultant list made using list-1.
For intersection: For every element in list-1 we check if that element is also present in list-2.
Output:
