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日

相关文章

  • C语言数组超详细讲解下篇扫雷

    C语言数组超详细讲解下篇扫雷 一、背景 扫雷作为一个经典的小游戏,其实是使用C语言数组实现的。在本文中,我们将深入探讨如何使用数组来实现扫雷游戏。 二、数组的定义与初始化 在C语言中,数组是一种数据结构,可以容纳一定数量的相同类型的数据。 首先,我们需要定义和初始化一个二维数组来存储扫雷棋盘的信息,例如: #define ROWS 10 #define CO…

    other 2023年6月26日
    00
  • 魔兽世界7.2.5防骑怎么堆属性 wow7.25防骑配装属性优先级攻略

    魔兽世界7.2.5防骑怎么堆属性 魔兽世界7.2.5版本中,防骑配装属性优先级的问题备受玩家关注。以下是一些防骑装备属性的堆叠顺序和配装攻略。 属性优先级 韧性:一定要有足够的韧性,因为骑士可能会在锤你的时候使用破甲,而这个技能能够忽略护甲。所以拥有韧性属性能够减少你受到的伤害。 急速:急速属性可以增加你的攻击速度和施法速度,这样能够更快地释放技能。 精通:…

    other 2023年6月27日
    00
  • 打开网页时图片加载很慢怎么办?网页图片打开慢的解决方法

    打开网页时图片加载很慢怎么办?网页图片打开慢的解决方法 在打开网页时,如果网页图片加载很慢,会给用户带来不良的用户体验,这是我们需要考虑的一个问题。本文将详细讲解如何解决网页图片打开慢的问题,并给出示例说明。 1. 压缩图片大小 图片大小过大,会导致加载速度变慢。因此,可以采用压缩图片的方式来缩小图片大小,从而加快图片加载速度。 在网页中,png格式和jpg…

    other 2023年6月25日
    00
  • java8新特性之方法引用示例代码

    Java 8新特性之方法引用示例代码攻略 1. 方法引用简介 方法引用是Java 8引入的一种新特性,它允许我们使用已经存在的方法作为Lambda表达式的替代。方法引用提供了一种更加简洁、优雅的语法来调用方法,同时也增强了代码的可读性。 方法引用可以分为以下几种类型: 静态方法引用:引用静态方法。 实例方法引用:引用对象的实例方法。 构造方法引用:引用构造方…

    other 2023年6月28日
    00
  • C#实现DataList里面嵌套DataList的折叠菜单

    C#实现DataList里面嵌套DataList的折叠菜单攻略 1. 准备工作 在开始实现之前,确保你已经安装了适当的开发环境,比如Visual Studio,并且已经创建了一个C#项目。 2. 创建数据模型 首先,我们需要创建一个数据模型来表示菜单项。假设我们的菜单项有以下属性:Id、Name、ParentId和Children。Id是菜单项的唯一标识符,…

    other 2023年7月28日
    00
  • C++11中的default函数使用

    C++11中的default函数是一种特殊用途的函数,用于显式地声明一个构造函数或析构函数是使用编译器自动生成的。在C++11之前,如果想保留编译器自动生成的构造函数或析构函数,就必须手动将其定义为empty函数体,而C++11的default函数使得这个流程变得更加简单和方便。 1. default构造函数 在C++中,如果一个类没有定义构造函数,编译器会…

    other 2023年6月26日
    00
  • 腾讯对战平台自加载初始化失败怎么解决

    下面是解决腾讯对战平台自加载初始化失败的完整攻略: 问题描述 腾讯对战平台自加载初始化失败,出现以下报错信息: Failed to find model: prefabName 解决步骤 检查资源链接是否有效 这个错误信息一般是缺少资源导致的,需要检查资源链接是否有效。可以在网站的后台管理界面找到这个资源链接并尝试下载该资源,确认资源链接是否有效。 检查资源…

    other 2023年6月20日
    00
  • C语言数据存储详解

    C语言数据存储详解 1. 概述 C语言开发需要依赖各种数据类型。每种数据类型的存储方式和占用空间不同。在C语言中,数据可以分为基本数据类型和构造数据类型。对于基本数据类型,C语言定义了一些规则,规定了它们的内存大小和表示方式。对于构造数据类型,如结构体等,其内存大小和表示方式也有自己的规范。 2. 基本数据类型的存储 下表是基本数据类型在内存中的存储方式和占…

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