C语言静态链表的实现

在静态链表中,元素之间按照顺序存储在数组中,数组中的每个元素都包含两个部分:数据部分和游标部分。数据部分用于存储元素的值,游标部分用于指示下一个元素的索引位置。这种结构使得在插入和删除操作时,只需要修改游标,而不需要像链表那样移动整个元素。

对于静态链表的基本操作,包括插入、删除和查找等,具体实现逻辑如下:

  1. 插入操作:首先需要确定插入的位置,然后修改游标以反映新的元素顺序。如果插入的位置在数组的末尾,那么直接修改游标即可;如果插入的位置在数组的中间或开头,则需要按照一定的规则修改游标。
  2. 删除操作:首先需要确定删除元素的索引位置,然后修改游标以反映删除后的元素顺序。如果删除的是数组的最后一个元素,那么直接修改游标即可;如果删除的是数组的中间或开头元素,则需要按照一定的规则修改游标。
  3. 查找操作:在静态链表中查找元素,需要从头元素开始遍历数组,逐个比较元素的值,直到找到目标元素或遍历完整个数组。
#include <stdio.h>
#include <stdlib.h>#define MAX_SIZE 100typedef struct {int data;int next;
} StaticNode;typedef struct {StaticNode nodes[MAX_SIZE];int free[MAX_SIZE];int size;int freeSize;
} StaticList;// 初始化静态链表
void initList(StaticList* list) {list->size = 0;list->freeSize = MAX_SIZE;for (int i = 0; i < MAX_SIZE - 1; i++) {list->free[i] = i + 1;}list->free[MAX_SIZE - 1] = -1; // 最后一个元素的next设为-1,表示链表结束
}// 从空闲链表中获取一个节点
int mallocList(StaticList* list) {if (list->freeSize > 0) {int index = list->free[0];list->freeSize--;for (int i = 0; i < list->freeSize; i++) {list->free[i] = list->free[i + 1];}return index;}return -1; // 空闲链表为空,返回-1
}// 将节点归还给空闲链表
void freeList(StaticList* list, int index) {list->free[list->freeSize] = index;list->freeSize++;
}// 在静态链表末尾添加节点
void appendNode(StaticList* list, int data) {int index = mallocList(list);if (index != -1) {list->nodes[index].data = data;list->nodes[index].next = -1; // 新添加的节点next设为-1,表示链表结束if (list->size == 0) {list->nodes[0].next = index; // 如果是第一个节点,头节点指向它} else {int temp = 0; // 头节点是哑节点,不存数据while (list->nodes[temp].next != -1) {temp = list->nodes[temp].next;}list->nodes[temp].next = index; // 找到尾节点,添加新节点}list->size++;} else {printf("静态链表已满,无法添加新节点\n");}
}// 打印静态链表
void printList(StaticList* list) {int temp = list->nodes[0].next; // 从头节点的下一个节点开始打印while (temp != -1) {printf("%d ", list->nodes[temp].data);temp = list->nodes[temp].next;}printf("\n");
}int main() {StaticList list;initList(&list);appendNode(&list, 1);appendNode(&list, 2);appendNode(&list, 3);printList(&list);return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/640476.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Android 10】 BatteryController

学习了一下电池的相关模式&#xff0c;也就是它的观察者模式&#xff0c;先附上图 图应该挺清晰的&#xff0c;BatteryControllerImpl就是被观察者&#xff0c;BatteryControllerImpl重写了CallbackController的两个方法用于添加或移除观察者。 void addCallback(T listener);…

vivado 预设文件、IP设置(_P)、用户参数、以太网时钟处理、GT位置限制、当前可识别板的IP列表

了解预设文件 预设文件有助于在特定配置中自定义IP核心。PS7、axi_emc和当linear_flash或DDR3_SDRAM 界面是在Vivado IP集成商的Board选项卡中选择的。预设文件使用XML格式。preset_file是为特定的Board文件定义的&#xff0c;可以是用于将预设应用于多个IP。 <ip_presets…

UG制图-视图与投影

当我们进入图纸页后&#xff0c;我们需要对产品进行投影然后进行标注 注意&#xff1a;如果是从零件3D中直接进入制图&#xff0c;默认情况下图框所在的图层是不显示的&#xff0c;我们可以通过菜单或者快捷键ctrl L进入图层设置模块&#xff0c;将图层170和173勾选为显示 我…

解开缺省参数与函数重载的衣裳

解开缺省参数与函数重载的衣裳 代码是如何由编译器变为可执行文件&#xff1f;预处理 ->编译->汇编->链接预处理编译汇编链接 语法了解缺省参数语法实践语法探究函数重载语法实践语法探究结语 本期和大家一起探究C中的缺省函数与重载函数的语法说明与汇编过程代码是如…

LEAN4入门教程1,自然数游戏Tutorial World章节

视频链接&#xff0c;制作不易记得投币哦&#xff1a;LEAN4入门教程&#xff0c;自然数游戏Tutorial World章节_哔哩哔哩_bilibili import Game.Metadata import Game.MyNat.Addition import Game.Levels.Tutorial.L07add_succ World "Tutorial" Level 8 Title &quo…

[java基础揉碎]位运算符

java中有7个位运算&#xff08;&、|、^、~、>>、<<和>>>&#xff09; 第一组 分别是按位与&、按位或|、按位异或^&#xff0c;按位取反~&#xff0c;它们的运算规则是&#xff1a; 按位与& : 两位全为1&#xff0c;结果为1&#xff0c;否则…

熄灭LED

这段代码是用于STM32F10x系列微控制器的程序&#xff0c;主要目的是初始化GPIOA的Pin 0并使其输出高电平。下面是对这段代码的逐行解释&#xff1a; #include "stm32f10x.h"&#xff1a;这一行包含了STM32F10x系列微控制器的设备头文件。这个头文件包含了该系列微控…

蓝桥杯官网填空题(奇怪的分式)

题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 上小学的时候&#xff0c;小明经常自己发明新算法。一次&#xff0c;老师出的题目是&#xff1a;1/4乘以8/5 小明居然把分子拼接在一起&#xff0c;分母拼接在一起&…

基于SpringBoot的高校学科竞赛平台管理系统

基于SpringBoot的高校学科竞赛平台管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatis工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 前台界面 管理员界面 教师界面 学生界面 摘要 本文详细介绍了一款基于…

Google Colab运行Pytorch项目

Google Colab运行Pytorch项目 连接google drive切换到某一文件夹显示当前目录文件安装依赖执行py文件numpy相关numpy.random.randn() 参考文章&#xff1a;文章1 文章2 连接google drive from google.colab import drive import os drive.mount(/content/drive)切换到某一文件…

革新区块链:代理合约与智能合约升级的未来

作者 张群&#xff08;赛联区块链教育首席讲师&#xff0c;工信部赛迪特聘资深专家&#xff0c;CSDN认证业界专家&#xff0c;微软认证专家&#xff0c;多家企业区块链产品顾问&#xff09;关注张群&#xff0c;为您提供一站式区块链技术和方案咨询。 代理合约&#xff08;Prox…

WEB前端3D变换效果以及如何应用js代码

WEB前端DAY8 变换效果3d <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>body{/* 视距&#xff1a;设置距离xy轴构成的平面有多少像素距离 */perspective: 500px;}div{/* 设置变化效果为3d *…

开源项目_大模型应用_Chat2DB

1 基本信息 项目地址&#xff1a;https://github.com/chat2db/Chat2DBStar&#xff1a;10.7K 2 功能 Chat2DB 是一个智能且多功能的 SQL 客户端和报表工具&#xff0c;适用于各种数据库。 对于那些平时会用到数据库&#xff0c;但又不是数据库专家的程序员来说&#xff0c;…

9月大湾区塑料橡胶工业博览会,佛山潭洲国际会展中心

PLAS SHOW 2024大湾区塑料橡胶工业博览会 时间&#xff1a;2024年9月5日-7日 地点&#xff1a;佛山潭洲国际会展中心 中国大型塑料橡胶展&#xff0c;全国塑料橡胶产品的优选平台 共同塑造未来&#xff0c;双循环协作发展 大湾区塑料机械展|大湾区橡胶机械展|大湾区注塑机…

盘点几种有线扩展Wifi覆盖范围方式的优缺点

前言 前几天小白到一个朋友的家里&#xff0c;发现她家的主路由是放在玄关的。 这个方式就导致了她家三个卧室的Wifi信号都很弱。 她叫我过去帮忙弄一下网络的问题&#xff0c;这个对于有一点电脑知识的小伙伴来说&#xff0c;基本上不是什么难事&#xff0c;因为每个房间基本…

AVL树底层实现

目录 AVL树简介 AVL树节点定义​编辑 AVL树特性 AVL树的建立 AVL树的插入 AVL树的旋转 验证AVL树 AVL树的实现&#xff08;代码部分&#xff09; AVL树简介 AVL树是对二叉搜索树的改进&#xff0c;二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序…

PDsehell16连接pgsql出现“Could not initialize JavaVM“时的解决步骤

问题原因:PowerDesigned16是32位的&#xff0c;只能使用32位的JDK来运行JDBC驱动 解决方案&#xff1a; 一、弄一个32为jdk的免安装包 二、 接下来就是配置系统环境变量了&#xff08;注意是系统不是用户环境变量&#xff09; JAVA_HOME配置刚刚32位的存放地址&#xff0c; …

(二十四)Kubernetes系列之Helm3

Helm为kubernetes的包管理工具&#xff0c;就像Linux下的包管理器&#xff08;yum/apt等&#xff09;&#xff0c;可以很方便的将之前打包好的yaml文件部署到kubernetes上。 1.安装访问地址&#xff1a;https://github.com/helm/helm/releases 点击查看最新的版本&#xff0c…

文件操作与IO(3)

文件内容的读写--数据流 这里我们将要讲到文件操作中的重要概念--流. 之前也在C语言讲解中提到了文件流的概念---读写文件内容 分为这几步:(1)打开文件;(2)读/写文件;(3)关闭文件. 数据流主要分为字节流和字符流. 字节流:以字节为单位进行读写(代表:InputStream,OutputStrea…

【Java网络编程01】网络原理初识

【Java网络编程01】网络原理初识 1. 网络通信基础概念 网络通信&#xff1a;网络互连的目的就是网络通信&#xff0c;即网络数据传输&#xff0c;再直白点而言就是不同主机的不同进程之间基于网络进行数据的传输交互。 那么&#xff0c;在组建的网络上有各种各样的主机&#…