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++数据结构的队列详解 队列是什么? 队列是一种先进先出(First In First Out, FIFO)的数据结构,类似于现实生活中的排队等待服务。 队列中的数据按照先进先出的原则被处理。新的元素只能被插入在队列的末尾,而旧的元素只能从队列的开头被删除。因此,队列的末尾称为队尾,队列的开头被称为队头。 队列的实现方式 数组实现方式 队列可以使用数组实现…

    数据结构 2023年5月17日
    00
  • C语言实现带头结点的链表的创建、查找、插入、删除操作

    C语言实现带头结点的链表的创建、查找、插入、删除操作攻略 一、链表基本概念 链表是一种动态的数据结构,它可以在运行时动态地分配内存,支持数据的插入、删除等操作。链表(Linked List)由多个节点(Node)组成,每个节点包含两部分,一个是数据部分(Data),另一个是指向下一个节点的指针(Next)。 二、带头结点的链表 带头结点的链表是一种特殊的链表…

    数据结构 2023年5月17日
    00
  • C++超详细讲解单链表的实现

    首先我们来了解一下单链表的概念。 单链表是一种常见的数据结构,在计算机科学中被广泛使用。它是由节点所组成的数据结构,其中每个节点都包含两部分,一个是存储数据的元素,另一个是指向下一个节点的指针。单链表的首节点被称为头部,而最后一个节点则被称为尾部。单链表可以通过在头部插入和删除元素来实现高效地数据操作。接下来我们将讲解如何实现一个 C++ 版的单链表。 实现…

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

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

    算法与数据结构 2023年4月22日
    00
  • JavaScript数据结构之广义表的定义与表示方法详解

    JavaScript数据结构之广义表的定义与表示方法详解 什么是广义表 广义表是一种包含了无数元素的数据结构,可以是元素或者嵌套的子表。广义表可以表示为: $\quad\quad\quad GL = (a_0,a_1,…,a_n)$ 其中$a_i$可以是元素或者一个子表,如果$a_i$为一个子表,那么$a_i$本身也是一个广义表。广义表中,第一个元素$a…

    数据结构 2023年5月17日
    00
  • Java数据结构之加权无向图的设计实现

    Java数据结构之加权无向图的设计实现 前言 在计算机科学中,图(Graph)作为一种基本数据结构,被广泛应用于各种领域,如网络流、图像处理、计算机视觉等。本文将介绍加权无向图(Weighted Undirected Graph)的设计实现,涉及图的存储、添加边、获取特定节点的相邻节点、计算最短路径等。 设计实现 存储结构 加权无向图可以用一个邻接表数组存储…

    数据结构 2023年5月17日
    00
  • java 数据结构之栈与队列

    Java 数据结构之栈与队列 什么是栈? 栈是一种根据先进后出(LIFO)原则的数据结构,即最后压入的元素最先弹出。栈可以用数组或链表实现。栈的两个基本操作是 push(入栈)和 pop(出栈)。 栈的特性 只允许在栈的顶部插入和删除元素。 操作受限只能从一端进行。 元素的插入和删除时间复杂度都为 O(1)。 栈的示例 以下是使用 Java 语言实现栈的示例…

    数据结构 2023年5月17日
    00
  • Java数据结构之LinkedList的用法详解

    Java数据结构之LinkedList的用法详解 LinkedList简介 LinkedList是Java中的一个数据结构,它是一个双向链表,可以提供快速的插入和删除操作。LinkedList中的元素分别保存在每个节点中,每个节点包含了指向前一个节点和后一个节点的引用。 使用LinkedList的好处是,其可以快速的进行插入和删除操作,但是如果需要随机存取中…

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