**Design: `tail` is not needed**

Present function set has no benefit from the `tail` member.  It is removable.  Even `delete_last()` walks down the list.

**Design: Global variables not needed**

This is a major change, so will assume this code is using the simple one linked-list as an exercise.


**Bug: Wrong allocation size**

Code allocates enough for a pointer rather than enough for the `struct`.

Cast not needed. Better to allocate to the de-referenced object than type.

    // node temp=(node)malloc(sizeof(node));
    node temp = malloc(sizeof *node);

**Function declarations say nothing about signature**

`void foo();` allows later calls like `foo(1), foo("hello", 5.0)` to pass undetected as errors.

    // void delete_front();
    // void count();
    // void display();
    // void delete_last();
    void delete_front(void);
    void count(void);
    void display(void);
    void delete_last(void);

**Inconsistent spacing**

Use an auto-formatter - life is too short for manual formatting.

**Lack of error checking**

No checking if `scanf("%d",&choice);` succeeded, nor `malloc()`.

**Unneeded code**

`temp=NULL;` serves nor purpose in `node_add(int x)`

**Bug: de-referencing of `NULL`**

`delete_front()` does not check if `head == NULL` before `head->link`.  `tail` is not updated to `NULL` when last link deleted.

**Bug: de-referencing of `NULL`**

`delete_last()` does not check if `p->link == NULL` before `p->link->link`.  Also expect `head` to be updated to `NULL` if last node deleted.