Untitled

 avatar
unknown
plain_text
a year ago
3.1 kB
4
Indexable
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Node {
    int data;
    struct Node* next;
    struct Node* previous;
};

struct GiantInt {
    struct Node* head;
    struct Node* tail;
    int size;
};

struct Node* createNode(int value) {
    struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
    newNode->data = value;
    newNode->next = NULL;
    newNode->previous = NULL;
    return newNode;
}

struct GiantInt* createGiantInt() {
    struct GiantInt* newGiantInt = (struct GiantInt*)malloc(sizeof(struct GiantInt));
    newGiantInt->head = NULL;
    newGiantInt->tail = NULL;
    newGiantInt->size = 0;
    return newGiantInt;
}

void insertAtHead(struct GiantInt* giantInt, int value) {
    struct Node* newNode = createNode(value);
    if (giantInt->head == NULL) {
        giantInt->head = giantInt->tail = newNode;
    } else {
        giantInt->head->previous = newNode;
        newNode->next = giantInt->head;
        giantInt->head = newNode;
    }
    giantInt->size++;
}

void insertAtTail(struct GiantInt* giantInt, int value) {
    struct Node* newNode = createNode(value);
    if (giantInt->tail == NULL) {
        giantInt->head = giantInt->tail = newNode;
    } else {
        giantInt->tail->next = newNode;
        newNode->previous = giantInt->tail;
        giantInt->tail = newNode;
    }
    giantInt->size++;
}

void display(struct GiantInt* giantInt) {
    struct Node* temp = giantInt->head;
    while (temp != NULL) {
        printf("%d", temp->data);
        temp = temp->next;
    }
}

void addition(struct GiantInt* result, struct GiantInt* a, struct GiantInt* b) {
    int carry = 0, sum;
    struct Node* a_curr = a->tail;
    struct Node* b_curr = b->tail;

    while (a_curr != NULL || b_curr != NULL) {
        int a_val = (a_curr != NULL) ? a_curr->data : 0;
        int b_val = (b_curr != NULL) ? b_curr->data : 0;

        sum = a_val + b_val + carry;
        carry = sum / 10;
        sum %= 10;

        insertAtHead(result, sum);

        if (a_curr != NULL) a_curr = a_curr->previous;
        if (b_curr != NULL) b_curr = b_curr->previous;
    }

    if (carry != 0) {
        insertAtHead(result, carry);
    }
}

void destroyGiantInt(struct GiantInt* giantInt) {
    struct Node* current = giantInt->head;
    while (current != NULL) {
        struct Node* next = current->next;
        free(current);
        current = next;
    }
    free(giantInt);
}

int main() {
    struct GiantInt* m = createGiantInt();
    struct GiantInt* n = createGiantInt();
    struct GiantInt* sum = createGiantInt();

    string number1, number2;

    cout << "Enter numbers to add: ";
    cin >> number1 >> number2;

    for (int i = 0; i < number1.length(); i++) {
        insertAtTail(m, number1[i] - '0');
    }

    for (int i = 0; i < number2.length(); i++) {
        insertAtTail(n, number2[i] - '0');
    }

    cout << "Sum: ";
    addition(sum, m, n);
    display(sum);
    cout << endl;

    destroyGiantInt(m);
    destroyGiantInt(n);
    destroyGiantInt(sum);

    return 0;
}
Editor is loading...
Leave a Comment