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日

相关文章

  • 用C语言实现单链表的各种操作(一)

    “用C语言实现单链表的各种操作(一)”详细介绍了如何通过C语言来实现单链表的常见操作。下面,我会结合该文章的内容,对其进行完整攻略的介绍。 文章的主要内容包括:单链表的定义、单链表的初始化、判断单链表是否为空、获取单链表中元素个数、在链表开头插入元素、在链表末尾插入元素、在链表中间插入元素、删除链表中指定元素、在链表中查找指定元素、链表的反转以及链表的销毁。…

    数据结构 2023年5月17日
    00
  • C语言数据结构与算法之时间空间复杂度入门

    C语言数据结构与算法之时间空间复杂度入门攻略 1. 什么是时间复杂度和空间复杂度? 在进行算法设计时,我们不仅需要考虑到算法的正确性,还要考虑到算法的执行效率。而衡量算法执行效率的指标主要有两个,即时间复杂度和空间复杂度: 时间复杂度:衡量算法所需时间的度量,通常用“大O”符号来表示。比如,对于n个元素的数组,某些算法需要执行n次操作,这个算法的时间复杂度就…

    数据结构 2023年5月16日
    00
  • Redis底层数据结构详解

    Redis底层数据结构详解 前言 Redis是一款开源的,高性能的,基于内存的数据结构存储系统。Redis支持多种数据结构,包括简单的键值对、列表、集合、有序集合等等。本篇文章将深入分析Redis的底层数据结构,介绍它们的原理、优缺点和适用场景。 1. 哈希表(Hash Table) 哈希表是Redis中最常用的底层数据结构之一。可以通过以下命令在Redis…

    数据结构 2023年5月17日
    00
  • javascript数据结构与算法之检索算法

    JavaScript 数据结构与算法之检索算法 什么是检索算法 检索算法,也称为查找算法,是解决在数据集合中寻找某个特定元素的算法。 比如,在一个给定的数组中查找特定的元素,或者在一个字典中查找某个特定单词的定义等等,这些都是检索算法的应用场景。 JavaScript 中的检索算法主要有以下几种:线性查找、二分查找、哈希查找。 线性查找 线性查找,也叫顺序查…

    数据结构 2023年5月17日
    00
  • MySQL高级篇之索引的数据结构详解

    MySQL高级篇之索引的数据结构详解 索引的作用 索引是一种数据结构,用于快速地定位和访问数据表中的指定行。MySQL中索引通常以B-tree(B树)或哈希表的形式来实现,通过将索引存储在内存中,可以提高系统的查询效率。 常用的索引分为主键索引、唯一索引和普通索引。其作用分别为: 主键索引:保证表中每一行数据的唯一性,便于快速查询和修改数据。 唯一索引:保证…

    数据结构 2023年5月17日
    00
  • C语言实现通用数据结构之通用链表

    C语言是一门广泛应用于低级别系统编程的语言,也是数据结构和算法学习的重要工具之一,而在C语言中实现通用数据结构的方法之一就是通用链表。 通用链表是一种使用节点来组织数据的通用数据结构,每个节点包含一定量的数据以及指向链表中下一个节点的指针,因此,它可以用来实现许多不同的数据结构,例如栈、队列、树、图、哈希表等等。 具体实现通用链表的方法如下: 步骤一:定义节…

    数据结构 2023年5月17日
    00
  • C语言数据结构实现字符串分割的实例

    C语言中数据结构实现字符串分割可以用到两种常见数据结构:指针和数组。 方法一:指针 步骤一:创建指针 首先声明一个指针类型的变量,用来存储字符串中单个字符所在的地址: char *ptr; 步骤二:遍历字符串 通过对字符串进行遍历,在每个分隔符位置上获取单词,并通过指针记录下每个单词的地址: char str[] = "C语言-数据结构-字符串分割…

    数据结构 2023年5月17日
    00
  • 二叉搜索树的本质

    引言 打算写写树形数据结构:二叉查找树、红黑树、跳表和 B 树。这些数据结构都是为了解决同一个基本问题:如何快速地对一个大集合执行增删改查。 本篇是第一篇,讲讲搜索树的基础:二叉搜索树。 基本问题 如何在一千万个手机号中快速找到 13012345432 这个号(以及相关联信息,如号主姓名)? 最笨的方案 把一千万个手机号从头到尾遍历一遍,直到找到该手机号,返…

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