C语言写的list中free出现bug

#pragma once
#include

typedef int value_type;
typedef struct list_node* link_type;
typedef struct list_node Node;

struct list_node {
link_type next = nullptr;
link_type prev = nullptr;
value_type data;
};

struct list {

link_type head = nullptr;
link_type tail = nullptr;

void push_front(list L, value_type value) {
    link_type temp = (link_type)malloc(sizeof(Node));
    temp->data = value;
    head->prev = temp;
    temp->next = head;
    head = temp;
}

void push_back(list L, value_type value) {
    link_type temp = (link_type)malloc(sizeof(Node));
    temp->data = value;
    tail->next = temp;
    temp->prev = tail;
    tail = temp;
}

void pop_front(list L) {
    link_type temp;
    temp = head;
    free(head);
    head = temp;
}

void pop_back(list L) {
    link_type temp;
    temp = tail;
    free(tail);
    tail = temp;
}

void erase(list L, value_type value) {
    link_type temp = head;
    while (temp->data != value && temp != tail)
        temp = temp->next;
    if (temp->data == value)
        free(temp);
}

void create(value_type x) {
    link_type temp = (link_type)malloc(sizeof(Node));
    temp->data = x;
    head = tail = temp;
}

void clear(list L) {
    while (head != tail) {
        link_type temp = head;
        head = head->next;
        free(temp);
    }
}

void free(list L) {
    clear(L);
    free(head);
    free(tail);
}

};

我感觉是这样的:
clear(L);//执行完这句后head和tail指向了同一个内存地址:你的 while (head != tail)
free(head);//用head释放了指向的内存
free(tail);//此时再次释放与上面head指向相同的内存,故而报错。