C语言:数据结构-单向循环链表

目录

一、结构体

二、创建头节点

三、创建子节点

四、插入

1.头插

2.尾插

五、删除

1.尾删

2.删除头结点

六、打印

1.普通打印

2.没有头节点的打印

一、结构体

typedef struct looplinklist
{
    union {
        int len;
        int data;
    };
    struct looplinklist *next;
} Loop, *loop;

二、创建头节点

loop looplinklist_create()
{
    loop H = (loop)malloc(sizeof(Loop));
    if (H == NULL)
    {
        printf("头节点内存空间创建失败\n");
        return NULL;
    }
    H->len = 0;
    H->next = H;
    printf("头节点内存空间创建成功\n");
    return H;
}

三、创建子节点

loop node_create(int data)
{
    loop p = (loop)malloc(sizeof(Loop));
    if (p == NULL)
    {
        printf("节点内存空间创建失败\n");
        return NULL;
    }
    else
    {
        p->data = data;
        return p;
    }      
}

四、插入

1.头插

void head_insert_looplinklist(loop H, int data)
{
    if (H == NULL)
    {
        printf("入参为空\n");
        return;
    }
    loop newnode = node_create(data);
    newnode->next = H->next;
    H->next = newnode;
    H->len++;
}

2.尾插

void tail_insert_linklist(loop H, int data)
{
    if (H == NULL)
    {
        printf("入参为空\n");
    }
    else
    {
        loop p = H;
        while (p->next != H)
            p = p->next;
        loop newnode = node_create(data);
        newnode->next = H;
        p->next = newnode;
        H->len++;
    }
}

五、删除

1.尾删

void delete_tail_looplinklist(loop H)
{
    if (H == NULL)
    {
        printf("入参为空\n");
        return;
    }
    else if (H->next == H)
    {
        printf("链表为空,无法删除\n");
        return;
    }
    else if (H->next->next == H)
    {
        H->next->next = NULL;
        free(H->next);
        H->next = H;
        H->len--;
        return;
    }
    loop p = H;
    while (p->next->next != H)
        p = p->next;
    p->next->next = NULL;
    free(p->next);
    p->next = H;
    H->len--;
}

2.删除头结点

loop delete_head_looplinklist(loop H)
{
    if (H == NULL)
    {
        printf("入参为空\n");
        return NULL;
    }
    else if (H->next == H)
    {
        H->next = NULL;
        free(H);  
        return NULL;
    }
    loop p = H;
    while (p->next != H)
        p = p->next;
    p->next = H->next;
    H->next = NULL;
    free(H);
    return p->next;
}

六、打印

1.普通打印

void print_looplinklist(loop H)
{
    if (H == NULL)
    {
        printf("入参为空\n");
        return;
    }
    loop p = H->next;
    while (p != H)
    {
        printf("p->data=%d\n", p->data);
        p = p->next;
    }
}

2.没有头节点的打印

//没有头节点的打印
//do while的原因:有头节点时,从头节点后一个开始打印,全程不打印头节点
//没有头节点时,需要打印开始指针所指向的元素,并不会从该节点后一个开始打印
//所以要先打印该节点,再循环
void unnode_print_looplinklist(loop S)
{
    if (S == NULL)
    {
        printf("入参为空\n");
        return;
    }
    loop p = S;
    do
    {
        printf("p->data=%d\n", p->data);
        p = p->next;
    } while (p != S);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值