当前位置: 首页 > news >正文

# 集美大学课程实验报告-实验2:线性表

集美大学课程实验报告-实验2:线性表

项目名称 内容
课程名称 数据结构
班级 网安2512
指导教师 郑如滨
学生姓名 蔡华杰
学号 202521336054
实验项目名称 线性表的使用
上机实践日期 3月19日
上机实践时间 2学时

一、目的(本次实验所涉及并要求掌握的知识点)

  • 掌握顺序表的基本操作:创建、删除区间元素、输出,释放
  • 掌握单链表的基本操作:头插法建表、尾插法建表、链表逆置、输出
  • 引用参数&进行链表操作
  • 理解顺序表和链表的区别及各自的特点
  • 掌握指针操作和动态内存管理

二、实验内容与设计思想

题目1:区间删除

函数相关伪代码

伪代码:
函数1: CreateList(L, n):输入: 顺序表指针 L(引用), 元素个数 n输出: 无(通过引用修改 L)为 L 分配新的 List 内存空间设置 L.length = n循环 i 从 0 到 n-1:读取输入值并存入 L.data[i]函数2 DelNode(L, min, max):输入: 顺序表指针 L(引用), 删除区间 [min, max]输出: 无(通过引用修改 L)如果 L 为空 或 L.length ≤ 0:返回初始化 newlength = 0循环 i 从 0 到 L.length-1:如果 L.data[i] < min 或 L.data[i] > max:// 该元素不在删除区间内,保留L.data[newlength] = L.data[i]newlength = newlength + 1// 更新顺序表长度L.length = newlength函数3 DispList(L):输入: 顺序表指针 L输出: 无(打印结果)如果 L 为空 或 L.length ≤ 0:打印 "线性表为空!"返回循环 i 从 0 到 L.length-1:如果 i > 0:打印一个空格打印 L.data[i]打印换行返回

函数代码

void CreateList(SqList &L,int n){L=new List;L->length = n;for(int i=0;i<n;i++){cin >>L->data[i];}
}void DelNode(SqList &L,int min,int max){if(L == NULL ||L->length <=0)return;//ElemType newlength=0;for (int i = 0; i <= L->length-1; i++){if(L->data[i]<min||L->data[i]>max){L->data[newlength++] = L->data[i]; }}L->length = newlength;
}void DispList(SqList L){if(L==NULL || L->length<=0){cout<<"线性表为空!"<<endl;return;}for(int i=0;i<L->length;i++){if(i>0){cout<<" ";}cout<<L->data[i];}cout<<endl;return;
}

复杂度

函数 时间复杂度

题目2:头插法或尾插法创建链表

函数相关伪代码

伪代码:
头插法:
函数1 CreateListF(L, n):输入: 链表头指针 L(引用), 元素个数 n输出: 无(通过引用修改 L)为 L 分配新的 LNode 内存空间L.next = NULL循环 i 从 1 到 n:为 newNode 分配新的 LNode 内存空间读取输入值存入 newNode.datanewNode.next = L.next    L.next = newNode        
函数2 DispList(L):输入: 链表头指针 L输出: 无(打印链表内容)如果 L 为空 或 L.next 为空:打印 "空链表!"返回p = L.nextisFirst = true当 p 不为空时:如果 isFirst 为假:打印一个空格打印 p.datap = p.nextisFirst = false尾插法:
函数 CreateListR(L, n):输入: 链表头指针 L(引用), 元素个数 n输出: 无(通过引用修改 L)为 L 分配新的 LNode 内存空间L.next = NULL如果 n < 0:返回r = L循环 i 从 1 到 n:为 newNode 分配新的 LNode 内存空间读取输入值存入 newNode.datanewNode.next = NULLr.next = newNode   r = newNode              

函数代码

头插法:
void CreateListF(LinkList &L,int n){L = new LNode;//头节点L,要分配内存,因为不知道头节点有无L->next = NULL;for(int i=0;i<n;i++){LinkList newLNode = new LNode;cin >> newLNode->data;newLNode ->next = L ->next;L->next = newLNode;}
}
void DispList(LinkList L){if(L==NULL||L->next==NULL){//记住链表带头节点时,L 永远不为NULL(除非没创建)cout<<"空链表!"<<endl;//上行注意顺序return;}LinkList p = L->next;// p指向第一个数据节点bool first = true;     // 标记是否是第一个输出的元素while(p!=NULL){if(!first){cout<<" ";}cout<<p->data;p = p->next;first = false;}
}
尾插法:
void CreateListR(LinkList &L, int n){L = new LNode;L->next = NULL;//别忘记了要指向空if(n<0)return;LinkList r = L;//定义尾巴指针rearfor(int i=0; i<n;i++){LinkList newNode = new LNode;cin>>newNode->data;newNode->next = NULL;//别忘记r->next = newNode;//记住r = newNode;}
}

题目3:单链表的逆置

函数相关伪代码

函数 ReverseList(L):输入: 链表头指针 L(引用)输出: 无(通过引用修改 L)如果 L.next == NULL 或 L.next.next == NULL:返回pre = L.next          cur = pre.next        pre.next = NULL当 cur != NULL 时:temp = cur.next cur.next = pre  pre = cur         cur = temp        L.next = pre

函数代码

void ReverseList(LinkList &L){if(L->next==NULL||L->next->next ==NULL)return;//忘记考虑呢空链表,即无数据,或只有一个数据LinkList cur,pre,temp;pre = L->next;cur = pre->next;pre->next = NULL;//别忘记了,将第一个节点变成尾节点while(cur!=NULL){temp = cur->next;cur->next = pre;pre = cur;//别打错打反了cur = temp;//}L->next = pre;
}

三、实验使用环境(本次实验所使用的平台和相关软件)

  • 操作系统:Windows 11专业版
  • 编程语言:C++
  • 开发工具:Visual Studio 18.3.2
  • 编译器:MSVC 14.40

四、实验步骤和调试过程(实验步骤、测试数据设计、测试结果分析)

题目1:区间删除

本机运行截图
![[Pasted image 20260322170853.png|1277]]
PTA提交截图
![[Pasted image 20260322171032.png]]

题目2:头插法或尾插法创建链表

头插法:

本机运行截图
![[Pasted image 20260322171617.png]]
PTA提交截图
![[Pasted image 20260322171217.png]]
尾插法:

本机运行截图
![[Pasted image 20260322172000.png]]
PTA提交截图
![[Pasted image 20260322171317.png]]

题目3:单链表的逆置

本机运行截图
![[Pasted image 20260322172251.png]]
PTA提交截图
![[Pasted image 20260322172325.png]]

五、实验小结(实验中遇到的问题及解决过程、实验体会和收获)

遇到的问题及解决方法:

  1. 问题: 在实现DelNode函数时,未成考虑链表为空
    • 解决方法:增加对空链表的判断,当L == NULL或L->length <= 0时直接返回
  2. 问题:头插法过程忘记将L->next设置为NULL,导致链表尾节点指向随机地址
    • 解决方法:在L = new LNode;后立即添加L->next = NULL;
  3. 问题:在ReverseList函数中,先移动cur再移动pre
    • 解决方法:先保存cur的下一个节点(temp),再反转cur的指针方向,然后依次移动pre和cur,确保遍历过程中不会丢失链表。

实验体会和收获:

  • 掌握了指针操作的核心技巧:通过多次练习头插法、尾插法和链表逆置,对指针的指向、移动和修改有了更清晰的认识。特别是三个指针配合进行链表逆置的过程
  • 养成了边界条件检查的习惯:在编写函数时,必须充分考虑各种边界情况:空表、只有一个元素、全部元素被删除、输入n为0等
  • 学会了引用参数的使用:实验中使用LinkList &L这样的引用参数,使得在函数内部对链表的修改可以直接影响外部的链表,避免了返回指针的麻烦。

六、附件(参考文献和相关资料)

  1. 实验2-线性表
http://www.jsqmd.com/news/518698/

相关文章:

  • 计算机毕业设计:Python基于Spark与协同过滤的智能图书推荐平台 Django框架 协同过滤推荐算法 书籍 可视化 数据分析 大数据 大模型(建议收藏)✅
  • FB自动化养号实战:RPA脚本编写与AdsPower应用指南
  • 算法设计中的代价函数优化与约束求解的技术7
  • 【GitHub项目推荐--Page Agent:网页内的 GUI 智能体】⭐⭐⭐
  • 虚拟机锁定文件残留问题全解析:从.lck文件清理到权限修复
  • 基于COMSOL平台,探讨二氧化碳驱替甲烷模型:单场效应下的气体驱替效应研究
  • 【GitHub项目推荐--LobsterBoard:OpenClaw 生态的可视化仪表盘构建器】⭐⭐⭐
  • 告别MDK编译错误:ARM-Compiler V5离线安装包+环境配置全攻略(含历史版本下载)
  • 从《交通时空大数据分析》到实战:用transbigdata和geopandas处理上海地铁数据的完整流程
  • 算法复杂度的符号推导与渐进边界分析的技术7
  • 也许是一些好题 7
  • CCF-A vs 中科院分区:用Python爬虫分析JMLR等20本期刊的‘身份错位‘现象
  • 若依框架菜单权限配置避坑指南:从数据库到前端全流程解析
  • 计算机毕业设计:Python智能图书推荐与大数据平台 Spark Django框架 协同过滤推荐算法 书籍 可视化 数据分析 大数据 大模型(建议收藏)✅
  • Tsmaster工程:强大替代Canoe的国产软件,降低成本与节约开发时间的理想解决方案
  • COMSOL模拟下的枝晶生长与电化学沉积模型:典型成核、随机成核、均匀沉积及雪花晶形成过程的综合研究
  • 如何用clang-format定制你的C++代码风格?从LLVM到Google风格详解
  • c程序完整运行步骤
  • Windows下VSCode配置OpenSSL开发环境避坑指南(C语言版)
  • Spring AI + RAG 实战:从零构建医疗智能问答系统,准确率突破 92%
  • 用过才敢说! 全场景通用降AIGC平台 千笔·专业降AI率智能体 VS 万方智搜AI
  • 外卖前端Day1.2 (路由,vuex共享数据,typescript)
  • 吐血推荐!全学科适配的AI论文神器 —— 千笔AI
  • Vue项目实战:用Luckysheet打造企业级Excel在线编辑器(附完整代码)
  • Java对象内存分配全解:从new Student()到this关键字,一张图看懂对象在内存中的完整生命周期
  • 基于Python的仿淘宝系统毕设
  • VS2022+PCL环境配置避坑指南:vcpkg一键安装后这些细节要注意
  • Go 语言的“刻意贫穷“:为什么宁可写 30 行选项模式,也拒绝默认参数?
  • c语言第一次作业
  • Python豆瓣图书数据可视化平台 Flask框架 可视化 爬虫 书籍 大数据 机器学习 计算机毕业设计(建议收藏)✅