c语言链表操作示例分享

yizhihongxing

本文将详细讲解如何使用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日

相关文章

  • c++-如果包含重复元素 如何合并多个vector?

    以下是C++中合并多个vector并保留重复元素的完整攻略: 使用std::vector的insert函数 使用std::vector的insert函数将多个vector合并,并保留重复元素。以下是一个示: #include <iostream> #include <vector> using namespace std; vecto…

    other 2023年5月8日
    00
  • Access窗体怎么创建组合框及列表框控件?

    创建Access窗体时,可以通过添加组合框和列表框控件来提供更好的用户体验。下面是创建这些控件的完整攻略。 创建组合框控件 在Access窗体设计器中,选择“设计”视图。 从工具箱中选择“组合框”控件并将其拖到你的窗体中。 右击组合框控件,选择“属性”窗口。 在“数据”选项卡中,选择你想要提供选项的表或查询。 在“格式”选项卡中,选择你想要显示的字段。 指定…

    other 2023年6月27日
    00
  • android系统id介绍

    Android系统id介绍 在Android系统中,每个Android设备都有一个唯一的标示符,即设备ID。这个ID在应用程序开发中也被称为Android ID,设备ID,系统ID等等,是一个可以用于标识Android设备的字符串。 获取Android ID 获取Android ID非常容易,只需要使用以下代码即可: String android_id = …

    其他 2023年3月28日
    00
  • 每次打开excel2010都要配置如何解决

    如果每次打开Excel 2010都需要配置,可能是由于某些设置或文件损坏导致的。以下是解决这个问题的完整攻略,包含两个示例说明。 步骤一:修复Microsoft Office 打开“控制面板”,然后单击“程序和功能”。 在“程序和功能”窗口中,找到Microsoft Office,然后右键单击它。 选择“更改”,然后选择“修复”。 按照屏幕上的说明进行操作,…

    other 2023年5月9日
    00
  • transactionscope是什么

    Transactionscope 是什么? TransactionScope 是 .NET Framework 中的一个类,用于管理事务的范围。它提供了一种简单的方法来处理跨多个资源的事务,例如数据库、消息队列和文件系统等。使用 TransactionScope 可以确保所有资源都在同一个事务中提交或回滚,从而保证数据的一致性和完整性。 Transactio…

    other 2023年5月6日
    00
  • windows server设置FTP域用户隔离的方法

    下面是详细讲解“Windows Server设置FTP域用户隔离”的攻略: 准备工作 在进行FTP域用户隔离的设置前,需要先做好以下准备工作: 首先需要安装IIS(Web服务器)以及FTP服务器组件。 确保域用户都已创建好,并且分配好每个用户所能访问的文件夹路径。 步骤一:创建FTP站点 在IIS管理器中,右键单击“站点”并选择“添加FTP站点”。 在“添加…

    other 2023年6月27日
    00
  • shellswitch语句

    当然,我很乐意为您提供有关“shell switch语句”的完整攻略。以下是详细的步骤和两个示例: 1. 什么是shell switch语句? shell switch语句是一种条件语句,用于根据不同的条件执行不同的代码块。它类似于if-else语句,但更适合处理多个条件。 2. shell switch语句的使用 以下是使用shell switch语句的步…

    other 2023年5月6日
    00
  • 简单实现Spring的IOC原理详解

    以下是简单实现Spring的IOC原理的完整攻略: 1. 创建Bean容器 首先,我们需要创建一个Bean容器,用于管理和存储所有的Bean对象。可以使用一个HashMap来实现简单的Bean容器。 public class BeanContainer { private Map<String, Object> beans = new HashM…

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