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;   // 移动游标
    }
}

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

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

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

相关文章

  • 【X86】—X86处理器大小端的数据存储验证

    【X86】—X86处理器大小端的数据存储验证 背景 在计算机领域中,数据存储是一项非常重要的工作,而计算机中对于数据存储采取的方式则可以分为两种,即大端存储和小端存储。其中,大端存储是指高位字节存储在低地址中,而小端存储则是指高位字节存储在高地址中。 而对于X86架构的处理器而言,它采用的是小端存储方式。这也就意味着,在X86处理器中,字节序是低位字节排…

    其他 2023年3月28日
    00
  • 大势至软件政府机关网络安全管理、上网行为管理解决方案,全面保护政府机关网络安全

    大势至软件政府机关网络安全管理、上网行为管理解决方案 简介 大势至软件是一套专业的政府机关网络安全管理、上网行为管理解决方案,适用于政府机关、事业单位等公共管理机构。通过大势至软件,政府机关可以全面保护网络安全,规范上网行为,实现网络信息安全管理。下面将详细讲解大势至软件的完整攻略。 步骤 步骤一:安装大势至软件 政府机关首先需要根据实际需求,购买大势至软件…

    other 2023年6月26日
    00
  • Python Selenium 之数据驱动测试的实现

    当然,下面是关于Python Selenium数据驱动测试的实现的完整攻略,包含两个示例说明: 数据驱动测试的实现步骤 导入所需的库和模块: import unittest from selenium import webdriver from ddt import ddt, data, unpack 创建测试类并使用@ddt装饰器标记: @ddt clas…

    other 2023年10月17日
    00
  • Python中Enum使用的几点注意事项

    下文会为您详细讲解Python中Enum使用的几点注意事项。 Enum定义 首先,我们应该明确Enum的定义。Enum是一个枚举类,它将一组常量定义为一个特定类型的有限集合。在Python中,可以使用标准库中的枚举类Enum来定义一个枚举类。一般的Enum定义方式如下: from enum import Enum class Color(Enum): RED…

    other 2023年6月26日
    00
  • 通过Maven进行jedis连接redis的实现

    以下是使用Maven连接Redis的实现步骤的完整攻略: 在Maven项目的pom.xml文件中添加Redis依赖: <dependencies> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifact…

    other 2023年10月14日
    00
  • Android Webview添加网页加载进度条实例详解

    针对“Android Webview添加网页加载进度条实例详解”,我们可以从以下几个方面进行讲解。 一、添加进度条布局 首先需要为Webview添加一个进度条布局,代码如下: <LinearLayout android:id="@+id/ll_webview_wrapper" android:layout_width="m…

    other 2023年6月25日
    00
  • 多线程CSerialPort类的多串口通信实现

    多线程CSerialPort类的多串口通信实现 介绍 本文将介绍如何使用CSerialPort类实现多串口通信,并使用多线程提高程序性能。 CSerialPort类 CSerialPort类是一个实现了Windows串口通信的类。它封装了Windows的一些API,使得串口通信变得更加容易。以下是CSerialPort类的一些方法和属性: Open: 打开串…

    其他 2023年3月28日
    00
  • Java Swing组件下拉菜单控件JComboBox用法示例

    Java Swing组件下拉菜单控件JComboBox用法示例 JComboBox 用于创建下拉列表框,提供了在多个选项中选择一个选项的功能。使用 JComboBox,你可以轻松地构建用户界面,这些界面中包含可选的文本信息,如性别、年龄、城市等。 创建 JComboBox 要创建一个JComboBox,需要将对象的构造函数放入 JPanel 中: JPane…

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