C++实现静态链表

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的值。

阅读剩余 75%

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

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

相关文章

  • MySQL不同表之前的字段复制

    复制MySQL表之间的字段是一项非常重要的操作,因为它可以帮助我们更轻松地创建表结构和重复使用现有的表结构。以下是MySQL不同表之间的字段复制的完整攻略及其示例说明。 步骤1:使用SHOW CREATE TABLE获取表的结构 使用SHOW CREATE TABLE命令获取要复制字段的源表结构。此命令返回一个 SQL 语句,其中包含源表的完整定义。例如,以…

    other 2023年6月25日
    00
  • 404notfound错误页面的解决方法和注意事项

    404notfound错误页面的解决方法和注意事项 当您的网站访问者输入了错误的URL或者某个页面被删除时,他们可能会看到一个“404notfound”错误页面。这会给用户带来一种没找到所需要的页面的印象,因此在设计网站时保证404错误页面的漂亮度和实用性非常重要。 本文将提供一些如何解决或避免404错误页面出现的方法: 1. 定制404错误页面 一个好的4…

    其他 2023年3月28日
    00
  • C++中COM组件初始化方法实例分析

    C++中COM组件初始化方法实例分析 什么是COM组件 COM(Component Object Model)是一种基于Windows操作系统的二进制接口标准,用于组件化应用程序的开发和集成。COM组件是可以独立被调用和管理的二进制对象模块,因为它们可以被跨语言、跨平台地使用。 COM组件初始化方法 COM组件的初始化方法有两种:基于CoCreateInst…

    other 2023年6月20日
    00
  • AJAX中文乱码PHP中完美解决方法

    解决AJAX中文乱码的问题 在使用AJAX进行中文字符传输时,可能会遇到中文字符乱码的问题。本文将介绍使用PHP解决AJAX中文乱码问题的方法。 1. AJAX中文乱码问题分析 AJAX是一种异步数据传输的技术,其本质是通过XMLHttpRequest对象来在浏览器和服务器之间交换数据。在AJAX中,如果传输的数据中包含中文字符,则有可能出现乱码的情况。 造…

    other 2023年6月27日
    00
  • 64位下无法运行32位程序的解决方法 提示未指定提供程序,也没有指派的默认提供程序

    64位下无法运行32位程序的解决方法 在64位操作系统下,有时候会遇到无法运行32位程序的问题。这通常是因为缺少32位程序所需的运行环境或者配置不正确。下面是解决这个问题的完整攻略。 步骤一:安装32位运行环境 首先,你需要安装32位运行环境,以便能够在64位操作系统上运行32位程序。具体的步骤如下: 打开控制面板,点击\”程序\”或\”程序和功能\”。 在…

    other 2023年7月28日
    00
  • WPS for Linux(ubuntu)字体配置(字体缺失解决办法)

    WPS for Linux(ubuntu)字体配置(字体缺失解决办法) WPS是一款在Linux操作系统上的办公软件,其功能强大,广受欢迎。然而,由于版权等原因,WPS for Linux(ubuntu)在安装后常常出现字体缺失的问题。本文将为大家介绍在Linux(ubuntu)操作系统下配置WPS字体并解决字体缺失问题的具体办法。 确认字体缺失 在正式配置…

    其他 2023年3月28日
    00
  • 服务器购买和初步搭建的方法

    服务器购买和初步搭建的方法是一个比较复杂的过程,下面我来给您详细讲解一下。 服务器购买 1. 选择合适的服务器供应商 目前市面上拥有很多可以提供服务器购买服务的供应商,如阿里云、腾讯云、华为云等等,您需要根据自己的需要和预算选择合适的供应商。 2. 确定服务器配置 在选择服务器供应商之后,就需要确定服务器的配置,通常包括 CPU、内存、硬盘等方面的配置。不同…

    other 2023年6月27日
    00
  • Python抽象类应用详情

    下面是Python抽象类应用详情的完整攻略。 什么是Python抽象类 抽象类是一种特殊的类,它不能被实例化,只能被继承。抽象类中定义了一些方法,并且规定了它们的接口,但并没有对这些方法进行具体的实现,而是由子类去实现。抽象类可以理解为一种约束,它规定了子类必须实现哪些方法,从而确保子类在使用的时候拥有一定的一致性和可靠性。 在Python中,可以通过abc…

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