数据结构试验报告Word文档格式.docx
- 文档编号:17174391
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:75
- 大小:1.17MB
数据结构试验报告Word文档格式.docx
《数据结构试验报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构试验报告Word文档格式.docx(75页珍藏版)》请在冰豆网上搜索。
(1)找到ai-1的存储位置p(因为在单链表中结点ai的存储地址是在其直接前趋结点ai-1的指针域next中。
(2)令p->
next指向ai的直接后继结点(即把ai从链上摘下)
(3)释放结点ai的空间。
六、实验步骤
1、问题描述;
1)分别利用顺序和链表存储结构实现线性表的存储,并设计出在不同的存储结构中线性表的基本操作算法。
2)在实验过程中,对相同的操作在不同的存储结构下的时间复杂度和空间复杂度进行分析。
2、设计两种存储结构与核心算法描述;
线性表的顺序和链表存储结构为:
。
顺序表:
structsqlist
{elemtypea[maxsize];
intlen;
};
非循环单链表为:
structNode
{
charData;
structNode*Next;
};
classList
private:
Node*Head;
public:
}
2、具体用所选择的语言实现算法为:
#include<
iostream>
usingnamespacestd;
#defineelemtypechar
constintmaxsize=100;
sqlistsetnull(sqlistl)
{l.len=0;
returnl;
sqlistinsert(sqlistl,elemtypex,inti)
{intj;
if(l.len>
maxsize-1)
cout<
<
"
输入溢出"
endl;
elseif(i<
1||i>
l.len+1)
输入错误,超出范围"
else
{for(j=l.len;
j>
=i;
j--)
l.a[j+1]=l.a[j];
l.a[i]=x;
l.len++;
}
sqlistdeletesq(sqlistl,inti,char&
e)
if(i<
l.len)
\t输入错误,超出范围"
else
{e=l.a[i];
for(j=i+1;
j<
=l.len;
j++)
l.a[j-1]=l.a[j];
l.len--;
voidoutput(sqlistl)
cout<
L=:
("
;
for(j=1;
l.a[j];
)"
intchoose(sqlistl)
{inta;
是否返回继续操作?
是[1],否[0]>
cin>
>
a;
returna;
sqlistinputsq(sqlistl)
{intn;
请输入表中元素的个数:
n;
for(intj=1;
=n;
{
输入表中第"
个元素的数值:
}
l.len=n;
intmain()
{
sqlistl;
elemtypex,y,e;
intsel,j;
while
(1)
system("
cls"
);
======================顺序表的基本操作菜单============================"
\t1、在顺序表L的第i个元素之前插入新的元素e。
\t2、在顺序表L中删除第i个元素,并用e返回其值。
\t3、退出操作。
----------------------------------------------------------------------"
请输入选择要执行的编号(1-3):
sel;
switch(sel)
case1:
================插入操作================="
l=inputsq(l);
你输入的顺序表为:
output(l);
请输入要插入的数据:
x;
请输入要插入的位置:
j;
l=insert(l,x,j);
插入后得到的顺序表为:
l=setnull(l);
break;
case2:
================删除操作================="
cout<
请输入要删除的数据位置:
l=deletesq(l,j,e);
删除后得到的顺序表为:
删除的数据为:
e;
case3:
return0;
y=choose(l);
if(y==0)
exit(0);
fflush(stdin);
链表为:
structNode
List();
~List();
voidAddList();
voidInsertData();
voidDeleteData();
voidShowList();
voidfanshow();
List:
:
List()
Head=NULL;
~List()
Node*r=NULL,*p=NULL;
for(p=List:
Head;
p!
=NULL;
p=p->
Next)
r=p;
Next;
deleter;
r=NULL;
voidList:
AddList()
intn=0;
Node*p=NULL,*q=NULL;
"
请输入链表长度:
if(n>
=1)
p=newNode;
输入第1个元素:
p->
Data;
Head=p;
for(inti=1;
i<
i++)
q=p;
输入第"
i+1<
个元素:
q->
Next=p;
p->
Next=NULL;
InsertData()
inti,j=1;
chare;
Node*p=List:
Node*s;
请输入要插入的元素:
i;
while(p&
&
i-1)
++j;
if(j>
i)
return;
s=newNode;
s->
Data=e;
if(i==1)
Next=Head;
Head=s;
else
Next=p->
Next=s;
voidList:
ShowList()
此时链表内容输出为:
L=("
for(Node*p=List:
DeleteData()
chare;
inti;
Head,*delp=NULL,*q;
请输入要删除的元素的位置:
if(List:
Head==NULL)
输入超出范围。
return;
intj=1;
while(p&
i)
{q=p;
}
e=p->
if(i!
{
free(p);
{e=Head->
Head=Head->
你所删除的数据为:
e<
return;
}
intmain()
inty,sel;
ListL;
L.~List();
=======================链表的基本操作(菜单)========================"
\t1、在链表L的第i个元素之前插入新的元素e."
\t2、在链表L中删除第i个元素,并用e返回其值."
\t3、退出程序."
==================================================================="
选择要执行的编号(1-3):
case1:
L.AddList();
L.ShowList();
cout<
L.InsertData();
case2:
L.DeleteData();
case3:
是<
1>
,否<
0>
y;
exit(0);
七、测试数据和分析
1、插入操作:
输入数据:
L=()ListInsert(L,1,'
k'
),
正确结果:
L=(k)
顺序表的操作实现:
非循环单链表操作实现:
L=(EHIKMOP)ListInsert(L,9,'
t'
),
returnERROR;
L=(EHIKMOP)
L=(ABCEHKNPQTU)ListInsert(L,4,'
u'
L=(ABCuEHKNPQTU)
2、删除操作:
L=()ListDelete(L,1,e)
ERROR,L=()
L=(DEFILMNORU)ListDelete_Sq(L,5,e)
L=(DEFIMNORU),e='
L'
L=(CD)ListDelete_Sq(L,1,e)
L=(D),e='
C'
3、如线性表有n个结点,对两种存储结构下插入和删除的时间复杂度进行分析。
八、思考题
1、如何实现链表的逆置算法?
具体算法如下所示:
ListNode*reverseList(ListNode*head)
ListNode*p1,*p2,*p3;
if(head==NULL||head->
next==NULL)
returnhead;
p1=head;
p2=head->
next;
while(p2!
=NULL)
p3=p2->
p2->
next=p1;
p1=p2;
p2=p3;
head->
next=NULL;
head=p1;
九、实验总结感想:
这次实验因为是以前仔细的看过书所以做的比较好,也比较简单,总的来说就是在链表的实验时的删除操作比较麻烦,有些不好做,自己做删除的时候总是要好久的感觉,不知道因为什么。
这次实验是个给自己自信的机会。
说道改进其实也不知道还能有什么再好一点的,删除插入好像就这样了吧,自己就可以做的这个程度了。
计算机科学与技术091栈和队列
深入了解栈和队列的特性,学会在实际问题下灵活运用它们。
表达式求值运算是实现程序设计语言的基本问题之一,也是栈应用的一个典型例子。
设计并演示用算符优先级对算术表达式的求解过程。
1、算法优先级别如下:
'
+'
'
-'
*'
/'
('
)'
#'
'
='
2、以字符序列的形式从终端输入语法正确、不含变量的算术表达式,利用给出的算符优先级关系,实现对算术四则混合运算的求解过程。
3、根据给出的算符优先级,设置运算符栈和运算数栈;
4、在读入表达式的同时,完成运算符和运算数的识别处理,并将运算数的字符序列形式转换成整数形式,并进行相应的运算;
选择栈作为数据结构,所以所有操作都要围绕栈的特点来进行。
因为先入栈而被压在下面的意味着要后处理,所以优先级低的不能压着优先级高的而入栈。
对于同级的操作符,因为要按照从左往右的运算规则,所以也不能压着同级的操作符而入栈。
简单来说,与栈顶的操作符比较,优先级高的则入栈,否则操作符出栈作相应运算。
本算法使用两个栈,一个用来存放操作符,一个用来存放操作数和运算的结果。
1、问题描述:
1)以字符序列的形式从终端输入语法正确、不含变量的算术表达式,利用给出的算符优先级关系,实现对算术四则混合运算的求解过程。
2)根据给出的算符优先级,设置运算符栈和运算数栈;
3)在读入表达式的同时,完成运算符和运算数的识别处理,并将运算数的字符序列形式转换成整数形式,并进行相应的运算;
【实验程序代码具体分析如下:
】。
//////////////////main.cpp/////////////////
//#include"
queue.h"
#include"
stack.h"
#include<
string>
stdlib.h>
voidface()
*===============================================*\n"
<
欢迎来到(栈,队列)表达式求值\n\n"
输入的表达式以=为结束\n"
/*****判断运算符的优先级*****/
intpriority(charch)
switch(ch)
case'
return0;
break;
return1;
return2;
return-1;
/*****将中缀表达式转为后缀表达式放在Q里面*****/
voidinorderexp(Queue*Q,charstr[20])
StackS1,*S,S2;
//S1栈用来辅助放运算符得到后缀表达式
//S2用来演示在得到后缀表达式过程中操作符在栈中的变化
\n-----------------"
\n操作符栈的变化:
charch,ch1;
stringstr1="
S=&
S1;
S->
push('
S2=S1;
while(!
S2.empty())
S2.top(ch);
S2.pop();
ch<
for(inti=0;
i++)
doublem3;
switch(str[i])
.'
0'
1'
2'
case'
3'
4'
5'
6'
7'
8'
9'
str1=str1+str[i];
m3=atof(str1.c_str());
i++;
if(str[i]=='
||str[i]=='
)
//当遇到了操作符或者括号是才进队列,否则继续读
{
i--;
Q->
append(m3);
str1="
break;
}
else
i--;
break;
}
S->
push(str[i]);
S2=S1;
while(!
ch;
break
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 试验报告