实验报告一顺序表.docx
《实验报告一顺序表.docx》由会员分享,可在线阅读,更多相关《实验报告一顺序表.docx(20页珍藏版)》请在冰豆网上搜索。
![实验报告一顺序表.docx](https://file1.bdocx.com/fileroot1/2023-7/19/2480a229-46ea-435a-b672-1842b4707fd7/2480a229-46ea-435a-b672-1842b4707fd71.gif)
实验报告一顺序表
完成人:
朱荣(程序员、测试员、文档员)113200980300006
陈森来(程序员、测试员、文档员)113200980300007
邓兵超(程序员、测试员、文档员)113200980300023
熊余(程序员、测试员、文档员)113200980300030
实验题目
实验一线性结构(综合性实验3学时)
实验目的
本次实习的主要目的在于熟悉线性表的基本运算在两种存储结构上的实现,其中以熟悉各种链表的操作为侧重点。
通过本次实习还可复习高级语言的使用方法。
必做题:
1、顺序线性表的插入、删除、输出元素程序。
算法设计思路
插入算法:
intInsert_SeqList(SeqList*L,inti,DataTypex)//顺序表的插入算法
{
cout<<"把元素"<intj;
if(L->SeqLength==MAXSIZE-1)//数组长度等于设定值-1,则表满
{
cout<<"表满"<return-1;
}
if(i<1||i>L->SeqLength+1)//插入位置在第一个之前,或者插入到大于当前数组的长度+1
{
cout<<"位置错"<return0;
}
for(j=L->SeqLength-1;j>=i;j--)//i之后全部后移
{
L->data[j+1]=L->data[j];
}
L->data[i]=x;//将元素填充到空白位置
L->SeqLength++;
cout<<"插入成功"<Display_SeqList(L);
return1;
}.
顺序表的删除算法:
intDelete_SeqList(SeqList*L,inti){
cout<<"将位置为"<
intj;
if(i<1||i>L->SeqLength)
{
cout<<"不存在第"<
return0;
}
for(j=i;j<=L->SeqLength-1;j++)
{
L->data[j]=L->data[j+1];//i索引之后全部前移
}
L->SeqLength--;
cout<<"删除成功"<Display_SeqList(L);
return1;
}
顺序表的输出算法:
voidDisplay_SeqList(SeqList*L){
cout<<"顺序表中储存的元素为"<inti;
for(i=0;i<=L->SeqLength-1;i++)
{
cout<data[i]<<"";
}
cout<}
编写代码,调试运行
【Sequence.h】
#include
usingnamespacestd;
#defineMAXSIZE15
typedefintDataType;
typedefstruct
{
DataTypedata[MAXSIZE];//通常用一位数组来描述顺序表的数据存储
intSeqLength;/*线性表长度*/
}SeqList;
SeqList*Init_SeqList();//初始化顺序表
voidDefine_SeqList(SeqList*L,intn);//填充顺序表的内容
voidDisplay_SeqList(SeqList*L);//提取顺序表中的元素
intInsert_SeqList(SeqList*L,inti,DataTypex);//添加元素到指定位置(从开始)
intDelete_SeqList(SeqList*L,inti);//删除指定位置的元素(从开始)
【Sequence.cpp】
#include"Sequence.h"
#include
usingnamespacestd;
SeqList*Init_SeqList()//顺序表的初始化算法,将顺序表清空
{
SeqList*L;
L=newSeqList;
L->SeqLength=0;/*长度置为-1*/
returnL;
}
//顺序表的定义算法
voidDefine_SeqList(SeqList*L,intn)
{
cout<<"请依次输入顺序表中要储存的元素:
"<for(inti=0;i{
cin>>L->data[i];//输入数组元素
L->SeqLength++;
}
}
//顺序表的输出算法
voidDisplay_SeqList(SeqList*L){
cout<<"顺序表中储存的元素为"<inti;
for(i=0;i<=L->SeqLength-1;i++)
{
cout<data[i]<<"";
}
cout<}
//顺序表的插入算法
intInsert_SeqList(SeqList*L,inti,DataTypex){
cout<<"把元素"<intj;
if(L->SeqLength==MAXSIZE-1)//数组长度等于设定值-1,则表满
{
cout<<"表满"<return-1;
}
if(i<1||i>L->SeqLength+1)//插入位置在第一个之前,或者插入到大于当前数组的长度+1
{
cout<<"位置错"<intIs,Id;
cout<<"请重新输入数据^_^:
"<cin>>Is;
cout<<"请重新输入插入的位置^_^:
"<cin>>Id;
Insert_SeqList(L,Id,Is);//顺序表的插入
}
for(j=L->SeqLength-1;j>=i;j--)//i之后全部后移
{
L->data[j+1]=L->data[j];
}
L->data[i]=x;//将元素填充到空白位置
L->SeqLength++;
cout<<"插入成功"<Display_SeqList(L);
return1;
}
//顺序表的删除算法
intDelete_SeqList(SeqList*L,inti){
cout<<"将位置为"<
intj;
if(i<1||i>L->SeqLength)
{
cout<<"不存在第"<
intDd;
cout<<"请重新输入要删除数据的位置^_^:
"<cin>>Dd;
Delete_SeqList(L,Dd);//顺序表的删除
}
for(j=i;j<=L->SeqLength-1;j++)
{
L->data[j]=L->data[j+1];//i索引之后全部前移
}
L->SeqLength--;
cout<<"删除成功"<Display_SeqList(L);
return1;
}
【Test_Sequence.cpp】
#include"Sequence.h"
#include
usingnamespacestd;
intmain()
{
intSl,Is,Id,Dd;
SeqList*L;//顺序表的定义
L=Init_SeqList();//顺序表的初始化
cout<<"请定义线性表的长度:
"<cin>>Sl;
Define_SeqList(L,Sl);//定义顺序表
Display_SeqList(L);//顺序表的输出
cout<<"请输入插入线性表的数据:
"<cin>>Is;
cout<<"请输入该数据插入线性表的位置:
"<cin>>Id;
Insert_SeqList(L,Id,Is);//顺序表的插入
cout<<"请输入要删除数据的位置:
"<cin>>Dd;
Delete_SeqList(L,Dd);//顺序表的删除
return0;
}
运行结果:
必做题:
2、带头结点的单链表的插入、删除、输出元素程序。
写出算法设计思路。
插入删除的位置,建立结点指针,移动指针到要插入删除的节点的前一节点,对其进行插入删除操作。
最后顺序输出元素。
一、编写代码,调试运行,实现题目要求
2题(代码)
#include
usingnamespacestd;
typedefstructlinklist
{
intdata;
structlinklist*next;
}LinkList;
//尾插入节点方式建链式线性表
voidCreateList(LinkList*&sl)
{
LinkList*s,*r;
inti;
intn;
intlistdata;
sl=(LinkList*)malloc(sizeof(LinkList));
r=sl;
cout<<"请输入链式线性表节点的个数:
";
cin>>n;
cout<<"请输入节点(整形数):
";
for(i=0;i{
cin>>listdata;
s=(LinkList*)malloc(sizeof(LinkList));
s->data=listdata;
r->next=s;
r=s;
}
r->next=NULL;
}
//求解线性表的长度
intGetLength(LinkList*sl)
{
inti=0;
LinkList*p=sl->next;
while(p!
=NULL)
{
i++;
p=p->next;
}
returni;
}
//删除元素,位置不合法返回0,合法且完成操作返回1
intDeleElem(LinkList*&sl,inti)
{
if(i<1||i>GetLength(sl))
return0;
LinkList*p,*q;
intj=1;
p=sl;
while(j
{
p=p->next;
j++;//p指向删除节点的前一个节点
}
q=p->next;
p->next=q->next;
free(q);
return1;
}
//插入元素,位置不合法返回0,合法且完成操作返回1
intInsElem(LinkList*&sl,intx,inti)
{
if(i<1||i>GetLength(sl)+1)
return0;
LinkList*p,*s;
s=(LinkList*)malloc(sizeof(LinkList));
s->data=x;
s->next=NULL;
intj=1;
p=sl;
while(j
{
p=p->next;
j++;
}
s->next=p->next;
p->next=s;
return1;
}
//输出线性表的元素
voidDispElem(LinkList*sl)
{
LinkList*p=sl->next;
while(p!
=NULL)
{
cout<data<<"";
p=p->next;
}
cout<}
//main
intmain()
{
LinkList*sl;
cout<<"建链式表:
"<CreateList(sl);
cout<<"链式表的元素如下:
";
DispElem(sl);
cout<<"插入一个元素:
";
cout<intx,i;
cout<<"插入的元素为:
";
cin>>x;
cout<<"插入的位置为:
";
cin>>i;
if(InsElem(sl,x,i))
{
cout<<"插入操作完成后链式表的元素如下:
";
cout<DispElem(sl);
}
else
cout<<"ERROR!
"<cout<<"删除一个元素:
";
cout<intj;
cout<<"删除的位置:
";
cin>>j;
if(DeleElem(sl,j))
{
cout<<"删除操作完成后链式表的元素如下:
"<DispElem(sl);
}
else
cout<<"ERROR!
"<return0;
}
测试数据
运行结果如下:
(插入位置删除位置均合法)
运行结果(插入位置删除位置均不合法):
选做题:
[问题描述]约瑟夫(Joeph)问题的一种描述是:
编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。
一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。
报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。
试设计一个程序求出出列顺序。
[基本要求]利用单向循环链表存储结构模拟此过程,按照出列的顺序印出各人的编号。
二、写出算法设计思路。
建立不带头结点的循环单链表,其节点包含三个数据项:
data(密码),num(序号),next(指向下一结点的指针),依据m值移动指针到出列者,输出序号,取出密码,删除该节点节点,以密码作为下一次循环m值,循环上述过程,知道单链表为空的。
三、编写代码,调试运行,实现题目要求
选做题(代码)
#include
usingnamespacestd;
typedefstructlinklist
{
structlinklist*next;
intnum;
intdata;
}LinkList;
//建不带头结点的循环链表
voidCreateList(LinkList*&sl,intn)
{
LinkList*rear;
LinkList*s;
intldata,i;
if(n>0)
{
cin>>ldata;
sl=(LinkList*)malloc(sizeof(LinkList));//sl为第一个节点,采用尾插入式建立单链表
sl->data=ldata;
sl->num=1;
rear=sl;
for(i=2;i<=n;i++)
{
s=(LinkList*)malloc(sizeof(LinkList));
cin>>ldata;
s->data=ldata;
s->num=i;
rear->next=s;
rear=s;
}
rear->next=sl;
}
else
sl=NULL;
}
//删除节点
LinkList*DeletElem(LinkList*&sl,inti)
{
intj=1;
LinkList*p,*q;
p=sl;
while(j
{
p=p->next;//指向删除的节点
j++;
}
cout<num<<"";
q=p->next;
while(q->next->num!
=p->num)
{
q=q->next;//找到前驱节点
}
q->next=p->next;
returnp;
}
intmain()
{
intn;
cout<<"请输入人数n:
";
cin>>n;
cout<";
LinkList*sl;
CreateList(sl,n);
intm;
cout<<"输入上限值m:
";
cin>>m;
cout<";
LinkList*p,*q;
q=sl;
for(inti=0;i{
p=DeletElem(q,m);
m=p->data;
q=p->next;
free(p);
}
cout<return0;
}
[测试数据]
m的初值为20;密码:
3,1,7,2,4,8,4(正确的结果应为6,1,4,7,2,3,5)
运行结果
m的初值为2;密码:
2536(正确的结果应为2431)
运行结果如下
四、写出算法设计、编程和调试运行的体会。
一般建立带头结点的循环单链表时操作插入删除等操作较为容易,但考虑到本题目描述与不带头结点的单链表相识,故选择用单链表。
题目为简单的模拟题,熟悉对单链表插入等操作。