【C语言数据结构】02.单循环链表

前言

  • 本节主要进行C语言数据结构单循环链表的学习。


1.单循环链表概述

  • 单循环链头尾相接,形成一个环(即尾节点的后继指针指向第一个节点)。
  • 其他的单链表的差别不大,但循环链表从表中任意一个节点出发,都可以访问其他的所有节点,无论前后,这也是单链表不具备的优势。

在这里插入图片描述

2.单循环链表实现

  • 实现内容与单链表相同,1.初始化;2.增加节点:头插法、尾插法;3.删除节点;4.遍历节点。
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
// <stdlib.h>是C语言中的一个头文件,该文件包含了的C语言标准库函数的定义。
// 1、意思是标准输入输出头文件。
// 2、用到标准输入输出函数时,就要调用这个头文件。
// 3、stdlib.h中,包含了C语言的一些常用且方便的库函数。 
// 4、如动态内存相关的malloc,realloc,zalloc,calloc,free等。
// <stdbool.h>是C标准函数库中一个常用的头文件。它定义了一个布尔类型,于C99中加入。
typedef struct Node//定义数据结构,包含数据域域next域
{
    int data;//data域
    struct Node* next;//指针域,指向了同样类型的下一个
}Node;

Node* initList()//初始化头节点
{
    Node* list=(Node*)malloc(sizeof(Node));//开辟空间,新建节点
    list->data=0;//链表默认个数为0
    list->next=list;//链表为空,故头节点循环指向自己
    return list;
}

void headInsert(Node* list,int data)//头插法
{
    Node* node = (Node*)malloc(sizeof(Node));//开辟空间,新建节点
    node->data = data;//data给到新建节点的数据域
    node->next = list->next;//新建节点的next指向的是原先链表的第一个节点,也就是头节点指向的节点
    list->next = node;//头节点指向新建节点
    list->data++;//插入后链表元素加一
}

void tailInsert(Node* list,int data)//尾插法
{
    Node* head=list;//保存头节点的地址
    Node* node = (Node*)malloc(sizeof(Node));//开辟空间,新建节点
    node->data = data;//data给到新建节点的数据域
    node->next = list;//新建节点指向list
    while(list->next!=head)//寻找最后一个节点
    {
        list=list->next;
    }
    list->next=node;//最后一个节点指向新建节点
    head->data++;//头节点里的data域节点数加一
}

bool delete(Node* list,int data)//删除
{
    Node* head=list;//保存头节点的地址
    Node* pre=list;//保存头节点,它是current的前一个节点
    Node* current=list->next;//保存第一个节点开始,从它开始遍历
    while(current!=head)//遍历,可使用头节点data进行for循环遍历
    {
        if(current->data==data)//找到data
        {
            pre->next=current->next;//将前一个节点指向要要删除节点的下一个节点
            free(current);//释放要铲除节点的堆内存空间
            break;//退出循环
        }
        pre = current;//未找到data则往后继续遍历
        current = current->next;//未找到data则往后继续遍历
    }
    if(current!=head)
    {
    list->data--;
    return true;
    }
    else return false;

}

void printList(Node* list)//遍历操作
{
    Node* node=list->next;//循环链表的第一个节点给到新建节点node,即头节点的下一个
    while(node!=list)
    {
        printf("%d",node->data);
        node=node->next;        
    }
    printf("\n");
}

int main()
{
    Node* list= initList();//初始化头节点,创捷链表节点
    headInsert(list,5);
    headInsert(list,4);
    headInsert(list,3);
    headInsert(list,2);
    headInsert(list,1);
    tailInsert(list,6);
    tailInsert(list,7);
    tailInsert(list,8);
    tailInsert(list,9);
    tailInsert(list,10);
    printList(list);
    printf("%d\n",delete(list,1));
    printf("%d\n",delete(list,11));
    printf("%d\n",delete(list,6));
    printf("%d\n",delete(list,6));
    printf("%d\n",delete(list,10));
    printList(list);
    system("pause");
}

在这里插入图片描述

参考资料:
链接1: UP从0到1带你手撕数据结构全集(C语言版)
链接2: 【C语言数据结构】1.单链表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不僈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值