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日

相关文章

  • laravel基础操作手册

    Laravel基础操作手册 Laravel是一款流行的PHP Web框架,具有优雅的语法和开发效率高的特点,为PHP开发提供了更好的开发体验。在进行Laravel开发时,我们需要掌握一些基础操作,本文将为您提供一份Laravel基础操作手册,帮助您更快更好地掌握Laravel的使用。 创建Laravel项目 首先,我们需要使用Composer工具创建一个La…

    其他 2023年3月29日
    00
  • fontawesome字体的百度cdn地址

    FontAwesome字体的百度CDN地址的完整攻略 FontAwesome是一种流行的图标字体,它包含大量的图标,可以用于网页设计和开中。本文将提供一个完整攻略,介绍FontAwesome字体的百度CDN及其使用方法,并提供两个示例说明。 FontAwesome字体的百度CDN地址 FontAwesome字体的百度CDN地址为: <link rel=…

    other 2023年5月8日
    00
  • Web前端和JAVA应该学哪个?哪个就业形势更胜一筹?

    Web前端和JAVA学习攻略 1. Web前端学习攻略 Web前端开发是构建用户界面的技术,涉及HTML、CSS和JavaScript等技术。以下是学习Web前端的攻略: a. 学习HTML和CSS HTML是网页的基础,用于定义网页结构。学习HTML标签、元素和属性,以及如何创建网页布局。 CSS用于控制网页的样式和布局。学习CSS选择器、样式属性和盒模型…

    other 2023年7月27日
    00
  • android 手机SD卡读写操作(以txt文本为例)实现步骤

    Android手机SD卡读写操作(以txt文本为例)实现步骤 步骤一:添加权限 在AndroidManifest.xml文件中添加以下权限: <uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\" /> <uses-permi…

    other 2023年9月6日
    00
  • vue-cli4如何打包静态资源到指定目录

    为了将静态资源打包到指定目录,我们需要修改vue.config.js文件,并设置publicPath和outputDir属性。以下是详细的攻略: 第一步:创建vue.config.js文件 我们需要在项目根目录下创建vue.config.js文件,并在该文件中设置publicPath和outputDir属性。如果原来不存在该文件,可以通过如下命令创建: to…

    other 2023年6月27日
    00
  • spring初始化源码代码浅析

    首先,我们需要了解Spring的初始化过程是什么,可以大致分为以下几个步骤: Spring容器的创建 Spring容器的配置 Spring容器的初始化 在这篇攻略中,我们将主要关注第三步- Spring容器的初始化源码分析,具体内容如下: 1. 获取并解析XML配置文件 Spring初始化的第一步是获取并解析XML文件,这里会用到Spring的核心模块spr…

    other 2023年6月20日
    00
  • Android App获取屏幕旋转角度的方法

    Android App获取屏幕旋转角度的方法攻略 在Android应用程序中,要获取屏幕旋转角度,可以使用以下方法: 方法一:使用OrientationEventListener OrientationEventListener是一个监听设备方向变化的类,可以用来获取屏幕旋转角度。下面是使用OrientationEventListener的示例代码: pub…

    other 2023年8月20日
    00
  • 了解nonheap吗?

    了解nonheap吗? 在Java虚拟机中,内存分为堆内存和非堆内存。堆内存用于存储对象实例,而非堆内存用于存储Java虚拟机自身的数据。其中,非堆内存又分为方法区和直接内存。本文将详细讲解nonheap的概念、作用、示例等内容。 nonheap的概念 nonheap是虚拟机中的非堆内存,用于存储Java虚拟机自身的数据。nonheap包括方法区和直接内存两…

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