2.4静态链表-作业

数据结构之静态链表 静态链表:分配一整片连续的内存空间,各个结点集中安置,逻辑结构上相邻的数据元素,存储在指定的一块内存空间中,数据元素只允许在这块内存空间中随机存放,这样的存储结构生成的链表称为静态链表。也就是说静态链表是用数组来实现链式存储结构,静态链表实际上就是一个结构体数组举例:通过a[1]中存放的游标变量3可找到存放的数据元素5的后继元素为3,再通过a[3]中存放的游标变量2可找到存放数据元素3的后继数据为2,以此类推,直到某元素的游标变量为0即可停止(注:a[0]为头结点不存储数据元素) 阅读详情

前言

本节是对静态链表的实现,还是有一些点需要注意,跟动态链表还是有些区别。定义的next和used都是int型,但是开辟空间还是要用malloc库函数。

1.代码实现

#include <stdio.h>
#include <malloc.h>

#define DEFAULT_SIZE 5
//定义结点
typedef struct StaticLinkedNode {
	char data;
	int next;
}*NodePtr;
//定义链表结点
typedef struct StaticLinkedList {
	NodePtr nodes;
	int* used;
}*ListPtr;

ListPtr initLinkedList()
{
	ListPtr tempPtr;//定义头指针
	tempPtr = (ListPtr)malloc(sizeof(struct StaticLinkedList));

	tempPtr->nodes = (NodePtr)malloc(sizeof(struct StaticLinkedNode) * DEFAULT_SIZE);//给头指针的nodes域开辟空间
	tempPtr->used = (int*)malloc(sizeof(int) * DEFAULT_SIZE);//给used域开辟空间

	tempPtr->nodes[0].data = '\0';//头指针的data和next域都置空
	tempPtr->nodes[0].next = -1;

	tempPtr->used[0] = 1;//第一个结点标记为1
	for (int i = 1; i < DEFAULT_SIZE; i++) {
		tempPtr->used[i] = 0;//遍历定义的最大空间,给每个used都设置为0
	}

	return tempPtr;//返回头指针的地址
}

void printList(ListPtr paraListPtr)
{
	int p = 0;
	while (p != -1) {
		printf("%c", paraListPtr->nodes[p].data);
		p = paraListPtr->nodes[p].next;//遍历输出所有的data,如果used值为-1,说明遍历到表尾了,退出循环.
	}

	printf("\r\n");
}

void insertElement(ListPtr paraListPtr, char paraChar, int paraPosition)
{
	int p, q, i;//p为表中元素的相对位置,q用来赋值i,i就是局部变量
	p = 0;
	for (i = 0; i < paraPosition; i++) {
		p = paraListPtr->nodes[p].next;
		if (p == -1) {//先遍历到paraPosition所指的位置,但是还是要排除表被遍历结束还找不到paraPosition.
			printf("The position %d is beyong the scope of the list.\r\n", paraPosition);
			return;
		}
	}

	for (i = 1; i < DEFAULT_SIZE; i++) {//进行到这,就开始给新插入的元素找表中空的位置./遍历寻找used为0的位置
		if (paraListPtr->used[i] == 0) {
			printf("Space at %d allocated.\r\n", i);
			paraListPtr->used[i] = 1;
			q = i;//q的作用:i赋值给q.
			break;
		}
	}

	if (i == DEFAULT_SIZE) {
		printf("No space.\r\n");
		return;//空间达到最大,不能进行后续元素插入了.
	}
	//这几步就是把原本空间的数据改成传入的数据,然后再把表前后连接.
	paraListPtr->nodes[q].data = paraChar;

	printf("linking\r\n");
	paraListPtr->nodes[q].next = paraListPtr->nodes[p].next;
	paraListPtr->nodes[p].next = q;
}

void deleteElement(ListPtr paraListPtr, char paraChar)
{
	int p, q;//q来表示元素位置,q来占位删除元素的后一个元素.
	p = 0;
	//遍历:两个条件,p->next不能为空,p->data不能为传入的元素./因为我们要让p指向删除的元素的前一个位置.
	while ((paraListPtr->nodes[p].next != -1) && (paraListPtr->nodes[paraListPtr->nodes[p].next].data != paraChar)) {
		p = paraListPtr->nodes[p].next;
	}
	//排除p->next==NULL的情况.
	if (paraListPtr->nodes[p].next == -1) {
		printf("can not delete %c\r\n", paraChar);
		return;
	}
	//接下来几步就是把删除元素的前后元素相对位置连接起来.
	q = paraListPtr->nodes[p].next;
	paraListPtr->nodes[p].next = paraListPtr->nodes[paraListPtr->nodes[p].next].next;
	//别看这个长,其实[]里面就是p->next,然后外围又是一个next,所以就是p->next->next.
	paraListPtr->used[q] = 0;
}

void appendinsertdeleteTest()
{
	ListPtr tempList = initLinkedList();
	printList(tempList);

	insertElement(tempList, 'H', 0);
	insertElement(tempList, 'e', 1);
	insertElement(tempList, 'l', 2);
	insertElement(tempList, 'l', 3);
	insertElement(tempList, 'o', 4);
	printList(tempList);

	printf("Deleting 'e'.\r\n");
	deleteElement(tempList, 'e');
	printf("Deleting 'a'.\r\n");
	deleteElement(tempList, 'a');
	printf("Deleting 'o'.\r\n");
	deleteElement(tempList, 'o');

	printList(tempList);

	insertElement(tempList, 'x', 1);
	printList(tempList);
}

void main()
{
	//invoking function.
	appendinsertdeleteTest();
}

2.输出结果

Space at 1 allocated.
linking
Space at 2 allocated.
linking
Space at 3 allocated.
linking
Space at 4 allocated.
linking
No space.
Hell
Deleting 'e'.
Deleting 'a'.
can not delete a
Deleting 'o'.
can not delete o
Hll
Space at 2 allocated.
linking
Hxll
静态链表知多少 《大话数据结构》笔记——静态链表小结 阅读详情

相关推荐

分布式推理服务(策略:数据并行、张量并行、流水线并行、专家并行)技术分析

摘要:分布式推理突破单GPU内存和算力限制,支持大模型部署。四种核心策略包括: 数据并行:复制模型拆分数据,提升吞吐但内存效率低; 流水线并行:模型分阶段执行,支持超大模型但存在计算气泡; 张量并行:拆分层内矩阵运算,延迟低但通信开销大; 专家并行:动态激活MoE模型专家,计算高效但路由复杂。实际应用中常组合策略(如3D并行),需权衡模型规模、硬件条件与性能目标。

技术引领业务创新 946

2.4静态链表作业

【代码】2.4静态链表作业。

2402_87277801的博客 148

qt使用qxlsx实现xlsx、xls表格文件快速写入和读取

新年第二篇文章,收尾一个去年计划中发表文章和实现功能。

kbq的博客 1万+

数据结构作业 2.4:静态链表

【代码】数据结构作业 2.4:静态链表。

2401_86687765的博客 181

Qoder Quest 模式实战:从需求到代码的自动化开发

本文深入探讨Qoder Quest模式如何实现从需求到代码的自动化开发。通过编写清晰的Spec规格说明,Qoder能智能分解任务并在后台执行,生成高质量代码,大幅提升开发效率,让开发者专注于架构设计等创造性工作。

herb5的博客 1154

高分三号SAR影像超精细条带数据预处理实战:从原始数据到地理编码的完整操作指南

本文提供了高分三号SAR影像超精细条带数据预处理的完整实战指南。详细介绍了从原始数据导入、多视处理、滤波去噪、DEM准备到地理编码与辐射定标的完整流程,帮助用户利用SARscape软件将原始SAR数据转化为可用于分析的地理编码产品。

tree8的博客 578

【作业】2.4静态链表

一种结构体数组为数据,用数组usde标记的顺序表,但加入了next让顺序表变为链表;避免了删除和增加数据时候大量的移动位置操作;

crazzyy的博客 369

【面试系列】数据工程师高频面试题及详细解答

本文针对数据工程师岗位,提供了详尽的面试题库和解答,分为初级、中级和高级三个层次。初级面试题主要涉及基本的数据处理和ETL工具的使用,如SQL查询、数据清洗和基本的数据建模。中级面试题重点考察数据管道设计、数据库优化和大数据平台的应用。高级面试题则深入探讨高级数据处理技术、分布式系统架构和数据湖的实现。通过这些问题和解答,候选人可以全面了解数据工程师岗位所需的技能,帮助其更好地准备面试。常考知识点总结部分则系统归纳了数据工程师岗位的关键技能领域。

在路上的专栏 2376

数据结构作业-2.4静态链表

【代码】数据结构作业-2.4静态链表。

2601_95873847的博客 30

项目报告:基于Sentaurus TCAD的多沟道长度NMOS器件仿真、SPICE模型提取与环形振荡器电路验证

本项目基于Sentaurus TCAD工具,完成了从器件仿真到电路验证的全流程研究。首先构建了45nm、65nm和90nm三种沟道长度的NMOS器件,通过TCAD仿真分析了其电学特性,观察到明显的短沟道效应。随后提取了BSIM4 SPICE模型参数,并生成Hspice可用的模型文件。最后利用该模型设计了11级环形振荡器进行电路验证,证明了模型的实用性。研究结果表明,随着沟道长度缩短,器件性能虽有所提升,但短沟道效应导致关态电流显著增加,影响整体能效。本项目为纳米尺度MOSFET的建模与电路设计提供了完整的技

huanghm88的专栏 284

【大模型】从0到1:DeepSeek + Coze API调用全攻略,企业,开发个人专属AI智能体使用详解,小白也能轻松上手

本文介绍了如何通过API将Coze智能体集成到自有系统中的完整步骤:1)获取API token和个人工作空间的space_id;2)通过GET请求获取bot_id;3)使用POST发起对话请求,需包含bot_id、user_id和问题内容;4)通过两次API调用异步获取响应消息。文章还解释了Coze采用异步处理机制的原因,并预告了下期将讲解Java调用Coze接口的实现方法。整个过程需要使用API工具进行调试,确保了系统集成的可行性。

qq_27246521的博客 824

高级线性表——静态链表(最全静态链表解读)

写在前面:博主是一位普普通通的19届二本大学生,平时最大的爱好就是听听歌,逛逛B站。博主很喜欢的一句话花开堪折直须折,莫待无花空折枝:博主的理解是头一次为人,就应该做自己想做的事,做自己不后悔的事,做自己以后不会留有遗憾的事,做自己觉得有意义的事,不浪费这大好的青春年华。博主写博客目的是记录所学到的知识并方便自己复习,在记录知识的同时获得部分浏览量,得到更多人的认可,满足小小的成就感,同时在写博客的途中结交更多志同道合的朋友,让自己在技术的路上并不孤单。 目录: 1. 2. 3.  &n.

记录博主学到的点滴 1万+

客服转人工率直降60%!OpenClaw深度集成NLP引擎,打造企业级对话自动化智能客服系统

本文介绍了一套基于OpenClaw智能体框架和NLP大模型引擎的智能客服系统解决方案。该系统通过深度集成NLP引擎实现精准语义理解,采用分层架构设计支持多渠道接入和业务系统对接,显著提升了客服效率。核心亮点包括:92%的重复问题自动解决率,60%的转人工率下降,40%的人力成本降低,以及从30秒压缩至0.5秒的平均响应时长。文章详细阐述了技术选型、系统架构设计、核心模块实现等关键环节,展示了如何通过智能对话系统破解传统客服业务中的人力资源与服务质量矛盾。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 362

2.4静态链表

1.代码实现2.运行结果3.思考1)静态链表和单链表的区别。

2401_87865164的博客 1257

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

作业4静态链表

因此,静态链表插入和删除操作相对复杂,需要通过修改游标来实现节点的链接和断开,但在一些特定场景下,如对空间有限制且数据操作较为规律时,有一定优势。//为节点数组和标记数组分配内存。

wlyhzhf的博客 633

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

静态链表详解

静态链表是分配一整片连续的内存空间,各个结点集中安置,而不是像单链表那样,每个结点在内存中分散存储。如上如的存储方式,优点类似于顺序表,但是在这一整片连续的内存空间中,元素不是按照顺序存储的。而是可以打乱顺序存储,这时候就需要将结点分为两个部分,一个部分存储数据元素,另一个部分存储下一个结点所在的下标(称其为游标),比如头结点存放的下标(游标)为2,代表在2的位置上是静态链表的第一个真正存放数据的结点。addr+8*2(这里假设数据元素和游标的大小都为4B)。//数组a作为静态链表}}...

hibugs 9521

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

2.4 静态链表

地址和数组的下标之间的联系在于,数组的下标是指向数组元素的相对位置,而地址是元素在内存中的实际物理位置。区别在于,地址是固定的内存偏移量,表示存储位置,而数组下标则是基于数组起始地址的偏移量,它为逻辑上的元素访问提供方便。不同于动态链表用动态申请空间,静态链表的空间在一开始就分配好,不会动态变化。可以将空间划分成一个节点数组,每个节点包含数据和指向下一个节点的索引,用一个数组存储多个链表的头指针,通过维护空闲链表管理未使用的节点,利用索引实现不同链表的连接,从而在一片空间内支持多个静态链表。

2302_77659505的博客 531

静态链表你学会了吗

最近在复习大学学习的静态链表数据结构,从代码分析结构,卡在了备用链表那里,通过搜集资料找结构图才清晰理解了它。 静态链表结构 图一 静态链表的整体结构 在备用链表中插入数据 图二 空的静态链表 图三 向备用链表添加一个元素 图四 向备用链表添加两个元素 ...

zk25257758的博客 1964

C语言-静态链表

C语言-静态链表,图解每一个过程

qq_64831425的博客 1917

静态链表详解(C语言版)

7char data;int cur;}component;//将结构体数组中所有分量链接到备用链表中//初始化静态链表//向链表中插入数据,body表示链表的头结点在数组中的位置,add表示插入元素的位置,a表示要插入的数据//删除链表中含有字符a的结点//查找存储有字符elem的结点在数组的位置//将链表中的字符oldElem改为newElem//输出函数//从备用链表中摘除空闲节点的实现函数//将摘除下来的节点链接到备用链表上。

酒无忧的博客 2874

【C 数据结构】静态链表

数据全部存储在数组中(和顺序表一样),但存储位置是随机的,数据之间的逻辑关系通过一个整形变量(称为"游标",和指针功能类似)维持(和链表类似)a[0] 是备用链表的第一个节点,我们知道它的位置,操作它的直接后继节点相对容易,无需遍历备用链表。备用链表最后1个节点的游标为 0 即指向表头,备用链表第1个节点存有值,则表明数据已存满。

普罗米修斯的博客 1307

数据结构--1.4静态链表

数据结构--静态链表代码实现结构体定义创建输出插入删除测试代码 代码实现 今天敲得是静态链表。静态链表区别于单链表的一大特点是,静态链表有部分的空间是由我们自己进行安排,所以这部分的代码自我感觉理解起来可能会更困难,所以会多一些文字说明,尽可能把其中的内存分配原理说清楚。 结构体定义 在这里我们定义了两个结构体,他们的用处在创建中会写到。 #include <stdio.h> #include <malloc.h> #define DEFAULT_SIZE 5 typedef s

m0_63944721的博客 1631
上一篇: 2.3双向链表-作业
下一篇: 3.1多项式加法-作业
dev_cc_
博客等级 码龄3年 41粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值