C++实现静态链表

yizhihongxing

C++实现静态链表

什么是静态链表

静态链表是使用数组实现的链表结构,也可以叫做顺序链表。使用静态链表可以避免频繁在内存中进行动态分配和释放,提高程序的运行效率。

静态链表的主要特点:

  • 需要预分配一定数量的内存空间作为链表节点存储空间,因此具有固定的空间大小
  • 通过数组下标和指针进行节点之间的链接
  • 静态链表节点中需要额外存储指向下一个节点的指针

静态链表基本实现思路

在C++中,可以使用结构体来定义静态链表的节点,然后使用数组存储节点。定义一个静态链表时,需要预先定义好链表的长度和节点结构体。

例如:

struct Node {
    int data;
    int next;
};

const int MAX_SIZE = 1000; // 链表可以存储的最大节点数量

int head, cnt;
Node list[MAX_SIZE]; // 静态链表所使用的数组

上述代码表示了一个最多可以存储1000个节点的静态链表,并使用Node结构体来定义节点,其中data是数据域,表示节点存储的数据,next是链域,存储指向下一个节点的指针。

同时定义head为头指针,cnt为当前链表中已存储的节点数量。

接下来,需要编写相应的操作方法来实现静态链表的基本功能,包括插入节点、删除节点、输出链表等操作。

静态链表操作方法实现

插入节点

在静态链表中插入一个节点,需要将新的节点插入到链表的适当位置,同时修改相应的指针连接。插入节点的方法可以定义为:

void insert(int pos, int data) {
    if(cnt == MAX_SIZE) { // 静态链表已满
        return;
    }

    int cur = head;
    for(int i = 0; i < pos - 1; i++) {
        cur = list[cur].next; // 找到插入位置的前一个节点
    }

    int tmp = list[cur].next;
    list[cur].next = cnt; // 修改前一个节点的指向
    list[cnt].data = data;
    list[cnt].next = tmp; // 新节点指向原插入位置的后一个节点
    cnt++; // 链表长度加一
}

上述代码中,首先判断链表是否已满,如果已满则不执行插入节点操作。然后查找插入节点的前一个节点,然后修改前一个节点和当前节点的指向即可。新节点的下标即为当前链表长度cnt。

删除节点

在静态链表中删除一个节点,需要找到要删除节点的前一个节点,然后修改相应的指针连接。删除节点的方法可以定义为:

void erase(int pos) {
    if(pos <= 0 || pos > cnt) { // pos非法
        return;
    }

    int cur = head;
    for(int i = 1; i < pos; i++) {
        cur = list[cur].next; // 找到要删除节点的前一个节点
    }

    int tmp = list[cur].next;
    list[cur].next = list[tmp].next; // 修改前一个节点的指向
    cnt--; // 链表长度减一
}

上述代码中,首先判断pos是否合法,然后查找要删除的节点的前一个节点,修改前一个节点和要删除节点的指向即可。

输出链表

输出静态链表的方法可以定义为:

void print() {
    int cur = list[head].next;
    while(cur != 0) {
        cout << list[cur].data << " ";
        cur = list[cur].next;
    }
    cout << endl;
}

上述代码中,从head指针指向的第一个节点开始遍历,依次输出每一个节点的数据。

示例操作

下面我们来使用insert和erase方法分别在链表的头部和尾部插入和删除一个节点,并输出链表。

#include <iostream>
using namespace std;

struct Node {
    int data;
    int next;
};

const int MAX_SIZE = 1000;
int head, cnt;
Node list[MAX_SIZE];

void insert(int pos, int data);
void erase(int pos);
void print();

int main() {
    head = 0;
    cnt = 1;
    list[0].next = 0; // 头结点的下一个节点指向0,表示链表为空

    insert(1, 1); // 在头部插入一个节点,值为1
    insert(2, 2); // 在尾部插入一个节点,值为2
    print();

    erase(1); // 删除链表头部的节点
    erase(cnt); // 删除链表尾部的节点
    print();

    return 0;
}

void print() {
    int cur = list[head].next;
    while(cur != 0) {
        cout << list[cur].data << " ";
        cur = list[cur].next;
    }
    cout << endl;
}

void insert(int pos, int data) {
    if(cnt == MAX_SIZE) {
        return;
    }

    int cur = head;
    for(int i = 0; i < pos - 1; i++) {
        cur = list[cur].next;
    }

    int tmp = list[cur].next;
    list[cur].next = cnt;
    list[cnt].data = data;
    list[cnt].next = tmp;
    cnt++;
}

void erase(int pos) {
    if(pos <= 0 || pos > cnt) {
        return;
    }

    int cur = head;
    for(int i = 1; i < pos; i++) {
        cur = list[cur].next;
    }

    int tmp = list[cur].next;
    list[cur].next = list[tmp].next;
    cnt--;
}

运行上述程序,输出的结果为:

1 2 
2 

上述结果表示,在插入了节点1和节点2之后,链表中有两个节点,分别存储了1和2的值。删除对应节点后,链表中只剩一个节点,存储了2的值。

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

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

相关文章

  • FreeRTOS进阶之任务创建完全解析

    FreeRTOS进阶之任务创建完全解析 本文章将从以下几个方面对FreeRTOS中任务的创建进行完整解析: 任务创建的基本流程 常见任务创建函数参数的解释 示例1:创建一个简单的任务 示例2:创建多个任务 1. 任务创建的基本流程 FreeRTOS中任务创建的基本流程如下: 确定任务的名称、优先级和入口函数。 调用任务创建函数创建任务。 在任务入口函数中编写…

    other 2023年6月20日
    00
  • JS如何实现在弹出窗口中加载页面

    实现在弹出窗口中加载页面的过程主要分为两个步骤: 1.使用window.open()方法打开新的窗口 2.在新的窗口中加载要显示的页面 具体实现方式如下: 一、使用window.open()方法打开新的窗口 window.open()方法是JavaScript中打开新窗口的常用方式。具体使用方式如下: window.open(url, windowName,…

    other 2023年6月25日
    00
  • CentOS7上如何借助系统存储管理器管理LVM卷?

    在CentOS7上,LVM卷管理是非常重要的,而系统存储管理器可以帮助我们管理LVM卷。下面是CentOS7上如何借助系统存储管理器管理LVM卷的完整攻略: 1. 安装system-storage-manager 如果您的系统上尚未安装system-storage-manager,则需先通过以下命令进行安装: sudo yum install system-…

    other 2023年6月27日
    00
  • PostgreSQL数据库服务端监听设置及客户端连接方法教程

    下面是关于“PostgreSQL数据库服务端监听设置及客户端连接方法教程”的完整攻略: PostgreSQL数据库服务端监听设置及客户端连接方法教程 PostgreSQL是一种常用的关系型数据库,其服务端监听设置和客户端连接方法非常重要,在此提供一份详细的教程。 服务端监听设置 修改postgresql.conf文件 在PostgreSQL安装目录下找到po…

    other 2023年6月27日
    00
  • Java反射之静态加载和动态加载的简单实例

    下面是详细的攻略: Java反射之静态加载和动态加载的简单实例 什么是Java反射 Java反射是指在运行时动态获取一个类的信息,并动态调用它的方法、构造函数等的能力。Java反射机制提供了一种动态加载类和访问类的方式,能够增强程序的灵活性和扩展性。 反射的基本概念 Class类:Java反射机制的核心类,所有的类在载入时都会生成一个Class类的实例。 C…

    other 2023年6月25日
    00
  • SpringBoot集成Jasypt敏感信息加密的操作方法

    下面我将详细讲解“SpringBoot集成Jasypt敏感信息加密的操作方法”的完整攻略。这份攻略分为以下几个部分: Jasypt简介和使用场景 集成Jasypt加密到SpringBoot应用 添加加密注解和使用示例 修改配置文件中的敏感信息为加密的值 1. Jasypt简介和使用场景 Jasypt是一个用于加密和解密敏感数据的Java框架,其提供了各种加密…

    other 2023年6月26日
    00
  • spring(六)之自动装配

    Spring(六)之自动装配 在Spring的IOC容器中,我们可以使用自动装配(Autowiring)来消除手动配置的繁琐,提高开发效率。 自动装配的方式 Spring提供了以下几种自动装配的方式: byName:按属性名自动注入 byType:按属性类型自动注入 constructor:按构造函数参数类型自动注入 autodetect:混合使用byTyp…

    其他 2023年3月28日
    00
  • 64位操作系统与32位有什么区别?

    64位操作系统与32位操作系统的主要区别在于它们对内存的处理能力不同。一个32位平台的操作系统只能处理32位长的字,即一个最多为4GB的内存地址空间。但是64位操作系统可以处理64位长的字,这就使它可以处理更大的内存地址空间。 具体来说,64位操作系统的内核、系统函数和驱动程序都是64位的,它们可以利用CPU的64位模式,通过使用64位的指针来映射更大的内存…

    其他 2023年4月16日
    00
合作推广
合作推广
分享本页
返回顶部