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

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日

相关文章

  • C语言操作符超详细讲解下篇

    C语言操作符超详细讲解下篇 一、逗号操作符 逗号操作符是C语言中最简单的一个操作符,它用于分隔表达式。当使用多个表达式时,逗号操作符可以用于把它们连接起来。当使用逗号操作符时,C语言会计算并忽略前面所有的表达式,只返回最后一个表达式的值。以下是一个逗号操作符的示例: int a = 1, b = 2, c = 3; int d = (a++, b++, c+…

    other 2023年6月27日
    00
  • 深入理解TCP协议与UDP协议的原理及区别

    当我们访问网站、发送电子邮件、进行文件下载等网络通信时,TCP协议和UDP协议是两种最常用的传输层协议。他们有着不同的优缺点和应用场景,以下是深入理解TCP协议与UDP协议的原理及区别的完整攻略: TCP协议 基本概念 TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的流量控制协议。其优点是可靠传输,缺点则是开…

    other 2023年6月27日
    00
  • 使用pip在离线环境安装python依赖库

    以下是使用pip在离线环境安装Python依赖库的完整攻略,包括准备工作、安装依赖库和两个示例。 准备工作 在离线环境中安装Python依赖库,需要先在联网环境中下载依赖库的安装包,并将其保存到本地。可以使用pip下载依赖库的安装包,命令如下: pip download <package-name> 其中,<package-name>…

    other 2023年5月7日
    00
  • 查看vue-cli脚手架的版本号和vue真实版本号及详细操作命令

    查看vue-cli脚手架的版本号和vue真实版本号及详细操作命令攻略 1. 查看vue-cli脚手架的版本号 要查看vue-cli脚手架的版本号,可以使用以下命令: vue –version 这将输出vue-cli的版本号,例如: @vue/cli 4.5.13 2. 查看vue真实版本号 要查看vue的真实版本号,可以在项目的根目录下找到package.…

    other 2023年8月3日
    00
  • dns-prefetch是什么 前端优化:DNS预解析提升页面速度

    DNS Prefetch是一种前端性能优化技术,通过预解析DNS来加快网页的加载速度。DNS Prefetch可以在浏览器解析完HTML文档后,根据预设的规则自动解析网站中经常被访问的资源的DNS地址,从而加速这些资源的请求和加载。 以下是dns-prefetch的完整攻略: 什么是DNS Prefetch DNS Prefetch是一项用于预解析DNS的技…

    other 2023年6月26日
    00
  • CSS 多浏览器兼容性问题及解决方案

    CSS 多浏览器兼容性问题及解决方案 在网页开发中,兼容不同浏览器的显示效果是一个必须要考虑的问题。由于不同的浏览器可能对CSS标准的解析、渲染方式不同,导致相同的CSS样式在不同浏览器中表现出现差异。以下是几种常见的兼容性问题和解决方案。 1. 盒模型问题 盒模型指的是浏览器如何计算一个元素的宽度和高度。IE盒模型和W3C盒模型的计算方式不同,在元素宽度和…

    other 2023年6月26日
    00
  • 解决DCEF3 在 BeforePopup 事件中打开新窗体的问题

    解决DCEF3 在 BeforePopup 事件中打开新窗体的问题 最近在使用 DCEF3 插件开发浏览器时,遇到了一个问题。在编写 BeforePopup 事件的处理代码时,想要打开一个新窗体,但发现并没有生效。经过一番调查和实验,终于找到了解决方案。 问题描述 在 DCEF3 中,BeforePopup 事件可以用于拦截新窗口的打开,并根据需要进行一些处…

    其他 2023年3月28日
    00
  • 利用原生JS实现懒加载lazyLoad的三种方法总结

    关于“利用原生JS实现懒加载lazyLoad的三种方法总结”,这是一个非常常见的需求,下面我详细讲解一下相关的攻略: 什么是懒加载 懒加载,也叫延迟加载,它指的是在图片或者其他资源需要显示时才进行加载,相应的,在一开始不需要显示时,可以通过预加载等方式来进行优化,从而提升页面性能,减少请求次数等。 实现懒加载几种常见的方式 1. IntersectionOb…

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