NMAMITLOOP

Astro in brief

Find out what makes Astro awesome!

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

struct Node
{
    int value;
    struct Node *rlink, *llink;
};

typedef struct Node *NODE;

NODE get_node(int value)
{
    NODE node = (NODE)malloc(sizeof(NODE));
    node->value = value;
    node->rlink = NULL;
    node->llink = NULL;
    return node;
}

void free_node(NODE node)
{
    free(node);
}

NODE insert_front(NODE first, int value)
{
    NODE new_node = get_node(value);
    printf("sucessully inserted %d \n", value);
    if (first == NULL)
        return new_node;
    first->llink = new_node;
    new_node->rlink = first;
    return new_node;
}

NODE insert_rear(NODE first, int value)
{
    NODE new_node = get_node(value);
    printf("sucessully inserted %d \n", value);
    if (first == NULL)
        return new_node;
    NODE last_node = first;
    while (last_node->rlink != NULL)
        last_node = last_node->rlink;
    last_node->rlink = new_node;
    new_node->llink = last_node;
    return first;
}

NODE insert_at(NODE first, int value, int index)
{
    // first node has index of 1 ; not to write for lab
    NODE new_node = get_node(value);
    if (first == NULL)
        return new_node;
    if (index == 1)
        return insert_front(first, value);
    NODE curr_node = first;
    for (int pos = 1; (pos < index - 1 && curr_node->rlink != NULL); pos++)
        curr_node = curr_node->rlink;
    new_node->rlink = curr_node->rlink;
    if (curr_node->rlink != NULL)
        curr_node->rlink->llink = new_node;
    curr_node->rlink = new_node;
    new_node->llink = curr_node;
    printf("sucessully inserted %d \n", value);
    return first;
}

NODE delete_front(NODE first)
{
    if (first == NULL)
    {
        printf("DLL is empty\n");
        return NULL;
    }
    NODE next_node = first->rlink;
    if (next_node != NULL)
        next_node->llink = NULL;
    printf("sucessully deleted %d \n", first->value);
    free_node(first);
    return next_node;
}

NODE delete_rear(NODE first)
{
    if (first == NULL)
    {
        printf("DLL is empty\n");
        return NULL;
    }
    NODE last_node = first;
    while (last_node->rlink != NULL)
        last_node = last_node->rlink;
    if (last_node->llink == NULL)
        first = NULL;
    else
        last_node->llink->rlink = NULL;
    printf("sucessully deleted %d \n", last_node->value);
    free_node(last_node);
    return first;
}

NODE delete_at(NODE first, int index)
{
    // first node has index of 1 ; not to write for lab
    if (first == NULL)
    {
        printf("DLL is empty\n");
        return NULL;
    }
    if (index == 1)
        return delete_front(first);
    NODE delete_node = first->rlink;
    int pos = 2;
    while (delete_node != NULL)
    {
        if (pos == index)
        {
            delete_node->llink->rlink = delete_node->rlink;
            if (delete_node->rlink != NULL)
                delete_node->rlink->llink = delete_node->llink;
            printf("sucessully deleted %d \n", delete_node->value);
            free_node(delete_node);
            return first;
        }
        delete_node = delete_node->rlink;
        pos++;
    }
    printf("could not delete : index out of range\n");
    return first;
}

void display(NODE first)
{
    if (first == NULL)
        printf("DLL is empty\n");
    else
    {
        int count = 0;
        for (NODE curr_node = first; curr_node != NULL; curr_node = curr_node->rlink, count++)
            printf("%d ", curr_node->value);
        printf("\nThere are %d nodes\n", count);
    }
}

int main()
{
    printf("dll\n");
    printf("1: insert front\n");
    printf("2: insert rear\n");
    printf("3: delete front \n");
    printf("4: delete rear\n");
    printf("5: insert at\n");
    printf("6: delete at\n");
    printf("7: display \n");
    printf("8: quit program\n");

    int choice, value, position;
    NODE first = NULL;
    while (1)
    {
        printf("Enter the choice: ");
        scanf("%d", &choice);
        switch (choice)
        {
        case 1:
            printf("Enter the element be inserted: ");
            scanf("%d", &value);
            first = insert_front(first, value);
            break;
        case 2:
            printf("Enter the element be inserted: ");
            scanf("%d", &value);
            first = insert_rear(first, value);
            break;
        case 3:
            first = delete_front(first);
            break;
        case 4:
            first = delete_rear(first);
            break;
        case 5:
            printf("Enter the element be inserted: ");
            scanf("%d", &value);
            printf("Enter the position: ");
            scanf("%d", &position);
            first = insert_at(first, value, position);
            break;
        case 6:
            printf("Enter the position: ");
            scanf("%d", &position);
            first = delete_at(first, position);
            break;
        case 7:
            display(first);
            break;
        case 8:
            printf("exiting...\n");
            return 0;
        default:
            printf("INVALID OPTION\n");
            break;
        }
    }
    return 0;
}