静态链表Test1

C++ 静态链表的实现 #include #define MAXSIZE 100 using namespace std; struct Node { int data; //结点数据 int next; //指向下一个结点的指针 }; class Static_List { private: Node node[MAXSIZE]; // 阅读详情

一.实验目的
     巩固线性表的数据结构的存储方法和相关操作,学会针对具体应用,使用线性表的相关知识来解决具体问题。
 
二..实验内容
  建立一个由n个学生成绩的顺序表,n的大小由自己确定,每一个学生的成绩信息由自己确定,实现数据的对表进行插入、删除、查找等操作。分别输出结果。
(用单链表来实现)。

 

三..源代码

//StaticList.h文件

#pragma once
#include<iostream>
#include<string>
using namespace std;
const int MaxSize = 100;
template<class T>
struct Student
{
	string name;
	T S_score;
};
template<class T>
class Node
{
public:
	T data;
	int next;
};
template<class T>
class StaticList
{
public:
	StaticList(T a[], int n);
	~StaticList();
	int GetLength();
	T Get(int i);
	int Locate(T x);
	bool Insert(T e, int index);
	bool Delete(T &e, int index);
	void PrintList();
private:
	int first;
	int avail;
	int i_Length;
	Node<T> Slist[MaxSize];
};
template<typename T>
StaticList<T>::StaticList(T a[], int n) {
	i_Length = 0;
	for (int i = 0; i < MaxSize; i++)
	{
		Slist[i].next = i + 1;
	}
	Slist[MaxSize - 1].next = -1;
	avail = 2;
	first = 1;
	Slist[first].next = -1;
	for (int j = n-1; j >=0; j--)
	{
		if (avail == -1)
		{
			break;
		}
		int s = avail;
		avail = Slist[avail].next;//空闲链的头指针后移
		Slist[s].data = a[j];//将a[j]填入下标为S的节点
		Slist[s].next = Slist[first].next;//将a[j]插到first后面
		Slist[first].next = s;
		i_Length++;
	}
}
template<class T>
StaticList<T>::~StaticList()
{
}
template<class T>
int StaticList<T>::GetLength()
{
	return i_Length;
}
template<typename T>
T StaticList<T>::Get(int i) {
	if (i <= 0 || i > i_Length) {
		throw"";
	}
	int s = first;
	for (int j = 0; j < i; j++) {
		s = Slist[s].next;
	}
	return Slist[s].data;
}
template<class T>
int StaticList<T>::Locate(T x)
{
	int count =0;
	int s = first;
	while (Slist[s].data.S_score!= x.S_score)
	{
		count++;
		s = Slist[s].next;
		if (count > i_Length)
		{
			return -1;
		}
	}
	return  count;
}
template<class T>
bool StaticList<T>::Insert(T e, int index)
{
	if (index<0 || index>i_Length+1)
	{
		return false;
	}
	int s = first;
	for (int i = 1; i < index; i++)
	{
		s = Slist[s].next;
	}
	int k = Slist[s].next;
	Slist[s].next = avail;
	Slist[avail].data.name = e.name;
	Slist[avail].data.S_score = e.S_score;
	Slist[avail].next = k;
	avail = Slist[avail].next;
	i_Length++;
	return true;
}
template<class T>
bool StaticList<T>::Delete(T &e, int index)
{
	if (index<0 || index>i_Length + 1)
	{
		return false;
	}
	int s = first;
	for (int i = 0; i < index; i++)
	{
		s=Slist[s].next;
	}
	int q = Slist[s].next;
	e = Slist[s].data;
	Slist[s].next = Slist[q].next;
	Slist[q].next = avail;
	avail = q;
	i_Length--;
	return true;
}
template<class T>
void StaticList<T>::PrintList()
{
	int s = first;
	for (int i = 0; i < i_Length; i++)
	{
		s = Slist[s].next;
		cout << Slist[s].data.name << ":"<<Slist[s].data.S_score;
		cout << endl;
	}
}

//源.cpp文件

#include"StaticList.h"
#include<iostream>
using namespace std;
int main(void)
{
	Student<float> student[4] = { {"小明",100 }, {"小红",90},{"小刚",80.5},{"小强",60.5} };
	StaticList<Student<float>> S1(student, 4);
	S1.PrintList(); //遍历学生成绩
	cout << "-------------------------------" << endl;
	cout << "成绩链长度为:"<<S1.GetLength() << endl; //获取成绩链的长度
	cout <<"第三个学生:"<<endl<<S1.Get(3).name <<":"<<S1.Get(3).S_score<< endl; //取第三个成绩
	cout <<"小红的位置:"<< S1.Locate({ "小红",90 }) << endl; //获取名为“小红”,成绩为90的位置
	cout << "-------------------------------" << endl;
	S1.Insert({"小李",85.5}, 3);//在第三个位置插入
	S1.PrintList(); //遍历学生成绩
	cout << "-------------------------------" << endl;
	Student<float> temp;
	S1.Delete(temp, 2); //提取并删除第二个成绩
	cout << temp.name <<":"<<temp.S_score<< endl; //输出被删除的成绩
	cout << "-------------------------------" << endl;
	S1.PrintList(); //遍历学生成绩

	system("pause");
	return 0;
}

实验结果如下:

一一验证正确。

四、实验心得

静态链表是花费我时间和精力敲最多的一个线性表,其中主要原因是自己对静态链表的掌握度不够,对于avail和first指针的运用并不熟悉,在插入和删除操作时对静态链

和空闲链的位置移动也不是很清晰,所以出现了不少问题,在仔细研究课本之后才真正完全理解了其原理;在对student s1的定义时,一开始我输入了

StaticList<Student> S1(student, 4),发现提示错误“缺少类模板Student的参数列表”,才发现少了模板的参数,改为StaticList<Student<float>> S1(student, 4)才解决了错误;

除此之外,我还出现了不少细节上的小错误,在此就不一一列举了。

通过这次实验,发现了自己的不少问题,在解决了问题的同时也在提高着自己,相信自己以后能做到更好。



 

顺序表与链表的本质区别及C语言实现 数据结构是计算机科学的基础概念,其中线性表是最常用的数据组织方式。顺序表和链表作为线性表的两种基本实现,其核心差异在于内存管理机制:顺序表通过连续内存块实现O(1)随机访问,链表则通过指针连接离散节点实现O(1)插入删除。在工程实践中,顺序表凭借其缓存友好特性适合频繁读取场景,而链表在动态数据操作中更具优势。通过C语言的结构体封装和指针操作,可以清晰展现两种结构的实现差异。典型应用场景包括游戏对象池(顺序表)和操作系统调度队列(链表),理解它们的内存分配策略和性能特征对开发高性能程序至关重要。 阅读详情

相关推荐

C++ 实现静态链表的简单实例

主要介绍了C++ 实现静态链表的简单实例的相关资料,需要的朋友可以参考下

静态链表和动态链表的实现

静态链表 使用静态链表存储数据,需要预先申请足够大的一整块内存空间,也就是说,静态链表存储数据元素的个数从其创建的那一刻就已经确定,后期无法更改。 比如,如果创建静态链表时只申请存储 10 个数据元素的空间,那么在使用静态链表时,数据的存储个数就不能超过 10 个,否则程序就会发生错误。 不仅如此,静态链表是在固定大小的存储空间内随机存储各个数据元素,这就造成了静态链表中需要使用另一条链表(...

Do Better 1135

瑞芯微RK3568与RK3566芯片选型指南:从接口差异到应用场景深度解析

在嵌入式系统与边缘计算领域,芯片选型是决定产品成败的关键一步。其核心在于理解芯片的架构、接口扩展能力与系统可靠性之间的平衡。以瑞芯微(Rockchip)的RK3568和RK3566为例,这两款同为四核A55架构的芯片,在基础算力上相近,但其面向的应用赛道却因接口配置而截然不同。RK3568凭借其双千兆网口、PCIe 3.0高速接口以及全链路ECC内存支持,在技术价值上更侧重于构建高可靠、高扩展性的系统,如边缘计算网关、工业控制器和网络视频录像机(NVR)。相比之下,RK3566则以其精简的接口配置,精准服务

weixin_33314040的博客 479

c++如何用vector遍历静态链表

本博文节选自pta的一道题目,题目上说找出两个单词的公共后缀,然后给出两个头结点地址,单词数的个数N。找出两者公共后缀。这个部分遍历成为了本道题初学者的难点,

执念斩长河 519

手把手教你理解MIS结构C-V特性曲线:从理论到测试实操

本文深入解析了金属-绝缘体-半导体(MIS)结构的电容-电压(C-V)特性曲线,从积累、耗尽到反型等物理状态出发,详细阐述了其测试原理与实操要点。文章重点介绍了如何通过C-V曲线提取氧化层厚度、掺杂浓度、界面态密度等关键参数,并探讨了偏压-温度(B-T)应力实验在揪出可动离子电荷等可靠性问题中的应用,为半导体器件物理研究与工艺评估提供了实用指南。

weixin_29304021的博客 442

从仿真到器件:铌酸锂电光调制器Comsol建模避坑指南

本文详细介绍了铌酸锂电光调制器在Comsol中的建模全流程,涵盖晶体切向选择、材料参数配置、多物理场耦合等关键技术。通过实战案例和调试技巧,帮助工程师避开常见建模陷阱,提升仿真精度与效率,特别适用于高速光通信系统的器件设计与优化。

m2n3b4v5c6的博客 419

静态链表的实现

一.实验目的      巩固线性表的数据结构的存储方法和相关操作,学会针对具体应用,使用线性表的相关知识来解决具体问题。 二.实验内容       建立一个由n个学生成绩的顺序表,n的大小由自己确定,每一个学生的成绩信息由自己确定,实现数据的对表进行插入、删除、查找等操作。分别输出结果。 要求如下: 1)用顺序表来实现。 2)用单链表来实现。 3)用双链表

c77777_的博客 511

智算中心建设全流程指南:从规划到落地

智算中心的建设是一个复杂而系统的过程,涉及选址、立项、办理相关手续、设计、土建、机电安装、调试、验收等多个环节。每个环节都需要充分考虑各种因素,并注意相关的事项,以确保智算中心的顺利建设和高效运行

数据中心全生命周期价值管理 3396

静态链表c代码实现(根据书本进行了部分修改,修改部分代码有注解)

静态链表的抽象数据类型 ADT 线性表(List) Data 线性表的数据对象集合为{a1,a2,…,an},每个元素的类型均为DataType。其中,除了第一个元素a1外, 每个元素有且只有一个直接的前驱,除了最后一个元素,每个元素有且只有一个直接后继元素。数据 元素之间的关系是一对一的关系。 Operator InitList(*L):初始化操作,建立一个空的线性表L ListEmpty(L):若线性表为空,返回true,否则返回false ClearList(*L):将线性表清

jjjstephen的博客 172

绕过Cloudflare的两种简便方案

绕过Cloudflare的两种简便方案

自成背后的博客 1万+

对CryptoDriver里密钥格式定义的探索(1)

一入网络安全才发现深似海,传统汽车MCU码农转型之路异常艰难。在CP AUTOSAR中的CryptoDriver SWS对密钥格式的需求来源于RFC,其中要求了RSA、ECC、SHE等key material的格式。再往下看,我就有些迷糊了,例如关于RSA Private Key的OCTEE STRING格式根据IETF RFC8017,Public Key又得根据RFC5280,完全不得其解。所以今天先从生成密钥对,并对其进行解析开始,一步一步拆解。

认真搞搞汽车MCU 527

数据结构题集-第二章-线性表-静态链表

改正了静态链表不能直接访问备用链表所管理空间的算法,并提供随机测试模拟应用场景。

georangel 251

基于 ESP32 的智能药盒提醒装置设计与实现

本装置基于 ESP32 实现了智能药盒的核心功能,硬件选型兼顾成本与实用性,软件设计模块化、易拓展。后续可通过 ESP32 的 WiFi 模块接入物联网平台(如阿里云、OneNet),实现远程设置提醒、服药状态反馈等功能,进一步提升智能化水平。该装置能有效解决老人忘服药问题,具有较高的实用价值与推广潜力。

weixin_42300449的博客 1043

初探C语言链表(一)

初探链表一、静态链表二、动态链表初始化链表1.尾插法建立链表2.头插法建立链表三、动态链表的基本操作1.遍历2.查找3.插入4.清空5.删除6.销毁四、链表的综合应用 什么是链表??? 链表是由一系列节点组成,每个节点包含两个域,一个是数据域,一个是节点域。数据域是用来保存用户数据,另外一个是指针域。链表在内存是非连续的。 拿到链表的第一个节点,就相当于拿到整个链表。 带头结点的好处就是对链表操作完成后,第一个节点永远是头结点。 一、静态链表 不带头结点的静态链表:!!! #include<stdi

qq_61516787的博客 2188

【C++PCL】点云文件读写

本文介绍 PCL 中 PCD 与 PLY 点云文件的读取、保存和字段检查,覆盖 PointXYZI、PointXYZRGB、ASCII、二进制及压缩二进制,并给出 C++11 实操代码与参数调试建议。

weixin_45196569的博客 42

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

算法笔记&PAT总结

文章目录静态链表题 静态链表题 1032 Sharing 1052 Linked List Sorting 1074 Reversing Linked List 模板: struct Node{ int add,key,next; XXX 其他性质 }node[1000005]; //确定在链表上的节点,清除无效结点 vector<Node> v; while(head!=-1...

Celeste小天地 1295

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

操作系统实验报告7:进程间通信—共享内存。实现一个带有n个单元的线性表的并发维护。

操作系统实验报告7 实验内容 实验内容:进程间通信—共享内存。实现一个带有n个单元的线性表的并发维护。 建立一个足够大的共享内存空间(lock, M),逻辑值lock用来保证同一时间只有一个进程进入M;测试你的系统上M的上限。 设计一个程序在M上建立一个结点信息结构为 (flag, 学号, 姓名) 的静态链表L,逻辑值flag用作结点的删除标识;在L上建立一个以学号为关键字的二元小顶堆,自行设计控制结构(如静态指针数据域)。 设计一个程序对上述堆结构的结点实现插入、删除、修改、查找、重排等操

StuGeek的博客 1249

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

mooc作业题:list leaves

mooc作业题:list leaves 本题主要考察建树的基本功和层序遍历 题目描述 Given a tree, you are supposed to list all the leaves in the order of top down, and left to right. Input Specification: Each input file contains one test cas...

liamzhao13的博客 395

数据结构题集-第二章-线性表-算法设计题三四

实现和测试了两个算法:比较两个顺序表的大小,定位数据在链表中第一次出现的位置,从动态数组到静态链表,各自取长补短、相辅相成。

georangel 1203

UAV遥感结合小波变换与纹理特征的离岸流监测方案

遥感图像处理技术近年来在近岸海洋环境监测中发挥着越来越重要的作用,其中小波变换作为一种时频分析工具,能够同时保留信号的空间与频率信息,非常适合提取海面影像中的多尺度纹理结构。纹理特征则通过灰度共生矩阵等描述子量化图像局部的粗糙度、方向性和复杂度,为区分不同水体表观提供了可靠的数值依据。将两者结合无人机低空遥感平台,可以高效识别离岸流指示物,如碎波带缺口、深色水舌和泥沙扩散带,从而避免高成本的人工巡查和现场仪器布设。该技术路线计算成本低,纯CPU即可运行,适用于海岸带环境监测、近岸安全预警和遥感影像批量分析等

weixin_30387423的博客 295

PAT A1052 Linked List Sorting (25)(25 分)

题目描述: A linked list consists of a series of structures, which are not necessarily adjacent in memory. We assume that each structure contains an integer key and a Next pointer to the next structure. N...

智渊的博客 245

C提高 | 【02】C语言提高

文章目录1、函数指针1.1 获取函数地址1.2 定义函数指针1.3 函数指针做函数参数2、链表2.1 链表基本概念2.2 数组和链表的区别 1、函数指针 1.1 获取函数地址 函数名就是函数入口的地址。 决定函数的返回值的是:函数的返回值以及函数的参数列表。 #include<stdio.h> void test() { printf("hello world"); } int main01() { int *funcAddr = (int *)test;

weixin_45926547的博客 442

WASI 0.3.1 深入解读:从WebAssembly系统接口到沙箱实践

WebAssembly 作为跨语言、跨平台的高性能沙箱技术,正在从浏览器走向服务端与边缘计算。而要让模块安全地访问文件、网络、时钟等系统能力,离不开系统接口层的支撑,这就是 WASI(WebAssembly System Interface)的核心价值。WASI 0.3.1 作为该接口的维护版本,在稳定兼容的基础上强化了组件模型、异步IO与网络能力,为开发者提供了更成熟的模块化方案。本文从版本差异、运行时选型、编译测试、宿主API调用、批量任务编排及性能观察等维度,给出了一套可落地的验证流程。无论是构建轻量

weixin_30595035的博客 387

PAT真题满分代码

Github仓库地址 TraningOfPAT [一下链接不可用, 使用上面的Github仓库可以访问] 对练习后的PAT代码存储地方 (^-^)PAT 真题网站传送门 (^-^)POJ 北大OJ Content Basic Level(乙级) NULL Advanced Level(甲级) 1001 A+B Format - Skr-Long ...

weixin_30872789的博客 544

让12款AI助手跑起逆向分析:REA一条命令MCP接入实测

你的 AI 助手写代码很快,但面对一个 App、一个原生二进制或一个网站,它往往只能泛泛而谈——编译后的内部逻辑它看不见。REA 是一个本地运行的 MCP 逆向分析服务器,一条 `npx rea-agents setup` 就能把这套逆向工具箱挂到你常用的 AI 编程助手里。下面按实测顺序讲接入、12 款助手清单和排障路径。 ## 一条命令接入 Agent:安装器 `npx rea-agents

gitblog_00583的博客 787
上一篇: 数据结构实验2.2(循环链表Test1)
下一篇: 双向链表Test1
Hpsyche
博客等级 码龄9年 1050粉丝 69原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值