c语言链表基本操作(带有创建链表 删除 打印 插入)

yizhihongxing

C语言链表基本操作

概述

链表是一种常见的数据结构,它由若干个节点组成,并且每个节点都包含一个指向下一个节点的指针。链表可以动态地进行创建、删除、插入等操作。本文将介绍C语言链表的基本操作,包括创建链表、删除节点、打印链表以及插入节点。

创建链表

链表的创建通过在堆上动态分配空间来实现。下面是一个简单的节点结构体定义:

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

创建一个空链表

要创建一个空链表,可以将其头指针置为NULL。可以使用以下代码来创建一个空链表:

Node *head = NULL;

创建一个带有数据的链表

如果需要在创建链表时加入数据,可以使用以下代码:

Node *head = (Node *)malloc(sizeof(Node));  // 分配头节点的空间
head->data = 1;  // 为头节点赋值
head->next = NULL;  // 头节点的next指针置为NULL,表示链表结束

Node *last = head;  // 指向链表尾

for (int i = 2; i <= 5; i++) {
    Node *node = (Node *)malloc(sizeof(Node));  // 分配新的节点
    node->data = i;  // 为节点赋值
    node->next = NULL;  // 新节点的next指针置为NULL

    last->next = node;  // 让当前节点变为上一个节点的下一个节点
    last = node;  // 更新链表尾指针
}

例子

以下是一个完整的程序,演示了如何创建一个带有数据的链表:

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

typedef struct Node {
    int data;
    struct Node *next;
} Node;

int main() {
    Node *head = (Node *)malloc(sizeof(Node));
    head->data = 1;
    head->next = NULL;

    Node *last = head;

    for (int i = 2; i <= 5; i++) {
        Node *node = (Node *)malloc(sizeof(Node));
        node->data = i;
        node->next = NULL;

        last->next = node;
        last = node;
    }

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

    return 0;
}

该程序将输出:1 2 3 4 5

删除节点

删除链表节点的基本思路是:首先找到要删除节点的前一个节点,然后将前一个节点的next指针指向要删除节点的下一个节点。最后,释放被删除的节点的内存。

void delete_node(Node *head, int target) {
    Node *ptr = head;
    while (ptr->next != NULL) {
        if (ptr->next->data == target) {  // 找到了要删除的节点
            Node *tmp = ptr->next;
            ptr->next = tmp->next;  // 将前一个节点的next指针指向下一个节点
            free(tmp);  // 释放被删除节点的内存
            return;
        }
        ptr = ptr->next;
    }
}

例子

以下是一个完整的程序,演示了如何删除链表节点:

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

typedef struct Node {
    int data;
    struct Node *next;
} Node;

void delete_node(Node *head, int target) {
    Node *ptr = head;
    while (ptr->next != NULL) {
        if (ptr->next->data == target) {
            Node *tmp = ptr->next;
            ptr->next = tmp->next;
            free(tmp);
            return;
        }
        ptr = ptr->next;
    }
}

int main() {
    Node *head = (Node *)malloc(sizeof(Node));
    head->data = 1;
    head->next = NULL;

    Node *last = head;

    for (int i = 2; i <= 5; i++) {
        Node *node = (Node *)malloc(sizeof(Node));
        node->data = i;
        node->next = NULL;

        last->next = node;
        last = node;
    }

    delete_node(head, 3);  // 删除值为3的节点

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

    return 0;
}

该程序将输出:1 2 4 5

打印链表

要打印链表,只需要从头节点开始,遍历整个链表,并输出每个节点的值。

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

例子

以下是一个完整的程序,演示了如何打印链表:

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

typedef struct Node {
    int data;
    struct Node *next;
} Node;

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

int main() {
    Node *head = (Node *)malloc(sizeof(Node));
    head->data = 1;
    head->next = NULL;

    Node *last = head;

    for (int i = 2; i <= 5; i++) {
        Node *node = (Node *)malloc(sizeof(Node));
        node->data = i;
        node->next = NULL;

        last->next = node;
        last = node;
    }

    print_list(head);

    return 0;
}

该程序将输出:1 2 3 4 5

插入节点

要在链表中插入一个节点,需要先找到要插入节点的前一个节点,然后将前一个节点的next指针指向要插入节点,再将要插入节点的next指针指向下一个节点。

void insert_node(Node *head, int target, int value) {
    Node *ptr = head;
    while (ptr != NULL) {
        if (ptr->data == target) {  // 找到要插入的位置
            Node *node = (Node *)malloc(sizeof(Node));  // 创建新节点
            node->data = value;
            node->next = ptr->next;  // 插入节点
            ptr->next = node;
            return;
        }
        ptr = ptr->next;
    }
}

例子

以下是一个完整的程序,演示了如何插入一个节点:

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

typedef struct Node {
    int data;
    struct Node *next;
} Node;

void insert_node(Node *head, int target, int value) {
    Node *ptr = head;
    while (ptr != NULL) {
        if (ptr->data == target) {
            Node *node = (Node *)malloc(sizeof(Node));
            node->data = value;
            node->next = ptr->next;
            ptr->next = node;
            return;
        }
        ptr = ptr->next;
    }
}

int main() {
    Node *head = (Node *)malloc(sizeof(Node));
    head->data = 1;
    head->next = NULL;

    Node *last = head;

    for (int i = 2; i <= 5; i++) {
        Node *node = (Node *)malloc(sizeof(Node));
        node->data = i;
        node->next = NULL;

        last->next = node;
        last = node;
    }

    insert_node(head, 3, 10);  // 在值为3的节点后插入值为10的节点

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

    return 0;
}

该程序将输出:1 2 3 10 4 5

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c语言链表基本操作(带有创建链表 删除 打印 插入) - Python技术站

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

相关文章

  • oracle中类似indexof用法_instr函数

    Oracle中类似indexOf用法——instr函数 在Oracle中,如果需要查找一个字符串在另一个字符串中出现的位置,可以使用instr函数。instr函数需要传入两个参数,第一个参数为需要查找的字符串,第二个参数为被搜索的字符串。该函数会返回被搜索字符串中匹配到的第一个子串的位置,若匹配不成功则返回0。 语法格式 INSTR(string, subs…

    其他 2023年3月28日
    00
  • Spring超详细讲解创建BeanDefinition流程

    Spring超详细讲解创建BeanDefinition流程 在Spring框架中,BeanDefinition是用于描述和定义一个Bean的元数据信息的对象。它包含了Bean的类名、作用域、依赖关系等信息。本攻略将详细讲解Spring创建BeanDefinition的流程。 1. 创建BeanDefinition对象 首先,我们需要创建一个BeanDefin…

    other 2023年10月15日
    00
  • 如何利用ES6进行Promise封装总结

    下面我将为您详细讲解如何利用ES6进行Promise封装总结。 Promise介绍 Promise是ES6新增的语法,可以帮助我们更好的处理异步操作中的回调问题,应用非常广泛。 Promise语法 Promise一共有三种状态: Pending(进行中):初始状态,不是成功或失败状态。 Fulfilled(已成功):表示操作成功完成。 Rejected(已失…

    other 2023年6月25日
    00
  • 详解MySQL双活同步复制四种解决方案

    详解MySQL双活同步复制四种解决方案 背景 随着业务的发展和用户量的增加,MySQL数据库的高可用性和性能的要求也越来越高。其中MySQL双活同步复制作为一种常见的数据库高可用解决方案,因其可以提供双向同步复制的功能被广泛应用。但是,MySQL双活同步复制的实现过程复杂,需要考虑到许多方面的问题。本文主要介绍MySQL双活同步复制的四种解决方案,并结合实例…

    other 2023年6月26日
    00
  • 用vue3封装一个符合思维且简单实用的弹出层

    下面我将详细讲解用vue3封装一个符合思维且简单实用的弹出层的完整攻略。 1. 弹出层的需求分析 在封装弹出层之前,我们需要对需求进行分析,明确所需功能、交互,进而确定实现方式和技术选型。 弹出层的主要需求包括:弹出层中展示数据、支持输入、支持自定义样式、支持关闭、支持拖拽等。 在交互方面,我们需要考虑以下几个问题: 如何打开/关闭弹出层? 如何传递数据给弹…

    other 2023年6月25日
    00
  • 从数据类型 varchar 转换为 numeric 时出错.

    从数据类型 varchar 转换为 numeric 时出错 在使用 SQL 语句查询数据时,我们经常需要进行数据类型转换。其中一种常见的转换是将文本类型(varchar)转换为数字类型(numeric)。然而,即使两种类型的数据在外观上看起来相似,进行类型转换时仍可能会出现错误。 错误信息 当我们尝试将一个 varchar 类型的字符串转换为 numeric…

    其他 2023年3月28日
    00
  • Nginx 禁止直接访问目录或文件的操作方法

    Nginx 禁止直接访问目录或文件的操作方法 在 Nginx 中,可以通过配置来禁止直接访问目录或文件,以增加服务器的安全性。下面是详细的攻略: 步骤 1:编辑 Nginx 配置文件 首先,打开 Nginx 的配置文件,通常位于 /etc/nginx/nginx.conf 或 /etc/nginx/conf.d/default.conf。使用文本编辑器打开该…

    other 2023年8月6日
    00
  • Android用动画显示或隐藏视图

    当在Android应用程序中需要显示或隐藏视图时,可以使用动画来实现平滑的过渡效果。下面是一个完整的攻略,包含了使用动画显示或隐藏视图的步骤和两个示例说明。 步骤1:准备工作 在开始之前,确保你已经设置好了Android开发环境,并且已经创建了一个Android项目。 步骤2:导入动画资源 首先,你需要在res目录下的res/anim文件夹中创建一个XML文…

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