typedef struct list {
int val
struct list *prev
struct list *next
} linked_list
linked_list *head
linked_list *tail
int size
/**
* 初始化节点
* @param val
* @return
*/
linked_list *new_node(int val) {
linked_list *node = malloc(sizeof(linked_list))
node->val = val
node->prev = NULL
node->next = NULL
return node
}
/**
* 初始化链表
*/
void init() {
head = new_node(-1)
tail = new_node(-1)
head->next = tail
tail->prev = head
size = 0
}
/**
* 添加节点(表尾)
* @param node
*/
void add(linked_list *node) {
if (head == NULL || tail == NULL) {
init()
}
node->next = tail
tail->prev->next = node
node->prev = tail->prev
tail->prev = node
size++
}
/**
* 添加节点(表头)
* @param node
*/
void add_to_head(linked_list *node) {
if (head == NULL || tail == NULL) {
init()
}
node->next = head->next
head->next = node
node->prev = head
node->next->prev = node
size++
}
/**
* 判断节点是否存在
* @param node
* @return
*/
int is_exist(linked_list *node) {
if (head == NULL || tail == NULL) {
return 0
}
linked_list *temp = head->next
while (temp != tail) {
if (temp == node) {
return 1
}
temp = temp->next
}
return 0
}
/**
* 删除节点
* @param node
* @return
*/
int delete(linked_list *node) {
if (is_exist(node)) {
node->prev->next = node->next
node->next->prev = node->prev
node->prev = NULL
node->next = NULL
free(node)
size--
return 1
}
return 0
}
/**
* 删除节点
* @param index 节点下标
* @return
*/
int delete_index_node(int index) {
if (index >= size) {
return 0
}
linked_list *temp = head->next
for (int i = 0
temp = temp->next
}
temp->prev->next = temp->next
temp->next->prev = temp->prev
free(temp)
size--
return 1
}
/**
* 打印
*/
void print() {
if (head == NULL || tail == NULL) {
init()
}
printf("linked_list(size=%d):", size);
linked_list *temp = head->next;
while (temp != tail) {
printf("[node:%d]->", temp->val);
temp = temp->next;
}
printf("NULL\n");
}
int main() {
linked_list *node1 = new_node(1);
linked_list *node2 = new_node(2);
linked_list *node3 = new_node(3);
linked_list *node4 = new_node(4);
add(node1);
add(node2);
add(node3);
add_to_head(node4);
print();
delete_index_node(0);
print();
return 0;
}