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++数据结构之搜索二叉树的实现 搜索二叉树(Binary Search Tree, BST)是一种常见的数据结构,它支持快速地查找、插入和删除元素。本文将详细讲述如何用C++实现搜索二叉树。 一、搜索二叉树的定义 搜索二叉树是一种二叉树,它满足以下性质: 对于任意一个节点,其左子树中的所有节点都小于它,其右子树中的所有节点都大于它; 每个节点的左右子树也都…

    数据结构 2023年5月17日
    00
  • Java数据结构顺序表的详细讲解

    Java数据结构顺序表的详细讲解 什么是顺序表? 顺序表是一种线性结构,它通过一段连续的存储空间来存储一组元素,每个元素占用一个固定大小的存储单元,元素之间按照一定的顺序紧密排列。 顺序表的实现 在Java中,顺序表可以通过数组实现。数组是一种非常基础的数据结构,它可以用来存储相同类型的数据,数组元素的地址是连续的,因此可以通过下标访问数组中的元素。 实现步…

    数据结构 2023年5月17日
    00
  • 环形队列的实现 [详解在代码中]

    1 package DataStructures.Queue.Array.Exerice; 2 3 /** 4 * @author Loe. 5 * @project DataStructures&Algorithms 6 * @date 2023/5/8 7 * @ClassInfo 环形队列 8 * 主要使用取模的特性来实现环形特征 9 */ 1…

    算法与数据结构 2023年5月8日
    00
  • C语言数据结构实现链表逆序并输出

    下面是C语言数据结构实现链表逆序并输出的完整攻略。 1. 题目分析 本题目要求实现对链表的逆序,并依次输出各节点的值。而链表的逆序可以通过改变各节点之间的连接方式来实现。 2. 思路分析 创建一个指针,指向原链表的头结点。 遍历链表,将每个节点的next指针指向它前面的节点,从而实现链表的逆序。 遍历逆序后的链表,从头结点开始,依次输出每个节点的值。 3. …

    数据结构 2023年5月17日
    00
  • Java面试题冲刺第十九天–数据库(4)

    本篇攻略是针对Java数据库相关面试题的,为了方便浏览,我将其分为以下几个部分: 1. 数据库连接池 在Java开发中,我们使用JDBC连接数据库进行数据操作时,为了提高数据库访问性能,通常会使用数据库连接池技术。常见的数据库连接池有:C3P0、Druid、HikariCP等。 C3P0 C3P0是一个开源的数据库连接池,可以设置最大连接数、最小连接数、最大…

    数据结构 2023年5月17日
    00
  • 常用内核架构

      本文分享自天翼云开发者社区《常用内核架构》,作者:JackW   宏内核 应用程序调用内存分配的 API(应用程序接口)函数。 处理器切换到特权模式,开始运行内核代码。 内核里的内存管理代码按照特定的算法,分配一块内存。 把分配的内存块的首地址,返回给内存分配的 API 函数。 内存分配的 API 函数返回,处理器开始运行用户模式下的应用程序,应用程序就…

    算法与数据结构 2023年4月22日
    00
  • Java队列数据结构的实现

    下面是实现Java队列数据结构的完整攻略。 Java队列数据结构的实现 1. 概述 队列是一种常用的线性数据结构,是“先进先出”(FIFO)的一种数据结构。队列通常具有两个操作:入队和出队,它们分别对应着在队列尾添加元素和在队列头删除元素的操作。 在Java中,有多种方式可以实现队列数据结构,本文将讲解两种常用的实现方式:基于数组的实现和基于链表的实现。 2…

    数据结构 2023年5月17日
    00
  • php数据结构与算法(PHP描述) 查找与二分法查找

    以下是详细讲解“php数据结构与算法(PHP描述) 查找与二分法查找”的完整攻略。 1. 数据结构与算法简介 数据结构是计算机中存储和组织数据的方式。它涉及到数据的表示、处理和存储方式等。 算法则是完成特定任务的步骤集合。算法设计可以优化计算机程序的效率和速度。 PHP是一种非常流行的服务器端脚本语言,数据结构和算法对web开发者来说非常重要。因此,我们需要…

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