阿鑫来了  
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef int LDataType;

//双向带头循环链表的节点 
typedef struct ListNode{
    LDataType _data;
    /*指向下一个节点的起始位置*/
    struct ListNode* _next;
    //指向上一个节点的起始位置
    struct ListNode* _prev;
}ListNode;

//双向带头循环链表
typedef struct List{
    //只需要存放头的地址
    struct ListNode* _head;
}List;

//创建一个节点
ListNode* createListNode(LDataType val){
    ListNode* node = (ListNode*)malloc(sizeof(ListNode));
    node->_data = val;
    node->_next = NULL;
    node->_prev = NULL;
    return node;
}

void listInit(List* lst){
    if (lst == NULL)
        return;
    //空链表
    lst->_head = createListNode(0);
    lst->_head->_next = lst->_head->_prev = lst->_head;

}

//删除某一个节点
void listErase(List* lst, ListNode* node){
//不能删除head节点
    if (lst == NULL || lst->_head == node)
        return;

    ListNode* prev = node->_prev;
    ListNode* next = node->_next;

    prev->_next = next;
    next->_prev = prev;

    free(node);
}

//尾删:删除头的前一个节点
void listPopBack(List* lst){
    listErase(lst, lst->_head->_prev);
}

//头删
void listPopFront(List* lst){
    listErase(lst, lst->_head->_next);
}

 
//在某一节点前插入一个数据
void listInsert(List* lst, ListNode* node, LDataType val){
    if (lst == NULL)
        return;

    ListNode* prev = node->_prev;
    ListNode* newNode =createListNode(val);

    prev->_next = newNode;
    newNode->_prev = prev;

    newNode->_next = node;
    node->_prev = newNode;
}

//尾插
void listPushBack(List* lst, LDataType val){
    listInsert(lst, lst->_head,val);
}

//头插
void listPushFront(List* lst, LDataType val){
    listInsert(lst,lst->_head->_next,val);
}

//打印链表
void printfList(List* lst){
    ListNode* cur = lst->_head->_next;
    while (cur != lst->_head){
        printf("%d  ", cur->_data);
        cur = cur->_next;
    }
    printf("\n");
}

//销毁链表
listDestroy(List* lst){
    if (lst){
        if (lst->_head){
            ListNode* cur = lst->_head->_next;
            while (cur != lst->_head){
                ListNode* next = cur->_next;
                free(cur);
                cur = next;
            }
            free(lst->_head);
        }
    }
}

void test(){
    List lst;
    listInit(&lst);
    listPushFront(&lst, 1);
    printfList(&lst);
    listPushFront(&lst, 2);
    printfList(&lst);
    printfList(&lst);
    listPushFront(&lst, 3);
    printfList(&lst);
    listPushFront(&lst, 4);
    printfList(&lst);
}

int main(){
    test();
    system("pause");
    return 0;
}

 

顺序表

优:

1.空间连续

2.支持随机访问

3.空间利用率高,不容易造成内存碎片

4.尾插尾删效率高

劣:

1.头插头删,中间插入删除时间复杂度为O(n),效率较低;

2.增容代价大:申请,拷贝,释放

链表(双向带头循环)

优:

1.任意位置插入或删除时间复杂度为O(1)

2.没有增容问题

劣:

1.空间不连续

2.不支持随机访问

3.空间利用率低,容易造成内存碎片

 

posted on 2021-04-07 20:46  阿鑫来了  阅读(54)  评论(0)    收藏  举报