数据结构中的线性表链式存储介绍及其基本操作

简介: 链式存储是线性表的一种重要存储方式,它通过节点和指针的结构,实现了灵活的动态存储管理。本文介绍了单向链表的基本操作,并提供了相应的C语言代码示例。理解和掌握链表的操作对学习和应用数据结构具有重要意义。希望这篇博客能帮助你更好地理解线性表的链式存储。

数据结构中的线性表链式存储介绍及其基本操作

在数据结构中,线性表是一种基本的数据结构。它是一组具有相同类型的元素的有序集合。线性表的存储方式有两种:顺序存储和链式存储。本文将重点介绍线性表的链式存储及其相关的基本操作,并提供相应的C语言代码示例。

线性表的链式存储

链式存储,又称链表,是通过一系列节点来存储数据的。每个节点包含两个部分:数据域和指针域。数据域存储数据元素,指针域存储下一个节点的地址。根据指针域的数量和结构,链表可以分为以下几种类型:

  1. 单向链表:每个节点只包含一个指针域,指向下一个节点。
  2. 双向链表:每个节点包含两个指针域,分别指向前一个节点和后一个节点。
  3. 循环链表:在单向链表或双向链表的基础上,使最后一个节点的指针指向链表的头节点,从而形成一个环。

单向链表

单向链表是最基本的一种链表结构。它的基本操作包括节点的插入、删除、查找和遍历。下面我们以单向链表为例,介绍其基本操作及相应的C语言代码实现。

单向链表的基本操作

节点结构

首先,我们需要定义单向链表节点的结构体:

#include <stdio.h>
#include <stdlib.h>

// 定义链表节点结构体
typedef struct Node {
   
    int data;              // 数据域
    struct Node* next;     // 指针域
} Node;

创建新节点

创建一个新节点并返回其指针:

Node* createNode(int data) {
   
    Node* newNode = (Node*)malloc(sizeof(Node));
    if (newNode == NULL) {
   
        printf("内存分配失败\n");
        exit(1);
    }
    newNode->data = data;
    newNode->next = NULL;
    return newNode;
}

插入节点

在链表的头部插入新节点:

void insertAtHead(Node** head, int data) {
   
    Node* newNode = createNode(data);
    newNode->next = *head;
    *head = newNode;
}

在链表的尾部插入新节点:

void insertAtTail(Node** head, int data) {
   
    Node* newNode = createNode(data);
    if (*head == NULL) {
   
        *head = newNode;
        return;
    }
    Node* temp = *head;
    while (temp->next != NULL) {
   
        temp = temp->next;
    }
    temp->next = newNode;
}

删除节点

删除链表中指定数据的节点:

void deleteNode(Node** head, int data) {
   
    Node* temp = *head;
    Node* prev = NULL;

    // 如果头节点就是要删除的节点
    if (temp != NULL && temp->data == data) {
   
        *head = temp->next;
        free(temp);
        return;
    }

    // 查找要删除的节点
    while (temp != NULL && temp->data != data) {
   
        prev = temp;
        temp = temp->next;
    }

    // 如果未找到要删除的节点
    if (temp == NULL) return;

    // 断开链接并释放内存
    prev->next = temp->next;
    free(temp);
}

查找节点

在链表中查找指定数据的节点:

Node* searchNode(Node* head, int data) {
   
    Node* current = head;
    while (current != NULL) {
   
        if (current->data == data) {
   
            return current;
        }
        current = current->next;
    }
    return NULL;
}

遍历链表

遍历并打印链表中的所有节点:

void printList(Node* head) {
   
    Node* current = head;
    while (current != NULL) {
   
        printf("%d -> ", current->data);
        current = current->next;
    }
    printf("NULL\n");
}

示例代码

最后,我们将上述操作结合起来,展示一个简单的示例程序:

int main() {
   
    Node* head = NULL;

    // 插入节点
    insertAtHead(&head, 1);
    insertAtHead(&head, 2);
    insertAtTail(&head, 3);
    insertAtTail(&head, 4);

    // 打印链表
    printf("链表内容: ");
    printList(head);

    // 查找节点
    int key = 3;
    Node* searchResult = searchNode(head, key);
    if (searchResult != NULL) {
   
        printf("找到节点: %d\n", searchResult->data);
    } else {
   
        printf("节点 %d 未找到\n", key);
    }

    // 删除节点
    deleteNode(&head, 2);
    printf("删除节点 2 后的链表: ");
    printList(head);

    // 释放链表内存
    while (head != NULL) {
   
        Node* temp = head;
        head = head->next;
        free(temp);
    }

    return 0;
}

总结

链式存储是线性表的一种重要存储方式,它通过节点和指针的结构,实现了灵活的动态存储管理。本文介绍了单向链表的基本操作,并提供了相应的C语言代码示例。理解和掌握链表的操作对学习和应用数据结构具有重要意义。希望这篇博客能帮助你更好地理解线性表的链式存储。

相关文章
|
2月前
|
存储 安全 数据库
除了 HashMap,还有哪些数据结构可以实现键值对存储?
【10月更文挑战第11天】 除了`HashMap`,其他常见支持键值对存储的数据结构包括:`TreeMap`(基于红黑树,键有序)、`LinkedHashMap`(保留插入顺序)、`HashTable`(线程安全)、`B-Tree`和`B+Tree`(高效存储大量数据)、`SkipList`(通过跳跃指针提高查找效率)及`UnorderedMap`(类似`HashMap`)。选择合适的数据结构需根据排序、并发、存储和查找性能等需求。
|
3月前
|
存储 Java
java数据结构,线性表链式存储(单链表)的实现
文章讲解了单链表的基本概念和Java实现,包括头指针、尾节点和节点结构。提供了实现代码,包括数据结构、接口定义和具体实现类。通过测试代码演示了单链表的基本操作,如添加、删除、更新和查找元素,并总结了操作的时间复杂度。
java数据结构,线性表链式存储(单链表)的实现
|
2月前
|
存储 Java
数据结构第二篇【关于java线性表(顺序表)的基本操作】
数据结构第二篇【关于java线性表(顺序表)的基本操作】
32 6
|
29天前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之王道第2.3章节之线性表精题汇总二(5)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
IKU达人之数据结构与算法系列学习×单双链表精题详解、数据结构、C++、排序算法、java 、动态规划 你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
2月前
|
存储
【数据结构】线性表和顺序表
【数据结构】线性表和顺序表
22 1
|
3月前
|
机器学习/深度学习 算法 Java
[算法与数据结构] 谈谈线性查找法~
该文章详细介绍了线性查找法的基本概念与实现方法,通过Java代码示例解释了如何在一个数组中查找特定元素,并分析了该算法的时间复杂度。
|
2月前
01(数据结构考研)线性表相关操作代码
01(数据结构考研)线性表相关操作代码
74 0
|
2月前
|
存储 C语言
数据结构之线性表的初始化及其操作
数据结构之线性表的初始化及其操作
37 0
|
3月前
|
存储 Java
java数据结构,线性表顺序存储(数组)的实现
文章介绍了Java中线性表顺序存储(数组)的实现。线性表是数据结构的一种,它使用数组来实现。文章详细描述了线性表的基本操作,如增加、查找、删除、修改元素,以及其他操作如遍历、清空、求长度等。同时,提供了完整的Java代码实现,包括MyList接口和MyLinearList实现类。通过main函数的测试代码,展示了如何使用这些方法操作线性表。
|
26天前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
122 9