c语言实现单链表算法示例分享

下面是详细的攻略。

C语言实现单链表算法示例分享

什么是单链表

单链表是一种数据结构,它由一个个节点组成,每个节点包含两个部分:一个是数据部分,另一个是指针部分,指针部分指向下一个节点的位置。单链表的节点是动态分配的,可以随时插入、删除,是一种非常灵活的数据结构。

为什么要使用单链表

在进行一些操作时,数组或者普通的指针会遇到很多麻烦。比如在删除数组元素时,在删除元素后需要将后面的元素全部向前移动,这个操作的时间复杂度是O(n),效率很低。而单链表的删除,则只需要改变指针,时间复杂度是O(1),效率很高。因此,单链表是一种非常实用的数据结构。

单链表的基本操作

单链表的基本操作包括:创建、插入、删除、遍历共四个操作。

创建操作

创建操作是指创建一个新的单链表。在C语言中,我们可以这样定义一个单链表:

typedef struct ListNode{
    int data;                                 // 数据部分
    struct ListNode *next;              // 指针部分,指向下一个节点
}ListNode, *LinkList;

这里,我们定义了一个名为ListNode的结构体,包含数据部分和指针部分,此后便可通过LinkList类型来创建新的链表。

创建操作实现代码如下:

LinkList createList(int data[], int n){ 
    ListNode *head, *p, *q;             // head作为链表头部,p、q作为链表的中间节点  
    int i;                                           // i用于循环   
    head = (ListNode *)malloc(sizeof(ListNode));      // 申请链表头部内存空间
    q = head;                                          // q作为中间节点       
    for(i=0;i<n;i++){ 
        p = (ListNode *)malloc(sizeof(ListNode));           // 申请内存节点空间
        p->data = data[i];                                 // 赋值data
        q->next = p;                                                 // 连接前节点和后节点
        q = p;                                                            // 中间节点前移 
    } 
    q->next = NULL;                    // 将最后一个节点如当前节点,尾节点的指针指向 NULL,即 NULL 是链表的标志。
    return head;                         // 返回单链表的头指针
} 

以上代码实现了一个简单的创建链表的操作,创建了一个长度为n的链表。

插入操作

插入操作是指在链表中插入新的节点。当我们需要在链表中插入一个新的节点时,需要找到插入节点的位置。假设我们要在第i个节点后插入一个新的节点j,那么新的节点j应该先指向节点i的下一个节点,再让节点i指向节点j。插入操作的实现代码如下:

LinkList insertNode(LinkList head, int i, int e){
    ListNode *p, *q, *newNode;     // p是节点i的前驱节点,q是节点i的后继节点,newNode是新的节点
    p = head;
    for(int j=1;j<i;j++){
        if(p==NULL)              // 未找到第i-1个节点
            return head;
        p = p->next;
    }
    q = p->next;
    newNode = (ListNode*)malloc(sizeof(ListNode));
    newNode->data = e;
    p->next = newNode;
    newNode->next = q;
    return head;
}

以上代码实现了在链表中插入节点的功能,需要注意的是,在插入一个节点时,我们需要先寻找到要插入节点的位置,再进行插入操作。

删除操作

删除操作是指在链表中删除一个节点。假设我们要删除第i个节点,我们需要先找到节点i的前一个节点p,再将p的指针指向节点i的后一个节点q,最后再将节点i删除即可。删除操作的实现代码如下:

LinkList deleteNode(LinkList head, int i){
    ListNode *p, *q;                 // p是节点i的前驱节点,q是节点i的后继节点
    p = head;
    for(int j=1;j<i;j++){
        if(p == NULL)            // 未找到第i个节点
            return head;
        p = p->next;
    }
    q = p->next;               // q是节点i的后继节点
    p->next = q->next;      // 将p的指针指向q的后继节点
    free(q);                       // 删除节点q
    return head;
}

以上代码实现了在链表中删除节点的功能,同样需要注意的是,我们需要先找到要删除节点的位置,再进行删除操作。

遍历操作

遍历操作是指遍历整个链表,并输出每个节点的值。遍历操作的实现代码如下:

void traverse(LinkList head){
    ListNode *p = head->next;
    while(p!=NULL){
        printf("%d ",p->data);
        p = p->next;
    }
    printf("\n");
}

以上代码实现了遍历链表的操作,可以通过遍历链表来输出节点的值。

示例说明

示例1:创建链表

假设有如下数组:

int data[] = {3,4,1,7,5,6,9,0,2,8};

我们可以使用下面的代码将其转化为一个链表:

LinkList list = createList(data, 10);

以上代码实现了创建一个长度为10的链表,其中包含数组data[]中的元素。

示例2:删除节点

假设我们创建的链表如下:

3 -> 4 -> 1 -> 7 -> 5 -> 6 -> 9 -> 0 -> 2 -> 8

我们可以使用下面的代码删除第4个节点:

list = deleteNode(list, 4);

以上代码实现了删除链表中的第4个节点,从而得到以下链表:

3 -> 4 -> 1 -> 5 -> 6 -> 9 -> 0 -> 2 -> 8

总结

通过本文,我们了解了单链表的基本操作及其原理,同时通过实例也更加直观地了解了如何在C语言中实现单链表算法。作为一种非常实用灵活的数据结构,单链表在计算机科学中有着非常重要的应用,值得我们深入学习和应用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c语言实现单链表算法示例分享 - Python技术站

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

相关文章

  • Redis五种数据结构在JAVA中如何封装使用

    Redis 是一款高性能的键值存储数据库,支持五种不同的数据结构:字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set)。在Java中使用Redis需要封装对应的数据结构,本文将详细介绍如何封装Redis的五种数据结构。 封装Redis字符串数据结构 Redis字符串数据结构对应Java中的String类…

    数据结构 2023年5月17日
    00
  • C语言数据结构中串的模式匹配

    C语言数据结构中串的模式匹配 什么是字符串的模式匹配? 字符串的模式匹配是指在一个主字符串中查找特定的子串,找到特定的子串后输出其在主字符串中的位置。 例如有一个主串”this is a test string”,要查找的子串为”string”,则字符串的模式匹配应能输出”string”在主串中的位置为17。 如何实现字符串的模式匹配? 字符串的模式匹配可以…

    数据结构 2023年5月17日
    00
  • Java数据结构与算法入门实例详解

    Java数据结构与算法入门实例详解攻略 概述 本攻略主要介绍Java数据结构与算法入门实例详解,包括学习的目标、适合的人群、学习方法等。通过本攻略的学习,可以更好地掌握Java数据结构和算法的基本知识,提升编程水平。 学习目标 本攻略的学习目标为: 掌握Java基础数据结构,如数组、链表、栈、队列等; 理解并掌握常见算法,如排序、查找、递归等; 掌握Java…

    数据结构 2023年5月17日
    00
  • java数据结构排序算法之树形选择排序详解

    Java数据结构排序算法之树形选择排序详解 什么是树形选择排序 树形选择排序是对选择排序的一种改进和优化,它是通过利用完全二叉树的性质对选择排序进行了改进而得到的一种高效的排序算法。 树形选择排序通过将待排序的元素构建成一颗完全二叉树,然后从叶子节点向上比较,选择出最小的元素,并交换位置。这样子,每次选择最小元素的时候,减少了元素之间的比较次数,从而提高了排…

    数据结构 2023年5月17日
    00
  • 【ACM博弈论】SG函数入门(2):博弈树SG函数的转移与子游戏的合并

    上一篇文章我们讲了两种经典的博弈模型:《【ACM博弈论】SG函数入门(1):从巴什博奕到尼姆游戏》,这一节我们开始讲解SG函数。 ? 作者:Eriktse? 简介:19岁,211计算机在读,现役ACM银牌选手?力争以通俗易懂的方式讲解算法!❤️欢迎关注我,一起交流C++/Python算法。(优质好文持续更新中……)?? 阅读原文获得更好阅读体验:https:…

    算法与数据结构 2023年4月17日
    00
  • 用C语言举例讲解数据结构中的算法复杂度结与顺序表

    让我来为你讲解“用C语言举例讲解数据结构中的算法复杂度结与顺序表”的完整攻略。具体如下: 一、算法复杂度 1.1 什么是算法复杂度 算法复杂度是衡量算法运行效率的重要指标。包括时间复杂度和空间复杂度。时间复杂度指算法解决问题所用的时间,通常用大O符号表示;空间复杂度指算法解决问题所需的内存空间大小。 1.2 如何分析算法复杂度 可以从以下三个方面来分析算法复…

    数据结构 2023年5月17日
    00
  • Python描述数据结构学习之哈夫曼树篇

    Python描述数据结构学习之哈夫曼树篇攻略 简介 本篇攻略旨在介绍哈夫曼树的概念、构建方法和应用场景,并结合Python代码进行演示。 哈夫曼树概念 哈夫曼树(Huffman Tree)又称最优树,它是一种带权路径长度最短的树。所谓带权路径长度,就是每个节点的权值乘以其到根节点的路径长度(即树的层数)之和。哈夫曼树广泛应用于数据压缩领域。 哈夫曼树构建方法…

    数据结构 2023年5月17日
    00
  • Java链表数据结构及其简单使用方法解析

    Java链表数据结构及其简单使用方法解析 概述 链表是一种非线性结构,由一系列节点按照顺序连接而成。每个节点由数据域和指针域组成,数据域用于存储数据,指针域用于指向下一个节点或者上一个节点。在Java中,链表有多种实现方式,常见的有单向链表、双向链表等。 单向链表的实现 以下是一个单向链表的实现代码示例: public class Node { privat…

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