week 3 honours

 avatar
unknown
c_cpp
4 years ago
2.3 kB
10
Indexable
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>

/*
    Linked-list data structure, made up of nodes
*/
struct node {
    int data;
    struct node* next;
    struct node* previous;
};

typedef struct node node;

/*
    Generates a linked-list of given size
*/
node* generate_list(int size, int range) {

    node* head = malloc(sizeof(node));

    node* current = head;
    node* previous = NULL;
    int i;
    for(i = 0;i < size;i++) {
        current->data = rand() % range;
        if(previous != NULL) {
            current->previous = previous;
        }
        previous = current;
        if(i < (size - 1)) {
            node* next = malloc(sizeof(node));
            current->next = next;
            current = next;
        } else {
            current->next = NULL;
        }
    }

    return head;
}

/*
    Prints the given list on the screen
*/
void print_list(node* head) {
    
    int count = 0;

    while(head->next != NULL) {
        printf("%d\t", head->data);
        head = head->next;
        if(++count == 5) {
            printf("\n");
            count = 0;
        }
    }
    printf("%d\n\n", head->data);
}

/*
Removes the given number from the list recursively
*/
void remove_number(node* head, int number) {

    if(head->next == NULL) {
        return;
    }
    
    if(head->next->data == number) {
        node* duplicate = head->next;
        head->next = duplicate->next;
        if(head->next != NULL) {
            head->next->previous = head;
        }
        free(duplicate);
    }
    if(head->next != NULL) {
        if(head->next->data == number) {
            remove_number(head, number);
        } else {
            remove_number(head->next, number);
        }
    }
}

/*
    Removes duplicates from the given list
*/
void remove_duplicates(node* head) {
    node* current = head;

    while(current != NULL) {
        remove_number(current, current->data);
        current = current->next;
    }
}

int main(void) {
    srand(time(0));

    int size = 200, range = 50;

    node* head = generate_list(size, range);
    printf("Before removing duplicates:\n");
    print_list(head);
    remove_duplicates(head);
    printf("After removing duplicates:\n");
    print_list(head);

}
Editor is loading...