I made some polynomial code with a doubly-linked list. for example, if you write 1 and 2 then 1 is a degree and 2 is coefficient. 1x^2 insert to doubly linked list. the problem is that when I check my code, the Node head->degree is changing. if I write 1x^2 then head->degree is 1 next, I write 2x^1 then head-> degree should maintain 1 but head-> degree change to 2 I think there is some problem in the head pointer.
#include <stdio.h>
#include <stdlib.h>
// struct 
struct Node {
    int degree;
    int coefficient;
    struct Node* next;
    struct Node* prev;
};
// global variables
int de; // degree
int co; // coefficient
int flag;
Node** head = (Node**)malloc(sizeof(Node)); // 
Node** head1 = (Node**)malloc(sizeof(Node)); // 
Node** head2 = (Node**)malloc(sizeof(Node)); // 
Node** head3 = (Node**)malloc(sizeof(Node)); // 
Node* newNode = (Node*)malloc(sizeof(Node)); //
// function
Node* inputpoly(void);
void printNode(Node* inp);
Node* multiply(Node* a, Node* b);
// main
int main() {
    // head null
    (*head1) = NULL;
    (*head2) = NULL;
    (*head3) = NULL;
    while (1) {
        printf("Input (degree) (coefficient) : ");
        scanf_s("%d %d", &de, &co);
            
        if (de * co < 0) { continue; }
        if (de < 0 && co < 0) {
            printf("Done!\n");
            break;
        }
        *head = inputpoly();
    }
    printNode(*head);
        
    //multiply(*head1, *head2);
    free(head1);
    free(head2);
    free(head3);
    free(newNode);
    free(head);
}
Node* inputpoly(void) {
    // create Node
    newNode->degree = de;
    newNode->coefficient = co;
    newNode->next = NULL;
    newNode->prev = NULL;
    
    // case1 
    if (flag == 0) {
        // list 
        if ((*head1) == NULL) {
            *head1 = newNode;
        }
        // list x
        else {
            Node* horse = (*head1);
            // front of head
            //  ------------------There is some problem
            printf("%d\n", 1);
            printf("--%d\n", newNode->degree);
            printf("--%d\n", horse->degree);
            if (horse->degree > newNode->degree) {
                newNode->next = horse;
                horse->prev = newNode;
                *head1 = newNode;
            }
            // barward of head
            else {
                int num = 0;
                while (horse->next != NULL) {
                    
                    horse = horse->next;
                    if (horse->degree > newNode->degree) {
                        horse->prev->next = newNode;
                        newNode->next = horse;
                        newNode->prev = horse->prev;
                        horse->prev = newNode;
                        num = 1;
                        break;
                    }
                }
                // behind tail
                if (num == 0) {
                    horse->next = newNode;
                    newNode->prev = horse;
                }
            }
        }   
        return *head1;
    }
}
void printNode(Node* inp) {
    Node* horse = inp;
    if (horse == NULL) 
    { 
        return;
    }
    while (horse != NULL) {
        if (horse->prev == NULL) {
            if (horse->degree == 1) {
                printf("%d", horse->coefficient);
            }
            else {
                printf("%d x^%d", horse->coefficient, horse->degree);
            }
        }
        else {
            if (horse->degree == 1) {
                printf(" + %d", horse->coefficient);
            }
            else {
                printf(" + %d x^%d", horse->coefficient, horse->degree);
            }
        }
    }
    printf("\n");
}
 
     
    
