Untitled

mail@pastecode.io avatar
unknown
plain_text
2 years ago
3.8 kB
1
Indexable
Never
/*
    Coded by: David Roman
    Date: 06.04.2023
*/

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

// Define the Node struct
struct Node {
    int data;
    struct Node* next;
    struct Node* prev;
};

// 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;
    newNode->prev = NULL;
    return newNode;
}

// Function to add a node at the end of the list
void addNode(struct Node** head, int data) {
    struct Node* newNode = createNode(data);
    if (*head == NULL) {
        *head = newNode;
        return;
    }
    struct Node* temp = *head;
    while (temp->next != NULL) {
        temp = temp->next;
    }
    temp->next = newNode;
    newNode->prev = temp;
}

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

// Function to remove duplicates in the doubly linked list by sorting and removing adjacent elements with the same value
void removeDuplicates(struct Node** head) {
    // Sort the list
    struct Node* current = *head;
    while (current->next != NULL) {
        struct Node* temp = current->next;
        while (temp != NULL) {
            if (current->data > temp->data) {
                int tempData = current->data;
                current->data = temp->data;
                temp->data = tempData;
            }
            temp = temp->next;
        }
        current = current->next;
    }
    // Remove adjacent elements with the same value
    current = *head;
    while (current != NULL && current->next != NULL) {
        if (current->data == current->next->data) {
            struct Node* temp = current->next;
            current->next = current->next->next;
            if (current->next != NULL) {
                current->next->prev = current;
            }
            free(temp);
        } else {
            current = current->next;
        }
    }
}

// Function to remove duplicates in the doubly linked list by comparing each element with the remaining elements
void removeDuplicates2(struct Node** head) {
    struct Node* current = *head;
    while (current != NULL) {
        struct Node* temp = current->next;
        while (temp != NULL) {
            if (current->data == temp->data) {
                struct Node* toDelete = temp;
                temp = temp->next;
                if (toDelete->prev != NULL) {
                    toDelete->prev->next = toDelete->next;
                } else {
                    *head = toDelete->next;
                }
                if (toDelete->next != NULL) {
                    toDelete->next->prev = toDelete->prev;
                }
                free(toDelete);
            } else {
                temp = temp->next;
            }
        }
        current = current->next;
    }
}

// Main function
int main() {
    struct Node* head = NULL;
    // Generate random integers and add them to the list
    for (int i = 0; i < 200; i++) {
        addNode(&head, rand() % 50);
    }
    printf("Original List:\n");
    printList(head);

    // Remove duplicates using the first method (sorting and removing adjacent elements)
    removeDuplicates(&head);
    printf("List after removing duplicates using the first method:\n");
    printList(head);

    // Remove duplicates using the second method (comparing each element with the remaining elements)
    removeDuplicates2(&head);
    printf("List after removing duplicates using the second method:\n");
    printList(head);

    return 0;
}