C语言链表

108 阅读1分钟
#include <malloc.h>
#include "stdio.h"

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; i < index; i++) {
        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;
}