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日

相关文章

  • C++数据结构之文件压缩(哈夫曼树)实例详解

    我来为您详细讲解一下“C++数据结构之文件压缩(哈夫曼树)实例详解”这篇文章的完整攻略: 文章基本信息 标题:C++数据结构之文件压缩(哈夫曼树)实例详解 作者:Coder_XWG 发布时间:2019年12月24日 文章概述 该篇文章主要讲解了哈夫曼树在文件压缩方面的应用。通过实例讲解了如何使用哈夫曼编码将文件进行压缩,以及如何解压缩被压缩的文件,并对文章中…

    数据结构 2023年5月17日
    00
  • C++高级数据结构之二叉查找树

    C++高级数据结构之二叉查找树 什么是二叉查找树 二叉查找树,也称二叉搜索树(BST,Binary Search Tree),是一种常见的基于二叉树的数据结构,主要用于快速查找与排序。在二叉查找树上,左子树的每个节点都比其根节点小,右子树的每个节点都比其根节点大,同时整棵树也满足二叉树的性质。 二叉查找树的实现 我们可以通过C++语言实现二叉查找树的基本操作…

    数据结构 2023年5月17日
    00
  • 数据结构之位图(bitmap)详解

    数据结构之位图(bitmap)详解 什么是位图? 位图,又称为比特图、Bitmap,是一种非常常用的数据结构。它是一种特殊的数组,只能存储0或1,可以用来表示一些二元状态,如二进制码、字符集、颜色等信息。在数据挖掘、工程设计、网络安全等领域都有广泛的应用。 位图的原理 位图的原理是用数据的位来表示某个元素对应的值。如果对应位为1,则代表该元素存在,否则代表该…

    数据结构 2023年5月17日
    00
  • Python数据结构之顺序表的实现代码示例

    针对“Python数据结构之顺序表的实现代码示例”,我可以给出以下完整攻略: 什么是顺序表 顺序表是一种线性结构,是用一维数组来存储数据元素的有序集合。它支持随机访问,可以对任意位置的元素进行查找、插入、删除等操作。 顺序表的实现代码示例 以下是Python中实现顺序表的示例代码,以及相关的操作函数,包括创建空表、获取表长度、查找元素、插入元素、删除元素等。…

    数据结构 2023年5月17日
    00
  • JavaScript数据结构常见面试问题整理

    JavaScript数据结构常见面试问题整理 介绍 JavaScript是一种广泛使用的脚本语言,用于在Web上创建动态效果,验证表单,增强用户体验等。它是一种高级语言,使用许多数据结构来存储和处理数据。在面试中,考官通常会问一些与JavaScript数据结构相关的问题,这篇文章将整理一些常见的面试问题和他们的解答,以便帮助你做好准备。 常见问题 1. 什么…

    数据结构 2023年5月17日
    00
  • C#数据结构与算法揭秘四 双向链表

    C#数据结构与算法揭秘四 双向链表 简介 本文将讲解如何在C#中实现双向链表。双向链表是一种常用的数据结构,在许多算法中都有广泛应用,它提供了与单向链表不同的灵活性和便利性。 双向链表的实现 创建一个双向节点 双向链表由节点(Node)组成。一个节点包含两个指针:一个指向前一个节点,一个指向后一个节点。由于这两个指针都可能为null,所以我们将它们声明为可空…

    数据结构 2023年5月17日
    00
  • JavaScript数据结构与算法

    JavaScript数据结构与算法完整攻略 什么是数据结构与算法 数据结构和算法是计算机科学的重要组成部分,常用于解决数据处理问题的方法与技术。数据结构是指存储和组织数据的方式,而算法则是解决数据处理问题的途径和方法。 数据结构分类 数据结构可分为以下几类: 数组 —— 存储有序元素集合的线性结构; 栈 —— 一种后进先出的数据结构; 队列 —— 一种先进先…

    数据结构 2023年5月17日
    00
  • Java深入了解数据结构之栈与队列的详解

    Java深入了解数据结构之栈与队列的详解 1. 栈的概念 栈(Stack)是一种先进后出的数据结构,类似于一个箱子,新的物品只能放到箱子的顶部,旧的物品只能从箱子的顶部取出。栈通常有下面几个基本操作: push:将元素压入栈中,放在栈顶。 pop:将栈顶元素弹出,如果栈为空,则抛出异常。 peek:返回栈顶元素,但不将其弹出,如果栈为空,则抛出异常。 isE…

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