DLL Week 3 Honors Alejandro Herrera

Code pasted in here for easier readibility.
 avatar
unknown
c_cpp
3 years ago
4.5 kB
7
Indexable
/* HONORS */

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

typedef struct list{struct list *prev; int num; struct list *next;} list;

list *main_list;

// List of functions
void add_elem();
void eliminate_all_duplicates();
void eliminate_duplicate();
void generate_random_list();
void print_list();
void sort_list();
void sort_once();

int main()
{
    int size = 200; // Size of the list

    srand(time(0));
    
    generate_random_list(size);

    printf("\nInitial List: \n");
    print_list(main_list);
    fflush(stdout);
    
    sort_list(size);

    printf("\nInitial list sorted: \n");
    print_list(main_list);
    fflush(stdout);

    eliminate_all_duplicates(size);
    fflush(stdout);

    printf("\nList WITHOUT Duplicates\n");
    print_list(main_list);
    fflush(stdout);

    return 0;
}

// Code to print a list

void print_list()
{
    int i = 0;

    list *head = main_list;

    // Iterating back to point at the beginning
    while (head -> prev != NULL)
    {
        head = head -> prev;
    }

    while (head != NULL)
    {
        if (i % 5 == 0)
        {
            printf("\n");
        }

        printf("%d\t", head -> num);
        head = head -> next;

        i++;
    }

    printf("\n");
}

// Code to add an element to the list
void add_elem(int d)
{
    list *head, *temp;

    head = (list *) malloc(sizeof(list));
    
    head -> num = d;

    if (main_list == NULL)
    {
        head -> next = NULL;
        head -> prev = NULL;
        main_list = head; 
    }
    else
    {
        temp = main_list;
        while(temp -> next != NULL)
        {
            temp = temp -> next;
        }
        temp -> next = head;
        head -> prev = temp;
        head -> next = NULL;
    }
}

// Generate a random list with a predefined size
void generate_random_list(int size)
{
    int rand_num;

    for (int i = 1; i <= size; i++)
    {
        rand_num = rand() % 50;
        add_elem(rand_num);
    }
}

// Sort the list once
void sort_once()
{
    list *temp;

    // Iterating back to point at the beginning
    while (main_list -> prev != NULL)
    {
        main_list = main_list -> prev;
    }

    while (main_list -> next != NULL)
    {
        if(main_list -> num > main_list -> next -> num)
        {
            temp = (list *) malloc(sizeof(list));

            temp -> prev = main_list -> next;
            temp -> num = main_list -> num;
            temp -> next = main_list -> next -> next;

            main_list -> num = main_list -> next -> num;
            main_list -> next = temp;
        }

        main_list = main_list -> next;
    }
}

// Iteration to sort
void sort_list(int size)
{
    for (int i = 1; i <= size; i++)
    {
        sort_once();
    }
}

// Eliminate one duplicate from the list 
void eliminate_duplicate()
{
    // Iterating back to point at the beginning
    while (main_list -> prev != NULL)
    {
        main_list = main_list -> prev;
    }

    list *next_main = main_list;
    list *temp;

    int avoid; // Exiting condition

    next_main = next_main -> next;

    while (main_list -> next != NULL)
    {
        avoid = 0;

        if (main_list -> num == next_main -> num)
        {

            if (next_main -> next == NULL)
            {
                temp = next_main;
                temp -> prev -> next = temp -> next;
                temp = temp -> prev;

                main_list -> next -> prev = temp -> prev;
                main_list -> next -> num = temp -> num;
                main_list -> next = NULL;

                temp = NULL;

                return;
            }
            
            temp = next_main;
            temp -> prev -> next = temp -> next;

            main_list -> next -> prev = temp -> next -> prev;
            main_list -> next -> num = temp -> next -> num;
            main_list -> next = temp -> next;

            temp = NULL;

            main_list = main_list -> next;
            next_main = next_main -> next;

            avoid = 1;

        }

        if (avoid == 0)
        {
            main_list = main_list -> next;
            next_main = next_main -> next;
        }
    }
}

// Iteration to eliminate all duplicates
void eliminate_all_duplicates(int size)
{
    for (int i = 1; i <= size; i++)
    {
        eliminate_duplicate();
    }
}
Editor is loading...