当前位置: 首页 > news >正文

C语言指针链表

C语言指针链表是一种非常常见的数据结构,它可以用于在程序中存储和操作一系列相关数据,包括但不限于整数、字符串、结构体等类型。下面我们将介绍如何使用C语言指针链表,并提供一个可以执行的示例代码。

1. 定义链表结构体

链表是由若干个节点组成的,每个节点包含了一个数据元素和一个指向下一个节点的指针。因此,我们需要先定义一个链表节点结构体:

```c

struct node {
    int data; // 数据
    struct node* next; // 指向下一个节点的指针
};


```

2. 创建链表

创建链表的过程可以通过创建一个头节点来实现。头节点不存储任何数据,只是用于维护整个链表的结构。我们可以定义一个指向头节点的指针:

```c
struct node* head = NULL;
```

3. 插入节点

向链表中插入节点可以通过以下步骤完成:

- 创建一个新节点;
- 将新节点的指针指向下一个

节点;
- 将上一个节点的指针指向新节点。

具体代码如下:```c

void insertNode(int data) {
    struct node* newNode = (struct node*) malloc(sizeof(struct node)); // 创建新节点
    newNode->data = data; // 设置新节点的数据
    newNode->next = NULL; // 将新节点的指针指向NULL

    if (head == NULL) { // 如果链表为空,则将头节点指向新节点
        head = newNode;
    }
    else { // 否则在链表末尾插入新节点
        struct node* current = head;
        while (current->next != NULL) {
            current = current->next;
        }
        current->next = newNode;
    }
}


```

4. 删除节点

从链表中删除节点可以通过以下步骤完成:

- 找到要删除的节点;
- 将上一个节点的指针指向下一个节点;
- 释放要删除的节点的内存空间。

具体代码如下:```c

void deleteNode(int data) {
    struct node* current = head;
    struct node* previous = NULL;

    while (current != NULL) { // 遍历整个链表
        if (current->data == data) { // 如果找到要删除的节点
            if (previous == NULL) { // 如果要删除的节点是头节点
                head = current->next;
            }
            else { // 否则将上一个节点的指针指向下一个节点
                previous->next = current->next;
            }
            free(current); // 释放要删除的节点的内存空间
            return;
        }
        previous = current;
        current = current->next;
    }
}


```

5. 遍历链表

遍历链表可以通过定义一个指向头节点的指针,并使用while循环来实现。具体代码如下:

```c

void printList() {
    struct node* current = head;
    while (current != NULL) {
        printf("%d ", current->data);
        current = current->next;
    }
    printf("\n");
}


```

6. 完整代码

最终的完整代码如下:```c

```

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

struct node {
    int data;
    struct node* next;
};

struct node* head = NULL;

void insertNode(int data) {
    struct node* newNode = (struct node*) malloc(sizeof(struct node));
    newNode->data = data;
    newNode->next = NULL;

    if (head == NULL) {
        head = newNode;
    }
    else

{
        struct node* current = head;
        while (current->next != NULL) {
            current = current->next;
        }
        current->next = newNode;
    }
}

void deleteNode(int data) {
    struct node* current = head;
    struct node* previous = NULL;

    while (current != NULL) {
        if (current->data == data) {
            if (previous == NULL) {
                head = current->next;
            }
            else {
                previous->next = current->next;
            }
            free(current);
            return;
        }
        previous = current;
        current = current->next;
    }
}

void printList() {
    struct node* current = head;
    while (current != NULL) {
        printf("%d ", current->data);
        current = current->next;
    }
    printf("\n");
}

int main() {
    insertNode(1);
    insertNode(2);
    insertNode(3);
    insertNode(4);

    printf("Initial list: ");
    printList();

    deleteNode(3);
    printf("After deleting node with data 3: ");
    printList();

    return 0;
}

输出结果为:

```
Initial list: 1 2 3 4 
After deleting node with data 3: 1 2 4 
```

非常好,你已经能够初步了解链表的基本操作了。接下来,你可以尝试用链表实现一些常见的算法,比如反转链表、合并两个有序链表等等,来进一步加深对链表的理解。    

有问题评论区见

相关文章:

  • 全网最完整,接口测试总结彻底打通接口自动化大门,看这篇就够了......
  • 【JVM虚拟机面试宝典】JVM的内存结构是怎么样的?在JVM中会发生内存溢出的区域有那些?— day06
  • C++ string类
  • 细数那些惊艳一时的 CSS 属性
  • 【C语言】你真的了解结构体吗
  • 可做题2(矩阵快速幂,乘法逆元,exgcd)
  • Mysql用户权限分配详解
  • 一文7个步骤从0到1教你搭建Selenium 自动化测试环境
  • 【网络安全工程师】从零基础到进阶,看这一篇就够了
  • 【C陷阱与缺陷】----语法陷阱
  • 解忧杂货铺(五续集):用了无法离开的网站资源
  • 功能测试转型测试开发年薪27W,又一名功能测试摆脱点点点,进了大厂
  • iOS 紧急通知
  • 艹,终于在8226上把灯点亮了
  • Linux上用Samba建立共享文件夹并通过Linux测试
  • [笔记] php常见简单功能及函数
  • Fastjson的基本使用方法大全
  • gops —— Go 程序诊断分析工具
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • Java 23种设计模式 之单例模式 7种实现方式
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • Java反射-动态类加载和重新加载
  • linux安装openssl、swoole等扩展的具体步骤
  • Linux后台研发超实用命令总结
  • Otto开发初探——微服务依赖管理新利器
  • 创建一种深思熟虑的文化
  • 机器学习 vs. 深度学习
  • 精彩代码 vue.js
  • 区块链将重新定义世界
  • 三分钟教你同步 Visual Studio Code 设置
  • 无服务器化是企业 IT 架构的未来吗?
  • 学习HTTP相关知识笔记
  • 用Python写一份独特的元宵节祝福
  • 原生Ajax
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • #laravel 通过手动安装依赖PHPExcel#
  • #QT项目实战(天气预报)
  • #stm32整理(一)flash读写
  • (NSDate) 时间 (time )比较
  • (第61天)多租户架构(CDB/PDB)
  • (附源码)ssm高校实验室 毕业设计 800008
  • (附源码)计算机毕业设计大学生兼职系统
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (一) storm的集群安装与配置
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • (转)Oracle 9i 数据库设计指引全集(1)
  • .[hudsonL@cock.li].mkp勒索加密数据库完美恢复---惜分飞
  • .form文件_SSM框架文件上传篇
  • .Net 应用中使用dot trace进行性能诊断
  • .NET:自动将请求参数绑定到ASPX、ASHX和MVC(菜鸟必看)
  • .net之微信企业号开发(一) 所使用的环境与工具以及准备工作
  • .project文件
  • /*在DataTable中更新、删除数据*/
  • @Autowired和@Resource装配