【线性表的基本操作实现及其应用 】

news2025/1/23 7:26:29

线性表的基本操作实现及其应用

1.实验目的
⑴ 熟练掌握线性表的基本操作在两种存储结构上的实现,其中以熟悉各种链表的操作为重点。
⑵ 巩固高级语言程序设计方法与技术,会用线性链表解决简单的实际问题。
2.实验原理与要求
⑴ 按照数据结构实验任务书,提前做好实验预习与准备工作,独立完成。
⑵ 任选一题,多选者并且保质保量完成适当加分。
⑶ 严格按照数据结构实验报告模板和规范,及时完成实验报告。
3.实验内容(实验内容为多选,请在自己所做题目前打“√” )
⑴ 顺序表的表示与操作实现
完成顺序表建立、输出、插入、删除、查找和统计等基本操作与算法实现
√⑵ 单链表的表示与操作实现
完成单链表建立、输出、插入、删除、查找和统计等基本操作与算法实现
4.实验步骤
(说明:依据实验内容分别说明实验程序中用到的数据类型的定义、主程序的流程以及每个操作(成员函数)的伪码算法、函数实现、程序编码、调试与分析、总结、 附流程图与主要代码)
4.1数据结构与核心算法的设计描述
⑴ 单链表的结点类型定义
/* 定义DataType为int类型 /
typedef int DataType;
/
单链表的结点类型 */
typedef struct LNode
{ DataType data;
struct LNode *next;
}LNode,*LinkedList;
⑵ 初始化单链表,建立一个带头结点的单链表
LinkedList LinkedListInit()
{LinkedList L;
L=(LinkedList)malloc(sizeof(LNode));
L->next=NULL;
printf(“初始化完成!\n”);
return L;
}
⑶ 清空单链表
void LinkedListClear(LinkedList L)
{ L->next=NULL;
}
⑷ 遍历单链表
void LinkedListTraverse(LinkedList L)
{LinkedList p;
p=L->next;
while(p!=NULL)
{printf(“%d “,p->data);
p=p->next; }
}
⑸ 求单链表的长度
int LinkedListLength (LinkedList L)
{LinkedList p;
int j;
p=L->next;
j=0;
while(p!=NULL)
{ j++;p=p->next; }
return j;
}
LinkedList LinkedListGet (LinkedList L, int i)
{LinkedList p;int j;
p=L->next; j=1;
while (p!=NULL && j<i )
{p=p->next; j++; }
if (ji) return p;
else return NULL;
}
⑹ 从单链表表中查找元素
LinkedList LinkedListLocate ( LinkedList L, ElemType x)
{
LinkedList p;
p=L->next;
while ( p!=NULL && p->data != x)
p=p->next;
return p;
}
⑺ 从单链表表中查找与给定元素值相同的元素在链表中的位置
LinkedList LinkedListLocate ( LinkedList L, ElemType x)
{
LinkedList p;
p=L->next;
while ( p!=NULL && p->data != x)
p=p->next;
return p;
}
⑻ 向单链表中插入元素
void LinkedListInsert(LinkedList L, int i, ElemType x)
{LinkedList pre,p,s;int j;
pre=L;j=1;p=L->next;
while(pre&&j<i)
{pre=p;p=p->next;j++;}
if(pre
NULL)
{printf(“给的i值超过了表长”);exit(0);}
s=(LNode *)malloc(sizeof(LNode));
s->data=x;
pre->next=s;
s->next=p;
return ;
}
⑼ 从单链表中删除元素
void LinkedListDel (LinkedList L,ElemType x)
{ LinkedList pre,p;int j;
pre=L;j=1;p=L->next;
while(p&&p->data!=x)
{pre=p;p=p->next;j++;}
if(p==NULL)
{printf(“表中没有值为x的结点”);exit(0);}
pre->next=p->next;
free§;
}
⑽ 用尾插法建立单链表
LinkedList LinkedListCreat( )
{ LinkedList L=LinkedListInit(),p,r;
ElemType x;
r=L;
printf(“please input data,input -1 is end\n”);
scanf(”%d”,&x);
while (x!=flag)
{p=(LinkedList)malloc(sizeof(LNode));
p->data=x;
r->next=p;
r=p;
scanf(“%d”,&x);
}
r->next=NULL;
return L;
}
4.2函数调用及主函数设计
函数的调用关系如下图1所示:
在这里插入图片描述

图1. 函数的调用关系
4.3 程序调试及运行结果分析
⑴ 程序调试过程
在编译过程中出现一处错误。
在这里插入图片描述

在经过调试后发现是129行的分号是中文符号下的,经过修改程序编译正常。
在这里插入图片描述

⑵ 运行结果分析
<1> 程序运行结果:
在这里插入图片描述

<2>选择输入“1” 初始化链表 ,测试结果如下:
在这里插入图片描述

<3>选择输入“10” ,尾插法建立单链表 ,运行结果如下:
在这里插入图片描述

<4>选择输入“3” ,求单链表长度 ,运行结果如下:
在这里插入图片描述

<5>选择输入“4”,运行结果如下:
在这里插入图片描述

<6>选择输入“5”,遍历单链表,运行结果如下:
在这里插入图片描述

<7>选择输入“6”,从链表中查找元素,运行结果如下:
在这里插入图片描述

<8>选择输入“7”,查找与给定元素值相同的元素在表中的位置,运行结果如下:
在这里插入图片描述

<9>选择输入“8”,向链表插入元素,运行结果如下:

在这里插入图片描述

<10>选择输入“9”,从链表中删除元素,运行结果如下:
在这里插入图片描述

4.4 实验总结
本次实验是在多次思考调试后才做出来的。经过这次单链表基本操作实验自己的编程能力有了进一步提高,认识到自己以前在思考问题上思路不够开阔,不能灵活的表达出自己的想法。
通过这次实验我知道了只有在切身编程中才能真正地理解掌握。今后更应勤加学习、练习,多看、多练、勤思考,以便更好的掌握数据结构这门至关重要的课程。
5主要算法流程图及程序清单
⑴ 主要算法流程图:
插入算法:
在这里插入图片描述

删除算法:
在这里插入图片描述

⑵ 程序清单
/* 定义ElemType为int类型 /
typedef int ElemType;
#define TRUE 1
#define FALSE 0
#define NULL 0
#define flag -1
/
单链表的结点类型 */
typedef struct LNode
{ElemType data;
struct LNode *next;
} LNode,LinkedList;
/
初始化单链表 /
LinkedList LinkedListInit()
{LinkedList L;
L=(LinkedList)malloc(sizeof(LNode));
L->next=NULL;
printf(“初始化完成!\n”);
return L;
}
/
清空单链表 /
void LinkedListClear(LinkedList L)
{ L->next=NULL;
}
/
检查单链表是否为空 /
int LinkedListEmpty(LinkedList L)
{if(L->next==NULL) return TRUE;
else return FALSE;
}
/
遍历单链表 */
void LinkedListTraverse(LinkedList L)
{LinkedList p;
p=L->next;
while(p!=NULL)
{printf(“%d “,p->data);
p=p->next;
}
}
// 求单链表的长度
int LinkedListLength (LinkedList L)
{LinkedList p;
int j;
p=L->next;
j=0;
while(p!=NULL)
{ j++;p=p->next; }
return j;
}
LinkedList LinkedListGet (LinkedList L, int i)
{LinkedList p;int j;
p=L->next; j=1;
while (p!=NULL && j<i )
{p=p->next; j++; }
if (ji) return p;
else return NULL;
}
// 从单链表表中查找与给定元素值相同的元素在链表中的位置
LinkedList LinkedListLocate ( LinkedList L, ElemType x)
{
LinkedList p;
p=L->next;
while ( p!=NULL && p->data != x)
p=p->next;
return p;
}
// 向单链表中插入元素
void LinkedListInsert(LinkedList L, int i, ElemType x)
{LinkedList pre,p,s;int j;
pre=L;j=1;p=L->next;
while(pre&&j<i)
{pre=p;p=p->next;j++;}
if(pre
NULL)
{printf(“给的i值超过了表长”);exit(0);}
s=(LNode *)malloc(sizeof(LNode));
s->data=x;
pre->next=s;
s->next=p;
return ;
}
// 从单链表中删除元素
void LinkedListDel (LinkedList L,ElemType x)
{ LinkedList pre,p;int j;
pre=L;j=1;p=L->next;
while(p&&p->data!=x)
{pre=p;p=p->next;j++;}
if(p==NULL)
{printf(“表中没有值为x的结点”);exit(0);}
pre->next=p->next;
free§;
}
// 用尾插法建立单链表
LinkedList LinkedListCreat( )
{ LinkedList L=LinkedListInit(),p,r;
ElemType x;
r=L;
printf(“please input data,input -1 is end\n”);
scanf(”%d”,&x);
while (x!=flag)
{p=(LinkedList)malloc(sizeof(LNode));
p->data=x;
r->next=p;
r=p;
scanf(“%d”,&x);
}
r->next=NULL;
return L;
}
int scan()
{int d;
printf(“please input the operation\n”);
printf(“1.初始化\n”);
printf(“2.清空\n”);
printf(“3.求链表长度\n”);
printf(“4.检查链表是否为空\n”);
printf(“5.遍历链表\n”);
printf(“6.从链表中查找元素\n”);
printf(“7.从链表中查找与给定元素值相同的元素在链表中的位置\n”);
printf(“8.向链表中插入元素\n”);
printf(“9.从链表中删除元素\n”);
printf(“10.尾插法建立单链表\n”);
printf(“其他键退出\n”);
scanf(“%d”,&d);
return(d);
}
main()
{int quit=0;
int i;
ElemType e;
LinkedList L;
while(!quit)
switch(scan())
{case 1:L=LinkedListInit();break;
case 2:LinkedListClear(L);break;
case 3:printf(“the length is%d\n”,LinkedListLength(L));break;
case4:if(LinkedListEmpty(L))printf(“true\n”);else printf(“false\n”);break;
case 5:LinkedListTraverse(L);break;
case 6:printf(“please input the location.\n”);
scanf(“%d”,&i);
printf(“the num.is %d\n”,LinkedListGet(L,i));
break;
case 7:printf(“please input the element.\n”);
scanf(“%d”,&e);
printf(“the location.is %d\n”,LinkedListLocate(L,e));
break;
case 8:printf(“please input the insert location and insert num.\n”);
scanf(“%d%d”,&i,&e);
LinkedListInsert(L,i,e);
break;
case 9:printf(“please input the deleted element.\n”);
scanf(“%d”,&e);
LinkedListDel(L,e);
break;
case 10:L=LinkedListCreat();break;
default:quit=1;}
}

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

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

相关文章

Docker安装Elasticsearch8详细步骤

前面讲了Elasticsearch7的安装步骤&#xff0c;今天讲讲Elasticsearch8的安装&#xff0c;大同小异。 1、配置环境变量 .env 文件设置运行 docker-compose.yml 配置文件时使用的环境变量。 确保使用 ELASTIC_PASSWORD 和 KIBANA_PASSWORD 变量为 elastic 和 kibana_system 用…

Python——函数的参数

1.位置参数 位置参数可以在函数中设置一个或者多个参数&#xff0c;但是必须有对应个数的值传入该函数才能成功调用&#xff0c;例如&#xff1a; def power(x):return x*xprint(powr(5)) 如果传入的值与对应函数设置的位置参数不符合&#xff0c;则会报错&#xff1a; Traceba…

《优化接口设计的思路》系列:第七篇—接口限流策略

系列文章导航 第一篇—接口参数的一些弯弯绕绕 第二篇—接口用户上下文的设计与实现 第三篇—留下用户调用接口的痕迹 第四篇—接口的权限控制 第五篇—接口发生异常如何统一处理 第六篇—接口防抖(防重复提交)的一些方式 第七篇—接口限流策略 本文参考项目源码地址&#xff…

【EAI 006】ChatGPT for Robotics:将 ChatGPT 应用于机器人任务的提示词工程研究

论文标题&#xff1a;ChatGPT for Robotics: Design Principles and Model Abilities 论文作者&#xff1a;Sai Vemprala, Rogerio Bonatti, Arthur Bucker, Ashish Kapoor 作者单位&#xff1a;Scaled Foundations, Microsoft Autonomous Systems and Robotics Research 论文原…

第六站:C++面向对象

面向对象的第一概念:类 类的构成: “类”&#xff0c;是一种特殊的“数据类型”&#xff0c;不是一个具体的数据。 类的设计: 创建一个类: class Human { public://公有的,对外的void eat();//方法,成员函数void sleep();void play();void work();string getName();//获取对内…

元素、物质、原子、分子之间的关系。

问题描述&#xff1a;元素、物质、原子、分子之间的关系。 问题解答&#xff1a; 首先&#xff0c;元素是具有相同核电荷数的同一类原子的总称。例如&#xff0c;氢元素包含所有质子数为1的原子。 其次&#xff0c;物质是由元素组成的。物质可以由单一的元素构成&#xff0c…

【书生·浦语】大模型实战营——第五课作业

教程文档&#xff1a;https://github.com/InternLM/tutorial/blob/vansin-patch-4/lmdeploy/lmdeploy.md#tritonserver-%E6%9C%8D%E5%8A%A1%E4%BD%9C%E4%B8%BA%E5%90%8E%E7%AB%AF 视频链接&#xff1a; 作业&#xff1a; 基础作业 使用如下命令创建conda环境 conda create…

【python入门】day28:记录用户登录日志

演示 代码 #-*- coding:utf-8 -*- print(记录用户登录日志----------------------------) import time def show_info():print(输入提示数字,执行相应操作:0退出,1查看登录日志) def write_logininfo(username):#----------记录日志with open(log.txt,a,encodingutf-8)as file…

基于SSM的网上订餐管理系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

Unity中图片合成图集Editor工具

一般图片合成图集用的是Unity自带的SpriteAtlas类添加一个Sprite集合&#xff0c;而所有图片保存在Sprite集合中&#xff0c;然后把Sprite通过Add方法添加到SpriteAtlas类&#xff0c;通过AssetDatabase.CreateAsset()方法来创建图集。

希尔排序和计数排序

&#x1f4d1;前言 本文主要是【排序】——希尔排序、计数排序的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304;每日一句…

Arduino开发实例-HW-M10 微波雷达运动传感器

HW-M10 微波雷达运动传感器 文章目录 HW-M10 微波雷达运动传感器1、HW-M10 微波雷达运动传感器介绍2、硬件准备及接线3、代码实现1、HW-M10 微波雷达运动传感器介绍 HW-M10 微波传感器模块非常准确,广泛用于报警和安全系统中的运动检测。 该模块与 PIR 模块一样,可以检测任何…

LINUX——动/静态库

加油加油~ 目录&#xff1a; 动/静态库是什么&#xff1f; .o文件是什么&#xff1f; 以gcc编译器为例&#xff0c;查看xxx.i xxx.s xxx.o文件 生成test.i文件(预处理) 生成test.s文件(编译) 生成test.o文件(汇编) 生成可执行程序(链接)&#xff1a; 小结&#xff1a…

Unity与Android交互通信系列(4)

上篇文章我们实现了模块化调用&#xff0c;运用了模块化设计思想和简化了调用流程&#xff0c;本篇文章讲述UnityPlayerActivity类的继承和使用。 在一些深度交互场合&#xff0c;比如Activity切换、程序启动预处理等&#xff0c;这时可能会需要继承Application和UnityPlayerAc…

c++ 开发生态环境、工作流程、生命周期-拾遗

拾遗 1 生态环境初识 当您使用Visual Studio 2019进行C开发时&#xff0c;您将进入C生态环境。以下是一些重要的概念和步骤&#xff1a; C程序的结构&#xff1a; 一个典型的C程序包括源文件&#xff08;.cpp&#xff09;、头文件&#xff08;.h&#xff09;、编译后的目标文…

通过wireshark抓取的流量还原文件(以zip为例)

wireshark打开流量包&#xff0c;通过zip关键字查找 追踪流可查看详细信息 选中media Type右键&#xff0c; 点击导出分组字节流选项 将生成的文件进行命名&#xff0c;需要时什么格式就以什么格式后缀

没有自动化测试项目经验,3个项目帮你走入软测职场!

学习自动化测试最难的是没有合适的项目练习。测试本身既要讲究科学&#xff0c;又有艺术成分&#xff0c;单单学几个 API 的调用很难应付工作中具体的问题。 你得知道什么场景下需要添加显性等待&#xff0c;什么时候元素定位需要写得更加优雅&#xff0c;为什么需要断言这个元…

【Vue3】2-12 : 【案例】搜索关键词加筛选条件的综合

本书目录&#xff1a;点击进入 一、【案例】搜索关键词加筛选条件的综合 1.1、逻辑 1.2、效果 1.3、json数据 - 02-data.json 1.4、代码 一、【案例】搜索关键词加筛选条件的综合 1.1、逻辑 计算属性 - 绑定list&#xff0c;并过滤 input 双向绑定 - 当input改变时&…

Python3.10安装教程

Python3.10安装 Python的安装按照下面几步进行即可&#xff0c;比较简单。 下载Python安装文件&#xff0c;打开Python的下载页面&#xff0c;我这里选择安装的版本是3.10.11&#xff0c;根据自己电脑版本选择对应安装包 安装包下载完毕后&#xff0c;按照步骤开始安装。选择…

PriorityQueue优先队列使用的注意事项

PriorityQueue只保证队列的头和尾是指定序列的两个端点值&#xff0c;不是给它的元素排序了。 所以在使用的时候直接打印 PriorityQueue &#xff0c;或者用 增强for 遍历出来的数据都不是有序的。正确的遍历方式如下&#xff1a; // 按照排序顺序输出 PriorityQueue 中的元素…