#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指向相同的内存,故而报错。