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

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

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

相关文章

  • jquery自定义属性(类型/属性值)

    介绍 jQuery是一款广泛使用的JavaScript库,它简化了HTML文档遍历、事件处理、动画效果和AJAX等操作。在jQuery中,可以为HTML元素添加自定义属性。自定义属性包含两个部分:属性类型和属性值。属性类型和属性值在编程时需要用到,它们有助于进行一些动态操作。 属性类型 在jQuery中,可以使用自定义属性类型为各种HTML元素添加额外的特性…

    other 2023年6月25日
    00
  • 苹果Mac OS系统终端命令大全介绍

    苹果Mac OS系统终端命令大全介绍 什么是终端 终端是操作系统的一个界面,用户可以使用命令行完成操作系统提供的各种功能。在苹果Mac OS系统中,我们可以通过“Terminal”应用程序打开终端界面。 终端命令大全介绍 常用命令 以下是一些常用的终端命令及其作用: cd:切换当前目录; ls:列出当前目录下的文件和子目录; mkdir:创建一个新目录; r…

    other 2023年6月26日
    00
  • Java实现读取文件夹下(包括子目录)所有文件的文件名

    要在Java中读取文件夹下所有文件的文件名,可以通过以下步骤来实现: 1. 获取文件夹下所有文件 可以使用 File 类中的 listFiles() 方法获取指定文件夹下的所有文件。该方法会返回一个 File 数组,其中包含指定文件夹下的所有文件和文件夹,但不包括子目录中的文件。 下面是一个示例代码: import java.io.File; public …

    other 2023年6月26日
    00
  • 自己动手怎么搭建私人服务器?搭建私人服务器的方法

    自己动手怎么搭建私人服务器?搭建私人服务器的方法 概述 搭建私人服务器意味着您有一个能够在互联网上访问的网站。该网站可以用于存储和分享文件、托管应用程序和网站以及提供能够在全球范围内访问的在线服务。在本文中,我们将介绍如何自己动手搭建私人服务器的方法。 步骤 1. 购买域名和主机 首先,您需要购买一个域名和服务器主机才能在互联网上托管自己的网站。域名是您网站…

    other 2023年6月27日
    00
  • 新闻媒体网站加速解决方案

    新闻媒体网站加速解决方案是为了提高网站的访问速度和用户体验而设计的,本攻略提供了多种有效的方案。 一、使用CDN加速CDN即内容分发网络,通过缓存网站内容到离用户较近的CDN节点,实现减轻源站压力、提升全球访问速度。大型新闻媒体网站如新浪新闻、腾讯新闻等都是通过CDN进行加速的。用户访问网站时,CDN会自动找到离用户最近的节点进行内容分发,缩短了响应时间和加…

    other 2023年6月26日
    00
  • ArcGIS地图打印那些事

    ArcGIS地图打印那些事的完整攻略 本文将为您提供ArcGIS地图打印的完整攻略,包括ArcGIS地图打印的基本概念、ArcGIS地图打印的步骤、ArcGIS地图打印的示例说明等内容。 ArcGIS地图打印的基本概念 ArcGIS地图打印是指将ArcGIS地图输出为打印格式的过程。在ArcGIS中,可以使用布局视图来创建地图布局,并将地图布局输出为打印格式…

    other 2023年5月6日
    00
  • Python面向对象之继承代码详解

    Python面向对象之继承代码详解 本文将详细讲解Python面向对象编程中的继承(inheritance)概念及其相关语法,包括继承的基本语法、继承的作用、多层继承、继承的构造函数、覆盖/重写父类方法等内容。 继承的基本语法 Python中的继承基于类(class)来实现,用关键字class声明类名和类属性,用def声明类的方法,其中在继承中需要使用到的关…

    other 2023年6月27日
    00
  • windows10redis部署

    Windows 10下Redis的部署 Redis是一个高性能的键值对数据库,常用于缓存、消息队列等场景。在Windows 10操作系统下,Redis的部署相对于其他操作系统可能需要更多的配置和调整。本文将介绍如何在Windows 10下部署Redis。 1. 安装Redis 首先,需要到Redis官网下载最新的Windows版本,下载地址为 https:/…

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