C语言静态链表和动态链表

C语言中实现链表有两种方式,静态链表和动态链表。下面我们对这两种链表进行详细介绍。

静态链表

静态链表是指使用数组来模拟链表。因为在定义时,数组大小必须确定,所以静态链表的长度是固定的。静态链表需要手动维护指针,即每个元素除了存储自己的值外,还需要记录下一个元素的下标。静态链表使用起来比较繁琐,但是相对于动态链表,它更加节省空间,不需要频繁地进行内存动态分配。下面是一个静态链表的示例代码:

#define MAXSIZE 100
typedef struct {
    int data;
    int next;   // 存储下一个元素的下标
} Node;

Node staticList[MAXSIZE];

// 初始化静态链表,返回头结点的下标
int initStaticList() {
    for (int i = 0; i < MAXSIZE - 1; i++) {
        staticList[i].next = i + 1;
    }
    staticList[MAXSIZE - 1].next = -1;  // 表示链表的结尾
    return 0;   // 返回头结点
}

// 在静态链表的指定位置插入一个元素
void insertStaticList(int pos, int value) {
    int cursor = MAXSIZE - 1;   // 游标从头结点开始
    for (int i = 0; i < pos - 1; i++) {
        cursor = staticList[cursor].next;   // 移动游标
    }
    int new_node = staticList[cursor].next;   // 获取下一个元素的下标
    staticList[new_node].data = value;
    staticList[cursor].next = new_node;   // 修改当前元素的“下一个元素”
}

// 遍历静态链表
void traverseStaticList() {
    int cursor = staticList[0].next;   // 从头结点的下一个元素开始遍历
    while (cursor != -1) {
        printf("%d ", staticList[cursor].data);
        cursor = staticList[cursor].next;   // 移动游标
    }
}

动态链表

动态链表是指使用指针来实现链表,链表的长度不固定,可以根据需要动态分配内存。相对于静态链表,动态链表的使用起来更加方便灵活,但是需要注意内存泄漏问题。下面是一个动态链表的示例代码:

typedef struct Node {
    int data;
    struct Node *next;   // 指向下一个元素的指针
} Node, *LinkList;

// 初始化动态链表,返回头结点的指针
LinkList initLinkList() {
    Node *head = (Node*)malloc(sizeof(Node));   // 创建头结点
    head->next = NULL;
    return head;   // 返回头结点指针
}

// 在动态链表的指定位置插入一个元素
void insertLinkList(LinkList L, int pos, int value) {
    Node *cursor = L;
    for (int i = 0; i < pos - 1; i++) {
        if (cursor->next == NULL) {   // 判断是否到达链表的结尾
            printf("Error: Index out of range\n");
            return;
        }
        cursor = cursor->next;   // 移动游标
    }
    Node *new_node = (Node*)malloc(sizeof(Node));   // 创建新结点
    new_node->data = value;
    new_node->next = cursor->next;   // 修改新结点的“下一个元素”
    cursor->next = new_node;   // 修改当前结点的“下一个元素”
}

// 遍历动态链表
void traverseLinkList(LinkList L) {
    Node *cursor = L->next;   // 从头结点的下一个元素开始遍历
    while (cursor != NULL) {
        printf("%d ", cursor->data);
        cursor = cursor->next;   // 移动游标
    }
}

以上就是静态链表和动态链表的完整攻略,希望能对你有所帮助。

阅读剩余 47%

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言静态链表和动态链表 - Python技术站

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

相关文章

  • UltraEdit快捷键大全 UltraEdit常用快捷键大全

    UltraEdit快捷键大全 为什么要学习UltraEdit快捷键 UltraEdit是一款强大的文本编辑器,但它的复杂功能也让初学者们望而生畏。使用正确的快捷键可以增加编辑效率,提高工作效率,特别是在处理大量文本的情况下,慢慢的敲击鼠标和键盘是非常低效的。因此,学习常用的快捷键可以有效地减小工作量,提高效率。 UltraEdit快捷键大全 以下是一些最常用…

    other 2023年6月27日
    00
  • LINUX系统怎么使用命令清理磁盘空间?

    清理磁盘空间是Linux系统管理中一个非常重要的任务,特别是对于那些空间有限的嵌入式设备或云服务器来说。这里是使用命令清理磁盘空间的完整攻略: 一、查看磁盘空间情况 首先我们需要查看磁盘空间的占用情况,以便找到需要清理的目录和文件。 可以使用 df 命令来查看所有分区的空间使用情况: $ df -h Filesystem Size Used Avail Us…

    other 2023年6月27日
    00
  • MinGW-w64 C/C++编译器下载和安装的方法步骤(入门教程)

    MinGW-w64 C/C++编译器下载和安装的方法步骤(入门教程) MinGW-w64是可以在各种Windows操作系统上编译C和C++代码的工具集。本文将谈论下载和安装MinGW-w64 C/C++编译器的具体步骤。 步骤1:下载MinGW-w64安装文件 打开MinGW-w64的下载页面:https://sourceforge.net/projects…

    other 2023年6月26日
    00
  • 简单介绍python封装的基本知识

    当我们尝试设计一个类时,我们需要考虑到类的封装性。在Python中,类的封装性可以通过访问修饰符来强制体现。访问修饰符包括public、protected和private,用来约束类中的属性和方法的访问范围。 public属性和方法 在Python中,所有没有在属性和方法名前加上双下划线的属性和方法都是公有的,也就是说,它们可以在类的外部被访问。例如,我们定…

    other 2023年6月25日
    00
  • 对ubuntu操作系统进行彻底优化

    对Ubuntu操作系统进行彻底优化的完整攻略 Ubuntu是一种流行的Linux操作系统,可以通过一些优化来提高其性能和效率。以下是对Ubuntu操作系统进行彻底优化的完整攻略: 步骤1:更新软件包 首先,需要更新Ubuntu操作系统中的软件包。可以使用以下命令更新软件包: sudo apt-get update sudo apt-get upgrade 这…

    other 2023年5月9日
    00
  • ubuntu下安装和破解navicat的方法

    Ubuntu下安装和破解Navicat的方法 Navicat是一款综合性的数据库管理工具,适用于多种操作系统。本文将介绍如何在Ubuntu系统下安装和破解Navicat。 安装Navicat 下载Navicat安装包 首先访问Navicat官网下载适合你系统版本的Navicat安装包。 安装Navicat 下载完成后解压安装包并进入安装目录,终端输入以下命令…

    其他 2023年3月29日
    00
  • C++返回值是类名和返回值是引用的区别及说明

    C++中,函数返回值可以是类名,也可以是引用类型。它们有些区别,在此进行详细解释和说明。 返回值是类名 当函数返回值是类名时,会调用类的无参构造函数来初始化返回值,然后将其作为函数的返回值进行返回。这个过程浅显易懂,下面通过一个示例来说明。 // 返回值是类名的示例代码 #include <iostream> using namespace st…

    other 2023年6月27日
    00
  • react hooks闭包陷阱切入浅谈

    针对“react hooks闭包陷阱切入浅谈”的完整攻略,我将从以下几个方面进行讲解: React Hooks简介 什么是闭包陷阱 React Hooks闭包陷阱问题 如何避免React Hooks闭包陷阱问题 示例说明 1. React Hooks简介 React Hooks是React V16.8新增的一项功能,它能够让我们在函数组件中使用React s…

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