Project 1 - Creation of user defined data type to implement the user interfaces for working with ‘Set’ (Mathematical Set theory) using Linked List
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node* next;
} Node;
typedef struct Set {
Node* head;
int size;
} Set;
// create an empty set
Set* set_create() {
Set* set = (Set*) malloc(sizeof(Set));
set->head = NULL;
set->size = 0;
return set;
}
// insert an element into the set
void set_insert(Set* set, int data) {
Node* node = (Node*) malloc(sizeof(Node));
node->data = data;
node->next = set->head;
set->head = node;
set->size++;
}
// delete an element from the set
void set_delete(Set* set, int data) {
Node* node = set->head;
Node* prev = NULL;
while (node != NULL && node->data != data) {
prev = node;
node = node->next;
}
if (node != NULL) {
if (prev == NULL) {
set->head = node->next;
} else {
prev->next = node->next;
}
free(node);
set->size--;
}
}
// check if an element is in the set
int set_contains(Set* set, int data) {
Node* node = set->head;
while (node != NULL) {
if (node->data == data) {
return 1;
}
node = node->next;
}
return 0;
}
// return the union of two sets
Set* set_union(Set* set1, Set* set2) {
Set* set = set_create();
Node* node = set1->head;
while (node != NULL) {
set_insert(set, node->data);
node = node->next;
}
node = set2->head;
while (node != NULL) {
if (!set_contains(set, node->data)) {
set_insert(set, node->data);
}
node = node->next;
}
return set;
}
// return the intersection of two sets
Set* set_intersection(Set* set1, Set* set2) {
Set* set = set_create();
Node* node = set1->head;
while (node != NULL) {
if (set_contains(set2, node->data)) {
set_insert(set, node->data);
}
node = node->next;