c语言链表操作示例分享

本文将详细讲解如何使用C语言操作链表,主要内容包括链表的定义、创建、插入、删除、查找、遍历等示例操作。

链表的定义

链表是一种常见的数据结构,它由一系列的节点(结构体)组成,每个节点包含数据域和指向下一个节点的指针域。链表的结构体定义如下:

typedef struct node {
    int data;              // 数据域
    struct node* next;     // 指针域
} ListNode;

链表的头节点是第一个非数据节点,也称为哨兵节点。它的数据域可以为空,指针域指向第一个数据节点。

ListNode* head = NULL;

链表的创建

链表的创建可以分为两种方式:头插法和尾插法。以头插法为例,其步骤如下:

  1. 定义一个头节点,指针域为NULL。
  2. 读入一个节点数据,创建一个新节点,将新节点的指针域指向头节点的指针域,将头节点的指针域指向新节点。
  3. 重复第2步,直到读入所有节点数据为止。

示例代码如下:

ListNode* createList() {
    ListNode* head = (ListNode*)malloc(sizeof(ListNode));  // 创建头节点
    head->next = NULL;                                     // 空链表只有头节点,指针域为NULL

    int data;
    ListNode* newNode;
    while (scanf("%d", &data) != EOF) {                    // 读入节点数据
        newNode = (ListNode*)malloc(sizeof(ListNode));     // 创建新节点
        newNode->data = data;
        newNode->next = head->next;                        // 将新节点的指针域指向头节点的指针域
        head->next = newNode;                              // 将头节点的指针域指向新节点
    }
    return head;
}

链表的插入

链表的插入可以分为三种方式:头插法、尾插法和在指定位置插入。以在指定位置插入为例,其步骤如下:

  1. 找到要插入位置的前一个节点。
  2. 创建一个新节点,将新节点的指针域指向前一个节点的指针域,将前一个节点的指针域指向新节点。

示例代码如下:

void insertNode(ListNode* head, int pos, int data) {
    ListNode* p = head;
    ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));     // 创建新节点
    newNode->data = data;
    newNode->next = NULL;

    for (int i = 0; i < pos && p != NULL; i++) {                 // 找到要插入位置的前一个节点
        p = p->next;
    }
    if (p == NULL) {
        printf("插入位置非法\n");
        return;
    }
    newNode->next = p->next;                                    // 将新节点的指针域指向前一个节点的指针域
    p->next = newNode;
}

链表的删除

链表的删除同样可以根据需求分为三种方式:删除头节点、删除尾节点和删除指定位置。以删除指定位置为例,其步骤如下:

  1. 找到要删除位置的前一个节点,记为p。
  2. 将p的指针指向要删除节点的下一个节点。

示例代码如下:

void deleteNode(ListNode* head, int pos) {
    ListNode* p = head;
    ListNode* tmp;

    for (int i = 0; i < pos && p != NULL; i++) {                 // 找到要删除位置的前一个节点
        p = p->next;
    }
    if (p == NULL || p->next == NULL) {                          // 如果p为空或p的下一个节点为空,则删除位置非法
        printf("删除位置非法\n");
        return;
    }
    tmp = p->next;                                               // 将p的指针指向要删除节点的下一个节点
    p->next = tmp->next;
    free(tmp);                                                   // 释放要删除节点的内存空间
}

链表的查找

链表的查找比较简单,只需要从头节点开始依次遍历每个节点即可。以查找指定元素为例,其步骤如下:

  1. 从头节点开始遍历每个节点,比较每个节点的数据域是否等于要查找的元素。
  2. 如果相等,则返回该节点的指针;否则返回NULL。

示例代码如下:

ListNode* searchNode(ListNode* head, int target) {
    ListNode* p = head->next;                                     // 从头节点开始遍历每个节点
    while (p != NULL) {
        if (p->data == target) {                                  // 比较每个节点的数据域是否等于要查找的元素
            return p;                                             // 返回该节点的指针
        }
        p = p->next;
    }
    return NULL;                                                  // 没找到,返回NULL
}

链表的遍历

链表的遍历也比较容易,只需要从头节点开始依次遍历每个节点,输出每个节点的数据域即可。

示例代码如下:

void printList(ListNode* head) {
    ListNode* p = head->next;                                     // 从头节点开始遍历每个节点
    while (p != NULL) {
        printf("%d ", p->data);                                   // 输出每个节点的数据域
        p = p->next;
    }
    printf("\n");
}

以上就是C语言链表操作的完整攻略,分别介绍了链表的定义、创建、插入、删除、查找和遍历,希望对大家有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c语言链表操作示例分享 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • .httacces文件的配置技巧

    下面是“.htaccess文件的配置技巧”的完整攻略: 什么是“.htaccess”文件? “.htaccess”是 Apache Web服务器上存放在网站根目录下的隐藏文件,它允许用户在不修改服务器配置文件的情况下对网站进行一些配置和控制访问。这个文件里面的指令可以用来精确控制Web服务器的行为,例如重写URL、防止目录遍历攻击、设置用户身份验证等。 如何…

    other 2023年6月25日
    00
  • go grpc安装使用教程

    Go gRPC 安装使用教程 简介 gRPC 是一种高效、强大、轻便的通信框架,用于构建分布式应用程序。使用 gRPC,您可以定义服务并生成有效的客户端和服务器端代码。gRPC 可以在许多语言和平台之间进行通信,包括 Go、Java、C++、Python、Ruby、Node.js 和 PHP 等语言。在本文中,我们将说明如何在 Go 中使用 gRPC。 安装…

    other 2023年6月26日
    00
  • Go并发编程中使用channel的方法

    下面我就来详细讲解Go并发编程中使用channel的方法的完整攻略。 什么是channel Go语言中的channel是一种通信机制,用于协调多个goroutine之间的交互和同步。简单来说,channel就是一个通道,通过它可以在goroutine之间传递数据,实现数据共享,实现同步或异步的通信。 channel的创建和关闭 channel是通过内置函数m…

    other 2023年6月27日
    00
  • C++中declspec(dllexport)和declspec(dllimport) 的用法介绍

    下面是“C++中declspec(dllexport)和declspec(dllimport)的用法介绍”的完整攻略: 基本概念 declspec(dllexport)和declspec(dllimport)是MSVC编译器提供的一种扩展语法,用于在动态链接库(DLL)中进行函数的导出和导入操作。 declspec(dllexport)是用于在动态链接库(D…

    other 2023年6月26日
    00
  • java string类的常用方法详细介绍

    Java String类的常用方法详细介绍 Java中的String类是一个非常常用的类,它提供了许多方法来处理字符串。在本攻略中,我们将详细介绍String类的常用方法,并提供一些示例说明。 1. 字符串长度 length() length()方法用于获取字符串的长度,即字符串中字符的个数。 示例: String str = \"Hello, W…

    other 2023年8月6日
    00
  • java时间 java.util.Calendar深入分析

    Java时间:java.util.Calendar深入分析 java.util.Calendar是Java日期和时间处理的核心类之一。它能够处理Java程序中与日期和时间相关的操作。本文将深入介绍Calendar类,让开发者更加全面地了解它的使用。 1. Calendar类的概述 Calendar类是一个抽象类,用于将日期和时间抽象成一个可以操作的对象,使得…

    other 2023年6月27日
    00
  • Vue-cli@3.0 插件系统简析

    Vue-cli@3.0 插件系统简析 Vue-cli@3.0是Vue.js官方提供的脚手架工具,能够帮助我们快速创建Vue.js项目,提供了丰富的配置选项和插件扩展能力。本文主要介绍Vue-cli@3.0的插件系统,让我们能够更好的了解和使用Vue-cli@3.0。 Vue-cli@3.0 插件系统简介 Vue-cli@3.0的插件系统是基于Plugin A…

    other 2023年6月27日
    00
  • vue中关于this.$router.push地址更新页面不跳转的问题

    Vue中关于this.$router.push地址更新页面不跳转的问题 在Vue中,我们可以使用this.$router.push来更新地址并跳转到新页面。但有时候,我们会遇到地址更新了但是页面没有跳转的问题。本攻略将介绍如何解决这个问题。 原因分析 在Vue中,this.$router.push实际上是异步执行的。这意味着在执行this.$router.p…

    other 2023年5月9日
    00
合作推广
合作推广
分享本页
返回顶部