C语言 数据结构链表的实例(十九种操作)

C语言 数据结构链表的实例(十九种操作)攻略

简介

链表是一种动态数据结构,以链式存储方式让任意节点之间相互连接,链表中的每个节点包含两个部分:数据域和指针域,数据域存储节点的数据,指针域存储下一个节点的地址。链表的优点是可以动态地分配内存,其缺点是查询效率较低。

本攻略将介绍19种链表操作,其中包括创建链表、添加节点、删除节点、查找节点以及遍历链表等操作。

创建链表

创建链表需要动态分配内存,同时需要指向链表头的指针,以下是创建链表的代码:

typedef struct node{
    int data;
    struct node *next;
}LinkedList, *LinkedListPtr;

//创建链表
LinkedListPtr createList(){
    LinkedListPtr head = (LinkedListPtr)malloc(sizeof(LinkedList));
    head->next = NULL;
    return head;
}

添加节点

添加节点需要在链表尾部或者指定位置插入节点,以下是添加节点的代码:

在链表尾部添加节点

//在链表尾部添加节点
void addTail(LinkedListPtr head, int data){
    LinkedListPtr node = (LinkedListPtr)malloc(sizeof(LinkedList));
    node->data = data;
    node->next = NULL;
    LinkedListPtr p = head;
    while(p->next != NULL){//找到链表的尾节点
        p = p->next;
    }
    p->next = node;
}

在指定位置插入节点

//在指定位置插入节点
void insertNode(LinkedListPtr head, int pos, int data){
    LinkedListPtr node = (LinkedListPtr)malloc(sizeof(LinkedList));
    node->data = data;
    LinkedListPtr p = head;
    int i = 0;
    while(p != NULL && i < pos){//找到要插入位置的前一个节点
        p = p->next;
        i++;
    }
    if(p == NULL || i > pos){//如果节点不存在或插入位置非法,直接返回
        free(node);
        return;
    }
    node->next = p->next;
    p->next = node;
}

删除节点

删除节点需要找到要删除的节点的前一个节点,将其指向要删除的节点的指针指向要删除节点的下一个节点,以下是删除节点的代码:

//删除节点
void deleteNode(LinkedListPtr head, int data){
    LinkedListPtr p = head;
    while(p->next != NULL && p->next->data != data){//找到要删除节点的前一个节点
        p = p->next;
    }
    if(p->next == NULL){//如果要删除的节点不存在,直接返回
        return;
    }
    LinkedListPtr tmp = p->next;
    p->next = p->next->next;
    free(tmp);//释放要删除节点的内存空间
}

查找节点

查找节点可以根据节点的位置或者节点的值查找,以下是查找节点的代码:

根据节点的位置查找

//根据位置查找节点
LinkedListPtr findNodeByPos(LinkedListPtr head, int pos){
    LinkedListPtr p = head->next;
    int i = 0;
    while(p != NULL && i < pos){//找到要查找的节点
        p = p->next;
        i++;
    }
    return p;
}

根据节点的值查找

//根据节点的值查找节点
LinkedListPtr findNodeByData(LinkedListPtr head, int data){
    LinkedListPtr p = head->next;
    while(p != NULL && p->data != data){//找到要查找的节点
        p = p->next;
    }
    return p;
}

遍历链表

遍历链表可以按顺序输出链表中的每个节点的值,以下是遍历链表的代码:

//遍历链表
void traverseList(LinkedListPtr head){
    LinkedListPtr p = head->next;
    while(p != NULL){//遍历链表中的每个节点
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");
}

示例

示例1:创建链表,向链表尾部添加元素,遍历链表

LinkedListPtr head = createList();
addTail(head,1);
addTail(head,2);
addTail(head,3);
addTail(head,4);
traverseList(head);

输出结果:

1 2 3 4

示例2:创建链表,向链表中插入元素,删除链表中的元素,遍历链表

LinkedListPtr head = createList();
addTail(head,1);
addTail(head,2);
addTail(head,3);
addTail(head,4);
insertNode(head, 1, 10);
traverseList(head);
deleteNode(head, 3);
traverseList(head);

输出结果:

1 10 2 3 4 
1 10 2 4 

以上是链表的19种操作的攻略,可以根据需要进行修改和扩展。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言 数据结构链表的实例(十九种操作) - Python技术站

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

相关文章

  • Java数据结构与算法入门实例详解

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

    数据结构 2023年5月17日
    00
  • C++数据结构之单链表的实现

    C++数据结构之单链表的实现可分为以下步骤: 1. 定义链表节点类 链表节点类需要包含两个成员变量,一个是存储数据的变量,另一个是指向下一个节点的指针变量。同时,需要实现构造函数和析构函数。 class Node{ public: int data; // 存储节点数据 Node* next; // 指向下一个节点的指针 Node(int data):dat…

    数据结构 2023年5月17日
    00
  • C语言 超详细总结讲解二叉树的概念与使用

    C语言 超详细总结讲解二叉树的概念与使用 1. 什么是二叉树? 二叉树是一种树状数据结构,其中每个节点最多有两个子节点,被称为左子节点和右子节点。具有以下几个特点: 每个节点最多有两个子节点; 左子节点可以为空,右子节点也可以为空; 二叉树的每个节点最多有一个父节点; 二叉树通常定义为递归模式定义,即每个节点都可以看做一棵新的二叉树。 2. 二叉树的遍历方式…

    数据结构 2023年5月17日
    00
  • JavaScript的Set数据结构详解

    JavaScript中的Set数据结构详解 什么是Set? Set 是一种 Javascript 内置的数据结构。它类似于数组,但是成员的值都是唯一的,没有重复的值。Set 本身是一个构造函数,可以通过new关键字来创建 Set 数据结构。 let mySet = new Set(); Set的基本用法 Set实例对象有以下常用方法: add(value):…

    数据结构 2023年5月17日
    00
  • 一文吃透JS树状结构的数据处理(增删改查)

    一文吃透JS树状结构的数据处理(增删改查) 什么是树状结构 树状结构是一种经典的数据结构,在计算机领域中被广泛应用。树状结构由连通的节点组成,节点之间形成父子关系。一根树状结构的“根节点”没有父节点,每个子节点可以有多个“子节点”,但一个“子节点”只能有一个“父节点”。常见的应用包括文件系统、HTML DOM 和 JSON 数据格式等。 数据结构设计 我们以…

    数据结构 2023年5月17日
    00
  • Java数据结构之插入排序与希尔排序

    Java数据结构之插入排序与希尔排序 插入排序 插入排序是一种简单而有效的排序算法。它的基本思想是将一个元素插入已经排好序的部分中。插入排序的过程可以用以下伪代码表示: for i=1 to length-1 j = i while j > 0 and array[j-1] > array[j] swap array[j] and array[j…

    数据结构 2023年5月17日
    00
  • Java数据结构之对象的比较

    Java数据结构之对象的比较 在Java中,对象的比较是非常重要的操作。我们常常需要对不同的对象进行比较,以便对它们进行排序、按照某个条件过滤等操作。本文将详细讲解Java中对象的比较,并给出一些示例来说明。 对象的比较方法 Java中有两种对象比较方法:值比较和引用比较。值比较就是比较两个对象的值是否相等,而引用比较是比较两个对象是否是同一个对象。 值比较…

    数据结构 2023年5月17日
    00
  • C++ 数据结构二叉树(前序/中序/后序递归、非递归遍历)

    下面是关于C++二叉树数据结构的详细攻略。 什么是二叉树 二叉树是一种树形数据结构,每个节点最多有两个子节点:左节点和右节点。一个节点没有左节点或右节点则分别为左子树和右子树为空。 递归遍历二叉树 前序遍历 前序遍历是指对于一棵二叉树,在访问右子树之前,先访问根节点,然后访问左子树。 下面是C++递归遍历二叉树的前序遍历示例代码: template <…

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