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

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日

相关文章

  • 微软:Windows 10开发者工具将随新版本获得更新

    标题:微软宣布更新Windows 10开发者工具 微软最近宣布,Windows 10开发者工具将会在新版本中获得更新,这些更新将会在未来几个月内发布。这些更新将会提高开发者的效率,从而使其更容易开发高质量的Windows应用程序。 更新的内容 更新的内容包括以下几个方面: 改进并提高了Visual Studio和Visual Studio Code Visu…

    other 2023年6月26日
    00
  • IP地址正则表达式匹配方法

    IP地址正则表达式匹配方法攻略 IP地址正则表达式匹配方法是一种用于验证和提取IP地址的有效工具。在本攻略中,我们将详细介绍如何使用正则表达式来匹配IP地址,并提供两个示例说明。 正则表达式模式 IP地址由四个十进制数(0-255)组成,每个数之间用点号分隔。为了匹配IP地址,我们可以使用以下正则表达式模式: ^((25[0-5]|2[0-4][0-9]|[…

    other 2023年7月30日
    00
  • qmenu与qmenubar

    qmenu与qmenubar Qt是一个功能强大的跨平台应用程序开发框架。它提供了一系列的UI控件来简化应用程序的开发。其中包括QMenu和QMenuBar。 QMenu是一个用于在应用程序界面上创建弹出菜单的小部件。它可以包含各种动作项,例如操作、复选框、单选按钮以及分隔符等。QMenu很容易使用,可以通过QAction、QIcon和键盘快捷键创建动作项。…

    其他 2023年3月28日
    00
  • C字符串函数对应的C++ string操作详解

    C字符串函数对应的C++ string操作详解 本文将详细介绍C字符串函数和C++ string操作之间的对应关系和区别。 strlen和string::length() strlen strlen函数用于计算C风格字符串的长度,返回值是该字符串的字符数,不包括末尾的空字符’\0’。 示例: char str[] = "hello world&qu…

    other 2023年6月20日
    00
  • CentOS关于quota的总结与实践详解

    CentOS关于quota的总结与实践详解 什么是quota quota是一种磁盘空间配额限制机制,可以限制用户或组在使用磁盘空间时的上限。CentOS是一种常见的Linux操作系统,其内置了quota软件包,可以实现对用户或组的配额限制。 安装quota软件包 在CentOS中安装quota软件包十分简单,执行以下命令即可: yum install -y …

    other 2023年6月27日
    00
  • Android开发之activity的生命周期详解

    Android开发之activity的生命周期详解 在Android开发过程中,Activity是一个非常重要的组件,掌握Activity的生命周期,能够更好的开发高质量的Android应用程序。本文将深入介绍Activity的生命周期,包括常见的生命周期回调方法和示例。 Activity的生命周期 Activity的生命周期是指Activity从被创建到被…

    other 2023年6月27日
    00
  • intel的mkl是可以用来训练的—的实验也提到了训练

    Intel的MKL是可以用来训练的——的实验也提到了训练 在深度学习中,训练模型是一个非常耗费计算资源的过程。因此,针对不同的硬件和软件环境,选取一个高效的训练工具非常关键。而Intel Math Kernel Library (MKL)作为一个高效的数学库,在训练中也扮演着重要的角色。 实验也证实了这一点。在“ImageNet Large Scale Vi…

    其他 2023年3月28日
    00
  • radmin 远程控制软件使用图文教程(服务器端配置与控制台连接)

    下面是关于“radmin 远程控制软件使用图文教程(服务器端配置与控制台连接)”的详细攻略。整个过程涉及到两部分:服务器端配置和控制台连接。我们将分别进行介绍。 服务器端配置 首先,在服务器上下载并安装 RAdmin Server 软件。可以从软件官网进行下载,也可以在其他渠道获得相应版本。 安装完成后,打开 RAdmin Server,进行配置。配置中需要…

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