C语言深入探索之单链表与typedef的用法

yizhihongxing

C语言深入探索之单链表与typedef的用法

介绍

在数据结构中,链表是一种非常基础且重要的数据结构。C语言中使用指针和结构体可以非常方便的实现链表的基本操作。此外,typedef是C语言中类型定义的关键字,可以为已有的数据类型重新定义名称,增加代码的可读性。

本篇文章将着重讲解使用C语言实现单链表的基本操作,并结合typedef给链表节点和链表本身定义更易于理解的名称。

单链表的基本操作

单链表是一种链式存储结构,它通过每个节点上的指针链接起来构成一个链表。在C语言中,用结构体表示链表节点,用指针实现链表节点的链接。

链表节点结构体

在C语言中,链表节点可以使用结构体来表示。链表节点通常包含两个元素,一个是值(value),另一个是指向下一个节点的指针(next)。

struct ListNode {
    int value;
    struct ListNode *next;
};

链表的基本操作

链表的基本操作包括插入节点、删除节点和遍历链表。

插入节点

需要插入一个节点时,只需要将新节点的next指针指向当前节点的下一个节点,再将当前节点的next指针指向新节点即可。

void insertNode(struct ListNode *currentNode, struct ListNode *newNode) {
    newNode->next = currentNode->next;
    currentNode->next = newNode;
}

删除节点

删除节点时,只需要找到要删除的节点的前一个节点,将其next指针指向要删除节点的后一个节点即可。

void deleteNode(struct ListNode *currentNode) {
    struct ListNode *temp = currentNode->next;
    currentNode->next = currentNode->next->next;
    free(temp);
}

遍历链表

遍历链表时,只需要从头节点开始,依次访问每个节点的值即可。

void traverseList(struct ListNode *head) {
    struct ListNode *currentNode = head->next;
    while (currentNode != NULL) {
        printf("%d ", currentNode->value);
        currentNode = currentNode->next;
    }
}

示例说明

以下示例演示了如何使用链表实现逆序输出一个整数数组。

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

struct ListNode {
    int value;
    struct ListNode *next;
};

void insertNode(struct ListNode *currentNode, struct ListNode *newNode) {
    newNode->next = currentNode->next;
    currentNode->next = newNode;
}

void deleteNode(struct ListNode *currentNode) {
    struct ListNode *temp = currentNode->next;
    currentNode->next = currentNode->next->next;
    free(temp);
}

void traverseList(struct ListNode *head) {
    struct ListNode *currentNode = head->next;
    while (currentNode != NULL) {
        printf("%d ", currentNode->value);
        currentNode = currentNode->next;
    }
}

int main() {
    int array[5] = {1, 2, 3, 4, 5};
    struct ListNode *head = (struct ListNode *) malloc(sizeof(struct ListNode));
    struct ListNode *currentNode = head;
    int i;
    for (i = 0; i < 5; i++) {
        struct ListNode *newNode = (struct ListNode *) malloc(sizeof(struct ListNode));
        newNode->value = array[i];
        insertNode(currentNode, newNode);
        currentNode = newNode;
    }
    traverseList(head);

    struct ListNode *p = head->next;
    head->next = NULL;
    while (p != NULL) {
        struct ListNode *temp = p;
        p = p->next;
        insertNode(head, temp);
    }
    traverseList(head);
}

输出结果为:

5 4 3 2 1 
1 2 3 4 5 

typedef的用法

typedef是C语言中类型定义的关键字,可以为已有的数据类型重新定义名称,增加代码的可读性。

为链表节点定义名称

在调用链表操作时,经常需要使用struct ListNode类型的变量。为了增加代码的可读性,我们可以使用typedef重新定义一个更加易于理解的名称list_node_t。

typedef struct ListNode list_node_t;

在定义链表节点的变量时,可以使用新定义的名称。

list_node_t *head = (list_node_t *) malloc(sizeof(list_node_t));

为链表本身定义名称

在调用链表操作时,也经常需要使用struct ListNode类型的指针变量。为了增加代码的可读性,我们可以使用typedef重新定义一个更加易于理解的名称list_t。

typedef struct ListNode *list_t;

在定义链表变量时,可以使用新定义的名称。

list_t head = (list_t) malloc (sizeof(struct ListNode));

示例说明

以下示例演示了如何使用typedef为链表节点和链表本身定义新名称。

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

typedef struct ListNode {
    int value;
    struct ListNode *next;
} list_node_t;

typedef struct ListNode *list_t;

void insertNode(list_t head, list_node_t *newNode) {
    newNode->next = head->next;
    head->next = newNode;
}

void deleteNode(list_t head, list_node_t *currentNode) {
    list_node_t *temp = currentNode->next;
    currentNode->next = currentNode->next->next;
    free(temp);
}

void traverseList(list_t head) {
    list_node_t *currentNode = head->next;
    while (currentNode != NULL) {
        printf("%d ", currentNode->value);
        currentNode = currentNode->next;
    }
}

int main() {
    int array[5] = {1, 2, 3, 4, 5};
    list_t head = (list_t) malloc(sizeof(list_node_t));
    list_node_t *currentNode = head;
    int i;
    for (i = 0; i < 5; i++) {
        list_node_t *newNode = (list_node_t *) malloc(sizeof(list_node_t));
        newNode->value = array[i];
        insertNode(head, newNode);
        currentNode = newNode;
    }
    traverseList(head);

    list_node_t *p = head->next;
    head->next = NULL;
    while (p != NULL) {
        list_node_t *temp = p;
        p = p->next;
        insertNode(head, temp);
    }
    traverseList(head);
}

输出结果与前面的示例相同。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言深入探索之单链表与typedef的用法 - Python技术站

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

相关文章

  • Java 数据结构进阶二叉树题集下

    Java 数据结构进阶二叉树题集下攻略 本文将分享 Java 数据结构进阶二叉树题集下的完整攻略,希望能对读者有所帮助。本文具体展示的是如何使用 Java 实现二叉树的相关算法。 1. 二叉树的创建 二叉树的创建有多种方式,本文以手工创建的方式为例。代码如下: class Node { Node left; Node right; int value; pu…

    other 2023年6月27日
    00
  • Android图片加载利器之Picasso基本用法

    Android图片加载利器之Picasso基本用法 什么是Picasso Picasso是一款Android端图片加载库,使用简单,能够自动处理图片缓存、下载等问题,同时支持图片压缩和裁剪,可大大提高应用程序的性能和用户体验。 如何使用Picasso 导入Picasso库 在项目的build.gradle文件中添加以下依赖: dependencies { i…

    other 2023年6月25日
    00
  • selinuxisdisabled怎么解决

    以下是“selinuxisdisabled怎么解决的完整攻略,过程中至少包含两条示例说明”。 selinuxisdisabled解决攻略 在Linux系统中,SELinux是一种安全增强功能,可以提高的安全性。但是,在某些情况下,我们可能需要禁用SELinux。如果在禁用SELinux后,执行sestatus命令显示SELinux status: disab…

    other 2023年5月10日
    00
  • vue监听scroll的坑的解决方法

    标题:Vue监听scroll的坑的解决方法 问题背景 在Vue的开发中,经常需要监听scroll事件以实现一些滚动相关的交互效果。但是,在使用Vue绑定scroll事件时,会出现一些坑。 问题描述 在Vue中通过v-on指令绑定scroll事件之后,发现绑定的函数并没有被触发,示例代码如下: <template> <div class=&q…

    other 2023年6月27日
    00
  • python获取指定目录下所有文件名列表的方法

    获取指定目录下所有文件名列表是Python中常见的问题。可以使用os模块中的方法完成这一任务。具体步骤如下: 导入os模块 首先需要导入os模块,使用方法是在脚本开头写上import os语句。 import os 指定目录 使用listdir()函数获取指定目录下的文件名列表,需要传入指定的目录路径。例如,获取当前目录下的所有文件名列表可以使用’.’表示当…

    other 2023年6月26日
    00
  • mysql 8.0.12 安装配置方法图文教程(windows10)

    下面是详细讲解 “mysql 8.0.12 安装配置方法图文教程(windows10)” 的完整攻略。 安装MySQL 下载MySQL 首先,我们需要下载MySQL的安装程序。可以在官网 https://dev.mysql.com/downloads/mysql/ 上下载最新的MySQL安装程序。如果你想下载MySQL 8.0.12版本,可以在 https:…

    other 2023年6月26日
    00
  • 小米miui 6内测包下载地址 miui v6内测版官方下载地址

    小米MIUI 6内测包下载攻略 小米MIUI 6是小米公司推出的一款基于Android操作系统的用户界面。内测版是在正式发布之前提供给用户测试和反馈的版本。本攻略将详细介绍小米MIUI 6内测包的下载地址和安装步骤。 步骤一:访问官方网站 首先,您需要访问小米官方网站以获取MIUI 6内测包的下载地址。您可以在小米官方网站的下载页面找到相关的链接。 示例说明…

    other 2023年8月5日
    00
  • Visual Studio 2010怎么使用自带的安装项目打包程序?

    Visual Studio 2010自带的安装项目打包程序主要用于把项目打包成可执行的安装程序,方便用户安装使用。下面详细讲解一下使用自带的安装项目打包程序的步骤: 打开Visual Studio 2010,点击菜单栏中的“文件”,选择“新建”,再选择“项目”。 在“新建项目”窗口中,选择“其他项目类型”,再选择“安装程序”,最后选择“安装项目”。 在“安装…

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