C语言中单链表的基本操作(创建、销毁、增删查改等)

yizhihongxing

下面我将为你详细讲解C语言中单链表的基本操作,包括创建、销毁、增删查改等。

单链表的基本结构

单链表是一种常见的数据结构,它由多个节点组成,每个节点都包含两个部分:数据域和指针域。数据域用于存储数据,指针域用于指向下一个节点。

在C语言中,我们可以通过定义一个结构体来表示一个节点,结构体中包含数据域和指针域两个成员变量,如下所示:

typedef struct Node {
    int data;             // 数据域
    struct Node *next;    // 指针域,指向下一个节点
} Node;

创建单链表

创建单链表的基本思路是从头节点开始,依次添加新节点。在C语言中,我们可以通过动态分配内存的方式来创建新节点。

具体步骤如下:

  1. 创建头节点,并将其next指针初始化为NULL;
  2. 依次读入数据,创建新节点,并将其插入到链表中。

下面是示例代码:

Node* createList() {
    Node *head = (Node*) malloc(sizeof(Node));   // 创建头节点
    head->next = NULL;   // 初始化头节点指针为空

    int data;
    Node *tail = head;   // 只有一个节点时,头节点和尾节点都指向它

    while (scanf("%d", &data) != EOF) { // 依次读入数据,插入到链表中
        Node *node = (Node*) malloc(sizeof(Node));
        node->data = data;
        node->next = NULL;

        tail->next = node;
        tail = node;   // 将尾指针指向新节点
    }

    return head;
}

销毁单链表

销毁单链表的基本思路是从头节点开始,依次释放每个节点的内存。具体步骤如下:

  1. 依次遍历节点,释放每个节点的内存;
  2. 将头节点的指针设为NULL,避免野指针。

下面是示例代码:

void destoryList(Node *head) {
    Node *p = head;

    while (p != NULL) {
        Node *q = p->next;
        free(p);
        p = q;
    }

    head = NULL;
}

增加节点

增加节点的基本思路是先找到所要插入的位置,然后将新节点插入到该位置。具体步骤如下:

  1. 找到插入位置的前一个节点;
  2. 创建新节点,并将其next指针指向插入位置的后一个节点;
  3. 将插入位置的前一个节点的next指针指向新节点。

下面是示例代码(在第k个节点后插入新节点):

void insertNode(Node *head, int k, int data) {
    Node *p = head;
    int i = 0;

    while (p != NULL && i < k) {
        p = p->next;
        i++;
    }

    if (p == NULL) { // 如果k大于链表长度,直接返回
        return;
    }

    Node *node = (Node*) malloc(sizeof(Node));
    node->data = data;
    node->next = p->next;
    p->next = node;
}

删除节点

删除节点的基本思路是先找到要删除的节点,然后将其前一个节点的next指针指向要删除节点的后一个节点,最后释放要删除节点的内存。具体步骤如下:

  1. 找到要删除节点的前一个节点;
  2. 将其next指针指向要删除节点的后一个节点;
  3. 释放要删除节点的内存。

下面是示例代码(删除第k个节点):

void deleteNode(Node *head, int k) {
    Node *p = head;
    int i = 0;

    while (p != NULL && i < k - 1) {
        p = p->next;
        i++;
    }

    if (p == NULL || p->next == NULL) { // 如果k大于链表长度,直接返回
        return;
    }

    Node *q = p->next;
    p->next = q->next;
    free(q);
}

查找节点

查找节点的基本思路是从头节点开始遍历链表,依次比较每个节点的数据域,直到找到所要查找的节点或遍历完整个链表。具体步骤如下:

  1. 从头节点开始遍历链表,依次比较每个节点的数据域;
  2. 如果找到所要查找的节点,返回该节点的指针;
  3. 如果遍历完整个链表,仍未找到所要查找的节点,返回NULL。

下面是示例代码(查找链表中第一个数据为x的节点):

Node* findNode(Node *head, int x) {
    Node *p = head->next;

    while (p != NULL) {
        if (p->data == x) {
            return p;
        }
        p = p->next;
    }

    return NULL;
}

更改节点

更改节点的基本思路是先找到所要更改的节点,然后修改其数据域。具体步骤如下:

  1. 找到要更改的节点;
  2. 修改其数据域。

下面是示例代码(将链表中第k个节点的数据域改为x):

void changeNode(Node *head, int k, int x) {
    Node *p = head->next;
    int i = 1;

    while (p != NULL && i < k) {
        p = p->next;
        i++;
    }

    if (p == NULL) { // 如果k大于链表长度,直接返回
        return;
    }

    p->data = x;
}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言中单链表的基本操作(创建、销毁、增删查改等) - Python技术站

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

相关文章

  • libevent源码深度剖析七

    libevent源码深度剖析七 在本篇文章中,我们将继续深入分析libevent源码,重点探讨libevent中的事件机制。 事件机制 libevent中的事件机制使用了事件循环(event loop)和事件处理器(event handler),来帮助程序处理输入和输出(I/O),以及其他事件。当输入事件被触发,例如一个客户端连接到服务器,就会调用相应的事件…

    其他 2023年3月29日
    00
  • sql获取当前时间(日期)

    获取当前时间(日期)在SQL中是常见的需求,在不同的数据库管理系统中实现方法略有不同,但是基本思路相同。下面我将针对常见的SQL数据库管理系统,比如MySQL、Oracle、SQL Server等,给出获取当前时间(日期)的完整攻略。 MySQL MySQL中有NOW()函数可以直接获取当前的日期和时间,该函数返回一个DATETIME格式的值,即年-月-日 …

    其他 2023年4月16日
    00
  • app的token机制

    以下是”App的Token机制”的完整攻略,包括步骤、示例和注意事项: App的Token机制攻略 App的Token机制是一种常见身份验证制,用于保护App的安全性。以下是详细的攻略: 步骤 以下是使用App的Token机制的步骤: 生成Token。 在使用App的Token机制时,需要首先生成Token。Token是一种随机生成的字符串,用于标识用户的身…

    other 2023年5月7日
    00
  • ps2018怎么设计loading加载图标?

    针对“ps2018怎么设计loading加载图标?”的问题,以下是详细的攻略。 设计步骤 打开Photoshop软件,创建一个新文档。 在新文档上绘制出loading图标的基本形状,比如可以画一个圆形或者矩形。 在图层面板上,选择图标的图层,在右键菜单中点击“蒙版”,选择“画布蒙版”即可。 打开渐变工具,将渐变从上到下,从白色逐渐变暗直至深灰,这样就完成了l…

    other 2023年6月25日
    00
  • SpringBoot 如何从配置文件读取值到对象中

    SpringBoot 通过@ConfigurationProperties注解可以方便的将属性值注入到对象中,从而实现从配置文件读取值到对象中的功能。 以下是实现完整攻略: 在pom.xml文件中添加依赖: xml <dependency> <groupId>org.springframework.boot</groupId&g…

    other 2023年6月25日
    00
  • 未来简史之数据主义(dataism)

    未来简史之数据主义(dataism) 近年来,随着人类社会的不断发展,数据的产生和应用成为了一种不可忽视的趋势。数据主义(Dataism)因此应运而生,成为了越来越多人关注的热点话题。本文将通过对数据主义背景、概念、特点、应用等方面的分析,以期能够更加深入地了解数据主义的意义和重要性。 数据主义的背景 数据主义是由耶鲁大学的文学家戴维·高夫(David Ge…

    其他 2023年3月28日
    00
  • golang 在windows中设置环境变量的操作

    通过以下步骤,在 Windows 系统中设置 Go 语言开发环境变量: 1. 下载安装包并安装 前往 Go 官方网站(https://golang.org/dl/) 下载适合 Windows 系统的安装包,运行安装包并按照提示进行安装。默认安装路径为 “C:\Go”。 2. 配置环境变量 (1) 新建环境变量 在开始菜单中搜索”系统变量”,并打开”编辑系统环…

    other 2023年6月27日
    00
  • 为markdown文件生成目录

    为markdown文件生成目录 Markdown 是一种轻量级的文本标记语言,它能够使用简单易懂的语法快速生成格式丰富的文档。但是,当我们的 Markdown 文件变得越来越长时,阅读起来可能会变得困难。这时,生成一个目录就变得非常有用了。 方法一:手动生成目录 手动生成目录需要用到Markdown的链接和标题两个特性。 下面是一个示例: # 这是一级标题 …

    其他 2023年3月28日
    00
合作推广
合作推广
分享本页
返回顶部