Cómo hacer una estructura externa y definir su typedef

Estoy tratando de implementar algoritmos de árbol en C. He declarado una estructura externa en un archivo de encabezado que es completamente independiente (b_tree_ds.h). Ahora planeo importar el archivo en todos los archivos fuente que quieran usar esta estructura. Entonces debo declararlo usando extern en el encabezado.

Ahora el problema es que quiero definir también su typedef. El compilador da error de múltiples clases de almacenamiento. ¿Cómo debo hacer eso?

typedef extern struct node {
    struct node* left;
    struct node* right;
    int key;    // contains value
}NODE;

El problema real es el siguiente, que todavía no puedo solucionar. Recientemente aprendí cómo podemos usar múltiples archivos fuente con archivos de encabezado para hacer que el código sea portátil y jerárquico. Para hacerlo, me cansé de crear mi programa de árbol usando este director. Aquí están mis archivos

b_tree_ds.h: contendrá undeclaració de la estructura de datos del nodo de un árbol, que puede llamarse a varias funciones que implementan diferentes funcionalidades del árbol (que pueden estar en diferentes archivos fuente)

typedef struct node {
    struct node* left;
    struct node* right;
    int key;    // contains value
}NODE;

Cuando intento agregar un externo como en typedefextern struct node da un error de clase de almacenamiento múltiple, pero si me lo pierdo, recibo un error para varias definiciones.

Aquí están mis otros archivos fuente

traverse.h: contiene la declaración de la función transversal

void traverse_print (NODE* p);

Aquí también recibo un error para el identificador desconocido NODE

traverse.c - contiene la definición de esa función

#include <stdio.h>
#include "b_tree_ds.h"
#include "traverse.h"

void traverse_print(NODE* p)
{
    if(p->left != NULL)
    {
        traverse_print(p->left);
    }

    if (p->right != NULL)
    {
        traverse_print(p->right);
    }

    printf ("\n%d",p->key);
}

Finally main.c

#include <stdio.h>
#include "traverse.h"

void main()
{
    // input
    NODE p;

    printf("\nInput the tree");
    input_tree (&p);

    printf("\n\nThe tree is traversing ...\n")
    traverse_print(&p);
}

void input_tree (NODE *p)
{
    int in;
    int c;
    NODE *temp;

    printf("\n Enter the key value for p: ");
    scanf("%d", &in);
    p->key  =in;
    printf ("\n\nIn relation to node with value %d",in);
    printf ("Does it have left child (Y/N): ")
    if ((c = getchar()) == Y);
    {
        //assign new memory to it.
        temp = (NODE *)malloc(sizeof(NODE));
        input_tree(temp);
    }
    printf ("\n\nIn relation to node with value %d",p->key);

    printf ("\nDoes it have right child (Y/N): ")
    if ((c = getchar()) == Y);
    {
        //assign new memory to it.
        temp = (NODE *)malloc(sizeof(NODE));
        input_tree(temp);
    }
}

Este es mi primer intento de tal práctica, sugiera que la estructuración de mi programa es buena o debería intentar otra cosa.

Respuestas a la pregunta(6)

Su respuesta a la pregunta