当前位置: 首页 > 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测试
  • 2017 年终总结 —— 在路上
  • 2017前端实习生面试总结
  • es6要点
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • js 实现textarea输入字数提示
  • Laravel核心解读--Facades
  • Linux CTF 逆向入门
  • MobX
  • node入门
  • pdf文件如何在线转换为jpg图片
  • Python连接Oracle
  • 从PHP迁移至Golang - 基础篇
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 利用jquery编写加法运算验证码
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • 原生 js 实现移动端 Touch 滑动反弹
  • 在electron中实现跨域请求,无需更改服务器端设置
  • 2017年360最后一道编程题
  • ​人工智能书单(数学基础篇)
  • $.ajax,axios,fetch三种ajax请求的区别
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (4)logging(日志模块)
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • ***测试-HTTP方法
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .net与java建立WebService再互相调用
  • /bin/bash^M: bad interpreter: No such file ordirectory
  • /etc/fstab和/etc/mtab的区别
  • ??javascript里的变量问题
  • @Query中countQuery的介绍
  • @RequestBody的使用
  • [Contiki系列论文之2]WSN的自适应通信架构
  • [Flex] PopUpButton系列 —— 控制弹出菜单的透明度、可用、可选择状态
  • [hive小技巧]同一份数据多种处理
  • [ios-必看] IOS调试技巧:当程序崩溃的时候怎么办 iphone IOS