带头双向循环链表的实现------初始化,尾插,尾删,头插,头删,任意位置的插入与删除,链表的销毁

#include <stdio.h>
#include <stdlib.h>

typedef int Type;
typedef struct Node {
    Type _data;
    struct Node* _next;
    struct node* _prev;
}Node;

typedef struct List {
    Node* _header;
}List;

void ListInit(List* lst) {
    //创建一个头结点,构成循环结构
    lst->_header = creatNode;
    lst->_header->_next = lst->_header;
    lst->_header->_prev = lst->_header;
}
//创造新节点
Node* creatNode(Type data) {
    Node* node = (Node*)malloc(sizeof(Node));
    node->_prev = node->_next = NULL;
    node->_data = data;
    return node;
}
//尾插
void ListPushBack(List* lst, Type data) {
    Node* node = creatNode(data);
    Node* last = lst->_header->_prev;
    lst->_header->_prev = node;
    node->_next = lst->_header;
    last->_next = node;
    node->_prev = last;

}
//尾删
void ListPopBack(List* lst) {
    Node* last, *prev;
    if (lst->_header->_next = lst->_header) //判断是否为空表
        return;
     last = lst->_header->_prev;
     prev = last->_prev;
     free(last);
     lst->_header->_prev = prev;
     prev->_next = lst->_header;
    
}
//头插
void ListPushFront(List* lst, Type data) {
    Node* node = creatNode(data);
    Node* front = lst->_header->_next;
    node->_next = front;
    front->_prev = node;
    lst->_header->_next = node;
    node->_prev = lst->_header;
}
//头删
void ListPopFront(List* lst) {
    Node* front, *next;
    if (lst->_header->_data = lst->_header)//判断是否为空表
        return;
    front = lst->_header;
    next = front->_next;
    free(front);
    lst->_header->_next = next;
    next->_prev = lst->_header;
    
}
//任意位置的插入数据
void ListInsert(Node* pos, Type data) {
    Node* prev = pos->_prev;
    Node* node = creatNnode(data);
    prev->_next = node;
    node->_prev = prev;
    node->_next = pos;
    pos->_prev = node;
}
//任意位置的删除
void ListErase(Node* pos) {
    Node* prev, *next;
    if (pos->_next = pos)//判断是否为空表
        return;
    prev = pos->_prev;
    next = pos->_next;
    free(pos);
    prev->_next = next;
    next->_prev = prev;
}

//打印
void ListPrint(List* lst) {
    Node* cur = lst->_header->_next;
    while (cur != lst->_header) {
        printf("%d", cur->_data);
        cur = cur->_next;
    }
    printf("\n");
}
//销毁
void Listdesory(List* lst) {
    Node* cur = lst->_header->_next;
    while (cur != lst->_header) {
        Node* next = cur->_next;
        free(cur);
        cur = next;
    }
    free(lst->_header);
    lst->_header = NULL;//最好加上
}

发布了42 篇原创文章 · 获赞 0 · 访问量 1439

猜你喜欢

转载自blog.csdn.net/HUAERBUSHI521/article/details/105335273