数据结构实验2文档格式.docx
- 文档编号:22366437
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:25
- 大小:20.80KB
数据结构实验2文档格式.docx
《数据结构实验2文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构实验2文档格式.docx(25页珍藏版)》请在冰豆网上搜索。
三、算法思想和时间复杂度
当我们要在线性表的顺序存储结构上的第i个位置上插入一个元素时,必须先将线性表的第i个元素之后的所有元素依次后移一个位置,以便腾空一个位置,再把新元素插入到该位置。
若要删除第i个元素时,也必须把第i个元素之后的所有元素前移一个位置。
四、参考代码
1.顺序表的存储结构和操作接口
SeqList.h声明类SeqList,文件名为SeqList.h
#ifndefSeqList_H
#defineSeqList_H
constintMaxSize=100;
//100只是示例性的数据,可以根据实际问题具体定义
template<
classT>
//定义模板类SeqList
classSeqList
{
public:
SeqList();
//无参构造函数
SeqList(Ta[],intn);
//有参构造函数
~SeqList();
//析构函数为空
intLength();
//求线性表的长度
TGet(inti);
//按位查找,取线性表的第i个元素
intLocate(Tx);
//按值查找,求线性表中值为x的元素序号
voidInsert(inti,Tx);
//在线性表中第i个位置插入值为x的元素
TDelete(inti);
//删除线性表的第i个元素
voidPrintList();
//遍历线性表,按序号依次输出各元素
private:
Tdata[MaxSize];
//存放数据元素的数组
intlength;
//线性表的长度
};
#endif
2.顺序表操作的实现
//SeqList.cpp
#include"
SeqList.h"
/*
*前置条件:
顺序表不存在
*输入:
无
*功能:
构建一个顺序表
*输出:
*后置条件:
*/
SeqList<
T>
:
SeqList()
length=0;
}
顺序表信息的数组形式a[],顺序表长度n
将数组a[]中元素建为长度为n的顺序表
SeqList(Ta[],intn)
if(n>
MaxSize)throw"
参数非法"
;
for(inti=0;
i<
n;
i++)
data[i]=a[i];
length=n;
~SeqList()
顺序表存在
插入元素x,插入位置i
将元素x插入到顺序表中位置i处
顺序表插入新元素
voidSeqList<
Insert(inti,Tx)
{
intj;
if(length>
=MaxSize)throw"
上溢"
if(i<
1||i>
length+1)throw"
位置"
for(j=length;
j>
=i;
j--)
data[j]=data[j-1];
//注意第j个元素存在数组下标为j-1处
data[i-1]=x;
length++;
要删除元素位置i
删除顺序表中位置为i的元素
顺序表删除元素
TSeqList<
Delete(inti)
intx,j;
if(length==0)throw"
下溢"
length)throw"
x=data[i-1];
for(j=i;
j<
length;
j++)
data[j-1]=data[j];
//注意此处j已经是元素所在的数组下标
length--;
returnx;
输出顺序表长度
顺序表长度
顺序表不变
intSeqList<
Length()
returnlength;
查询元素位置i
查找位置为i的元素并输出值
查询元素的值
Get(inti)
1&
&
i>
查找位置非法"
elsereturndata[i-1];
查询元素值x
按值查找值的元素并输出位置
查询元素的位置
Locate(Tx)
i++)
if(data[i]==x)
returni+1;
//下标为i的元素等于x,返回其序号i+1
return0;
//退出循环,说明查找失败
顺序表遍历
输出所有元素
PrintList()
for(inti=0;
i<
i++)
cout<
<
data[i]<
endl;
3.顺序表的调试运行
//SeQListMain.cpp
#include<
iostream.h>
//引用输入输出流库函数的头文件
SeqList.cpp"
//引用顺序表类SeqList
voidmain()
SeqList<
int>
a;
//创建一个空的顺序表
"
执行插入操作:
try
{
a.Insert(1,1);
a.Insert(2,3);
a.Insert(3,4);
}
catch(char*wrong)
cout<
wrong;
//如失败提示失败信息
已经插入“1,3,4”"
顺序表a的长度为:
a.Length()<
//返回单链表长度
按位查询第二个元素:
第二个元素为:
a.Get
(2)<
//查找顺序表中第二个元素
按值查询3:
值为3的元素位置为:
a.Locate(3)<
//查找元素3,并返回在单链表中位置
if(a.Length()){
执行删除第一个元素操作:
a.Delete
(1);
//删除元素1
已删除成功,顺序表a的长度为:
else{
顺序表a长度为0"
顺序表a中的元素有:
a.PrintList();
//输出所有元素
intr[]={1,2,3,4,5};
SeqList<
b(r,5);
//根据数组创建顺序表
执行插入操作前顺序表b为:
b.PrintList();
//输出顺序表所有元素
插入前顺序表b的长度为:
b.Length()<
b.Insert(3,8);
执行插入操作后顺序表b为:
//输出顺序表b所有元素
插入后顺序表b的长度为:
b.Delete
(1);
//删除b中第一个元素
已删除成功,顺序表b的长度为:
顺序表b长度为0"
实验二单链表的存储与操作
2.理解单链表的存储结构特点,掌握单链表的存储分配要点;
3.掌握单链表的基本操作及实现,并能正确分析其时间复杂度。
1.定义单链表的存储结构;
2.单链表的基本操作
(1)初始化单链表(无参和有参);
(2)求单链表长度;
(7)遍历单链表;
(8)销毁单链表。
1.按位置/值查找:
顺序查找,平均时间复杂度为O(n);
2.在位置i插入一个数据元素:
在序号为i-1的结点后插入结点,平均时间复杂度为O(n);
3.删除位置i的数据元素:
删除序号为i-1结点的后继结点,平均时间复杂度为O(n);
4.初始化单链表(有参):
有前插法和尾插法(注意单链表的逻辑关系应与参数数组保持一致),时间复杂度为O(n);
5.遍历单链表、求单链表长度、销毁单链表:
顺序处理,时间复杂度为O(n)。
1.单链表的存储结构和操作接口
//LinkList.h声明类LinkList
#ifndefLinkList_H
#defineLinkList_H
structNode
Tdata;
Node<
*next;
//此处<
也可以省略
classLinkList
public:
LinkList();
//建立只有头结点的空链表
LinkList(Ta[],intn);
//建立有n个元素的单链表
~LinkList();
//析构函数
//求单链表的长度
//取单链表中第i个结点的元素值
//求单链表中值为x的元素序号
//在单链表中第i个位置插入元素值为x的结点
//在单链表中删除第i个结点
voidPrintList();
//遍历单链表,按序号依次输出各元素
private:
*first;
//单链表的头指针
2.单链表操作的实现
//LinkList.cpp
LinkList.h"
单链表不存在
构建一个单链表
LinkList<
LinkList()
first=newNode<
first->
next=NULL;
顺序表信息的数组形式a[],单链表长度n
将数组a[]中元素建为长度为n的单链表
LinkList(Ta[],intn)
//生成头结点
*r,*s;
r=first;
//尾指针初始化
{
s=newNode<
s->
data=a[i];
//为每个数组元素建立一个结点
r->
next=s;
r=s;
//插入到终端结点之后
//单链表建立完毕,将终端结点的指针域置空
~LinkList()
单链表存在
按位查找位置为i的元素并输出值
单链表不变
TLinkList<
Get(inti)
*p;
intj;
p=first->
next;
j=1;
//或p=first;
j=0;
while(p&
i)
p=p->
//工作指针p后移
j++;
if(!
p)throw"
elsereturnp->
data;
intLinkList<
if(p&
p->
next){
while(p->
data!
=x)
p=p->
returnj;
elsethrow"
将元素x插入到单链表中位置i处
单链表插入新元素
voidLinkList<
p=first;
//工作指针p初始化
i-1)
else{
*s;
data=x;
//向内存申请一个结点s,其数据域为x
next=p->
//将结点s插入到结点p之后
p->
输出单链表长度
单链表长度
Length()
Node<
*p=first->
inti=0;
while(p)
p=p->
i++;
returni;
删除单链表中位置为i的元素
单链表删除元素
i-1)//查找第i-1个结点
p||!
next)throw"
//结点p不存在或结点p的后继结点不存在
else{
Node<
*q;
intx;
q=p->
x=q->
//暂存被删结点
next=q->
//摘链
deleteq;
单链表遍历
PrintList()
while(p)
data<
3.调试运行
//LinkListMain.cpp
LinkList.cpp"
//引用单链表的类
LinkList<
a;
a.Insert(1,4);
a.Insert(2,5);
a.Insert(3,6);
已经插入“4,5,6”"
单链表a的长度为:
单链表a的元素为:
//显示链表中所有元素
按位查找第二个元素:
//查找链表中第二个元素
按值查找5"
值为5的元素位置为:
a.Locate(5)<
//查找元素5,并返回在单链表中位置
执行删除4的操作"
//删除元素4
已删除成功,单链表a的长度为"
链表a中的元素为:
intr[]={1,2,3,4,5};
//根据数组创建单链表
执行插入操作前单链表b为:
//输出单链表所有元素
插入前单链表b的长度为:
执行插入操作后单链表b为:
//输出单链表b所有元素
插入后单链表b的长度为:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验