循环链表(链式存储)

版权声明:本文为博主原创文章,未经博主允许不得转载,转载请注明出处 https://blog.csdn.net/qq_21231413/article/details/89873963

1、定义链表节点以及表头数据结构

typedef struct CircleLinkNode{
    void* data;
    struct CircleLinkNode* next;
}CircleLinkNode;
typedef struct CircleLinkList{
    CircleLinkNode* head; //头结点
    CircleLinkNode* rear; //尾节点
    int length;
}CircleLinkList;

2、链表的初始化

CircleLinkNode* CircleLinkListInit()
{
    CircleLinkList* dlist = (CircleLinkList*)malloc(sizeof(CircleLinkList));
    if (dlist == NULL)
    {
        return NULL;
    }

    //创建头结点 创建头结点 是为了空链表和非空链表处理一致
    CircleLinkNode* head = (CircleLinkNode*)malloc(sizeof(CircleLinkNode));
    if (head == NULL)
    {
        if (dlist != NULL)
        {
            free(dlist);
        }
        return NULL;
    }

    head->data = NULL;
    head->next = NULL;

    //初始化链表
    dlist->head = head;
    dlist->rear = head;
    dlist->length = 0;
    return dlist;
}

3、指定位置插入链表节点

void CircleLinkList_Insert(CircleLinkList* dlist, int pos, void* data)
{
    if (dlist == NULL || data == NULL || pos < 0)
    {
        return;
    }

    if (pos > dlist->length)
    {
        pos = dlist->length;
    }
    
    //辅助指针
    CircleLinkNode* pCurrent = dlist->head;
    for (int i = 0; i < pos;i++)
    {
        pCurrent = pCurrent->next;
    }

    //创建新节点
    CircleLinkNode* newnode = (CircleLinkNode*)malloc(sizeof(CircleLinkNode));
    if (newnode == NULL)
    {
        return;
    }

    newnode->data = data;
    newnode->next = NULL;

    //将新结点插入到链表中
    newnode->next = pCurrent->next;
    pCurrent->next = newnode;

    //判断是否在尾部插入结点
    if (pCurrent == dlist->rear){
        dlist->rear = newnode;
        dlist->rear->next = dlist->head;
    }
    dlist->length++;
}

4、删除指定位置链表节点

void CircleLinkList_Delete(CircleLinkList* dlist, int pos)
{
    if (dlist == NULL || pos < 0)
    {
        return;
    }

    if (pos >= dlist->length)
    {
        return;
    }

    //赋值指针
    CircleLinkNode* pCurrent = dlist->head;
    for (int i = 0; i < pos;i++)
    {
        pCurrent = pCurrent->next;
    }

    //缓存被删除结点
    CircleLinkNode* pDel = pCurrent->next;

    //重新建立前后结点关系
    pCurrent->next = pDel->next;

    //释放被删除结点内存
    free(pDel);

    //链表结点数量减 1
    dlist->length--;
}

5、判断链表是否为空

int isEmptyCircleLinkList(CircleLinkList* dlist)
{
    if (dlist->length == 0)
    {
        return 1;
    }
    return 0;
}

6、获取链表的节点数

int CircleLinkList_Length(CircleLinkList* dlist){
    if (dlist == NULL)
    {
        return -1;
    }
    return dlist->length;
}

7.清空链表

void CircleLinkList_Clear(CircleLinkList* dlist){
    CircleLinkNode* pCurrent = dlist->head->next;
    while (pCurrent != dlist->head)
    {
        CircleLinkNode* pNext = pCurrent->next;
        free(pCurrent);
        pCurrent = pNext;
    }
    dlist->head->next = NULL;
    dlist->rear = dlist->head;
    dlist->length = 0;
}

8、销毁链表

void CircleLinkList_Destroy(CircleLinkList* dlist){
    CircleLinkNode* pCurrent = dlist->head;
    while (pCurrent!=dlist->head)
    {
        //缓存被删除结点的下一个结点
        CircleLinkNode* pNext = pCurrent->next;
        free(pCurrent);
        pCurrent = pNext;
    }
    free(dlist);
}

猜你喜欢

转载自blog.csdn.net/qq_21231413/article/details/89873963
今日推荐