数据结构 C语言实现循环单链表的实例

首先,在开始讲解数据结构中循环单链表的实现前,需要明确循环单链表的概念以及其与单链表的区别。

循环单链表是一种链式存储结构,与单链表不同的是,在循环单链表的尾部也可以指向链表的头部,形成一个环。因此,我们可以通过尾部的指针来遍历整个循环单链表。

接下来,为了方便理解和学习,我们将使用C语言来实现循环单链表的实例。下面分几个步骤来讲解。

1. 定义结构体和创建循环单链表

首先,我们需要定义结构体来存储每个节点的数据和指向下一个节点的指针。此外,还需要定义一个头节点,用于记录链表的头部位置。

typedef struct node
{
    int data;
    struct node *next;
}Node;

Node *head = NULL;

在定义好结构体和头节点后,我们需要编写一个函数来创建循环单链表,可以根据用户输入的数据,依次插入链表节点。

void createList()
{
    int n, i, data;
    Node *prevNode, *currNode;
    printf("Input the number of nodes: ");
    scanf("%d", &n);

    head = (Node*) malloc(sizeof(Node));

    if(head == NULL)
    {
        printf("Memory can not be allocated.");
        return;
    }

    // Head node does not contain any data, its next points to first node
    head->data = 0;
    head->next = NULL;

    prevNode = head;
    for(i = 0; i < n; i++)
    {
        printf("Input data for node %d: ", i + 1);
        scanf("%d", &data);

        currNode = (Node*) malloc(sizeof(Node));

        if(currNode == NULL)
        {
            printf("Memory can not be allocated.");
            break;
        }

        currNode->data = data;
        currNode->next = NULL;

        prevNode->next = currNode;
        prevNode = currNode;

        // Set the last node next to the head node
        if(i == n - 1)
        {
            currNode->next = head;
        }
    }
}

2. 遍历循环单链表

遍历循环单链表与遍历单链表的方式基本相同,只需要将遍历的终止条件做出相应的改变即可。

void printList()
{
    Node *currNode = head->next;
    printf("\nPrint List:\n");
    do
    {
        printf("%d\n", currNode->data);
        currNode = currNode->next;
    }while(currNode != head->next);
}

3. 插入节点

通过上面的代码,我们已经实现了循环单链表的创建和遍历操作,但是链表数据可能会动态增加,因此需要编写函数来插入新的节点。

void insertNode()
{
    Node *currNode = head->next;
    int data, loc, i = 1;

    printf("Enter location to insert a node: ");
    scanf("%d", &loc);

    while(i < loc-1 && currNode != head)
    {
        currNode = currNode->next;
        i++;
    }

    if(currNode == head && i != loc)
    {
       printf("Invalid location.\n");
       return;
    }

    printf("Enter data to insert a node at location %d: ", loc);
    scanf("%d", &data);

    Node *newNode=(Node *)malloc(sizeof(Node));
    newNode->data=data;

    newNode->next=currNode->next;
    currNode->next=newNode;

    if(currNode==head && loc!=1)
    {
       printf("Invalid location.\n");
       return;
    }
}

示例说明

假设我们要构建一个包含三个节点的循环单链表,并按顺序输入三个整数。

Input the number of nodes: 3
Input data for node 1: 10
Input data for node 2: 20
Input data for node 3: 30

执行完上述代码后,我们已经成功创建了一个包含三个节点的循环单链表。

接下来,让我们遍历链表,查看节点数据。

Print List:
10
20
30

我们可以看到,成功遍历了整个链表。

接着,我们尝试在第二个位置插入一个新的节点,并将数据设置为40。

Enter location to insert a node: 2
Enter data to insert a node at location 2: 40

最后,再次遍历链表,查看新的节点是否成功插入。

Print List:
10
40
20
30

可以看到,我们成功地在指定位置插入了一个新节点,并且数据正确。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:数据结构 C语言实现循环单链表的实例 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • 2020滴滴最新PHP试题(附答案及解析)

    题目链接:https://www.fibar.cn/newsDetail/18216.html 本文主要是对“2020滴滴最新PHP试题(附答案及解析)”的解题思路和过程进行详细讲解。 题目难度 此题属于中等难度,需要考生具备 PHP 基础知识和算法基础。 题目要求 题目要求我们编写一个程序,实现多个字符串的排序输出。程序需要满足以下要求: 输入:多个字符串…

    数据结构 2023年5月17日
    00
  • Java数据结构之复杂度篇

    《Java数据结构之复杂度篇》是一篇关于算法复杂度分析的文章。本文主要介绍了如何使用大O符号来表示算法的时间复杂度、如何计算最坏情况下的时间复杂度、如何判断嵌套循环的时间复杂度、如何分析递归算法的时间复杂度等。 大O符号 大O符号是一种表示算法时间复杂度的符号,通常用于表示最坏情况下的时间复杂度。例如,如果某个算法的时间复杂度为O(n),则表示最坏情况下这个…

    数据结构 2023年5月17日
    00
  • Java数据结构学习之栈和队列

    Java数据结构学习之栈和队列 什么是栈 栈(stack)是一种线性数据结构,它只能在一端进行插入和删除操作,这一端被称作栈顶(top)。栈的特点是先进后出(FILO,First-In-Last-Out),即最后进入的元素最先被删除。 栈的实现方式 栈可以使用数组或链表来实现。使用数组实现的栈称作顺序栈,使用链表实现的栈称作链式栈。以下是顺序栈的 Java …

    数据结构 2023年5月17日
    00
  • C语言数据结构时间复杂度及空间复杂度简要分析

    C语言数据结构时间复杂度及空间复杂度简要分析 什么是时间复杂度和空间复杂度? 在分析算法和数据结构的性能时,时间复杂度和空间复杂度是必须考虑的因素。 时间复杂度:衡量算法执行时间所需的资源,也就是算法的速度。通常使用“大O符号”来表示时间复杂度,例如O(1)、O(n)、O(nlogn)等。 空间复杂度:衡量算法使用的内存资源,也就是算法的空间利用率。通常使用…

    数据结构 2023年5月17日
    00
  • 【ACM算法竞赛日常训练】DAY5题解与分析【储物点的距离】【糖糖别胡说,我真的不是签到题目】| 前缀和 | 思维

    DAY5共2题: 储物点的距离(前缀和) 糖糖别胡说,我真的不是签到题目(multiset,思维) ? 作者:Eriktse? 简介:19岁,211计算机在读,现役ACM银牌选手?力争以通俗易懂的方式讲解算法!❤️欢迎关注我,一起交流C++/Python算法。(优质好文持续更新中……)?? 原文链接(阅读原文获得更好阅读体验):https://www.eri…

    算法与数据结构 2023年4月18日
    00
  • Redis高效率原因及数据结构分析

    Redis高效率原因及数据结构分析 Redis高效率的原因 Redis是一款高性能、高可靠性的内存数据库,其高效率的原因主要体现在以下几个方面: 1. 内存存储 Redis数据完全存储在内存中,而不是像传统的关系型数据库一样存储在磁盘中。内存的读写速度要远远快于磁盘的读写速度,因此Redis在数据读写时的速度非常快,能够达到每秒钟数百万次的读写操作。 2. …

    数据结构 2023年5月17日
    00
  • java数据结构基础:算法

    Java数据结构基础:算法攻略 概述 在程序员的日常开发中,算法是一项重要的技能,而数据结构则是算法不可缺少的基础。本文将讲解Java数据结构中的基本算法,包括常见算法的实现,算法的分析及算法的运用。经过本文的学习,读者可以掌握Java中基础的算法实现及应用。 常见算法实现 排序算法 排序算法是算法中最基础的一类,常用的算法有冒泡排序、插入排序、选择排序、快…

    数据结构 2023年5月17日
    00
  • C#数据结构揭秘一

    C#数据结构揭秘一攻略 C#数据结构是每个C#程序员必须熟练掌握的技能之一。本攻略将介绍常见的C#数据结构,包括数组、列表、栈、队列、散列表和字典。我们将会深入了解它们的特点、使用场景和使用方法,并附带代码示例加深理解。 数组 数组是存储单一类型元素的固定大小的集合结构。在C#中,可以使用以下方式声明和初始化一个数组: int[] nums1 = new i…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部