数据结构与算法实验报告各种算法都有Word文档格式.docx
- 文档编号:17322610
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:50
- 大小:514.33KB
数据结构与算法实验报告各种算法都有Word文档格式.docx
《数据结构与算法实验报告各种算法都有Word文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构与算法实验报告各种算法都有Word文档格式.docx(50页珍藏版)》请在冰豆网上搜索。
参数非法!
return(0);
elseif(n==0)
L[0]=x;
n=n+1;
插入成功!
插入后线性表为:
"
PrintSList(L);
return
(1);
else
{
for(j=n;
j>
=i;
j--)
L[j]=L[j-1];
L[j]=x;
}
}
intDeleteSList(int*L,inti)
{/*在顺序存储结构的线性表L中删除第i个元素*/
intj,y;
if(n==0)
线性表是空表!
elseif(i<
n)
"
y=L[i-1];
for(j=i-1;
j<
n-1;
j++)
L[j]=L[j+1];
n=n-1;
删除成功!
删除后的线性表为:
return(y);
voidPrintSList(int*L)
{
线性表为空。
else
for(j=0;
j<
n;
j++)
printf("
%d"
L[j]);
voidcaidan()
{
intL[MAX],i,x,temp,a;
while
(1)
{
请选择操作\n"
\t1、插入元素\n"
\t2、删除元素\n"
\t3、退出\n"
scanf("
%d"
&
a);
getchar();
switch(a)
{
case1:
请输入要在哪个位置之前插入和要插入的元素(i,x):
\n"
scanf("
%d,%d"
i,&
x);
InsertSList(L,i,x);
break;
case2:
请输入要删除第几个元素:
i);
temp=DeleteSList(L,i);
case3:
return;
default:
请重新输入!
continue;
}
结果:
实验二堆栈(Stack)操作
1、实验目的
堆栈及其操作可以说是计算机系统利用率最高的数据结构与算法了,在算法(程序)设
计里经常用到。
本实验的目的就是要求熟练地掌握堆栈的定义、压栈操作、出栈操作等。
2、实验内容与要求
在认真阅读下列算法的基础上,要求用C/C++语言完成算法的实现,也就是写出其源程
序,并运行程序,给出测试结果。
#defineMAXN10
intpush(int*stack,intmaxn,int*toppt,intx)
{
if(*toppt>
=maxn)
return1;
stack[*toppt]=x;
++(*toppt);
return0;
intpop(int*stack,int*toppt,int*cp)
if(*toppt==0)
--(*toppt);
*cp=stack[*toppt];
voidOutputStack(int*stack,inttoppt)
inti;
for(i=toppt-1;
i>
=0;
i--)
stack[i]);
printf("
voidmain()
ints[MAXN],i;
inttop=0;
intop;
请选择操作,1:
进栈2:
出栈0:
退出\n"
fflush(stdin);
op);
switch(op)
case0:
return;
case1:
printf("
请输入进栈元素:
scanf("
if(push(s,MAXN,&
top,i)==0)
{
printf("
进栈成功,栈内元素为:
OutputStack(s,top);
}
else
栈满\n"
break;
case2:
if(pop(s,&
top,&
i)==0)
出栈元素为:
[%d],栈内元素为:
i);
栈空\n"
若一个程序使用多个栈时,往往事先难以估计每个栈所需容量,在实际应用中一个栈发
生“上溢”,其它栈可能还留有很多空间,可以用移动元素的方法加以调整,以达到多个栈
共享存储空间的目的。
例如,当有两个栈共享大小为SMAX的内存空间时,可以把两个栈的栈底分别设在给定内存空间的两端,然后各自向中间伸展,仅当两个栈顶相遇时才产生溢出。
这种分配方法,在每个栈的动态变化过程中,使任何一个栈的可利用的最大空间均有可能超过m/2,这不仅增加了内存空间的利用率,而且也减少每个栈溢出的可能性。
试分别写出这两个栈的操作算法与程序。
malloc.h>
#defineMAX10
structStacknode
int*node1;
int*node2;
int*top1;
int*top2;
intsize;
};
intInitstack(Stacknode&
s)//构造一个空的顺序栈s
if((s.node1=(int*)malloc(MAX*sizeof(int)))==NULL)
申请内存错误!
return0;
s.top1=s.node1+1;
s.size=MAX;
s.node2=s.node1+s.size;
s.top2=s.node2-1;
return1;
intempty(Stacknode&
s,inti)//判断栈是否为空
if(i==1&
&
s.top1==s.node1+1||i==2&
s.top2==s.node2-1)
elsereturn0;
intfull(Stacknode&
s)//判断栈是否已经满
if(s.top1==s.top2)return1;
intpush(Stacknode&
s,inti,intx)//入栈
if(full(s)){printf("
栈满/n"
else{
if(i==1){printf("
插入操作成功!
\n\n"
*s.top1++=x;
if(i==2){printf("
*s.top2--=x;
}return1;
intpop(Stacknode&
s,inti,int&
x)//出栈
if(empty(s,i))return0;
出栈成功!
x=*--s.top1;
x=*++s.top2;
intputout(Stacknodes)//输出
if(s.top1-1>
s.node1)
栈1元素:
while(s.top1-1>
{s.node1++;
%d\t"
*s.node1);
if(s.top2+1<
s.node2)
栈2元素:
while(s.top2+1<
{s.node2--;
*s.node2);
voidmenue()//菜单界面
****************************************\n"
\t请你选择所需要的操作\n"
\t1-入栈\n\t2-出栈\n"
\t3-输出\n\t4-退出\n"
intc,x,i;
Stacknodes;
Initstack(s);
while(c!
=4)
menue();
c);
switch(c)
//入栈
请输入插入元素的值!
/n选择插入哪个栈顶!
(1||2):
push(s,i,x);
//出栈
请选择出栈元素所在的栈(1||2):
if(empty(s,i)){printf("
此栈空!
break;
else{
pop(s,i,x);
%d\n"
x);
}
putout(s);
break;
case4:
程序结束\n"
错误操作\n"
}
实验三循环队列的实现
队列也是一种非常常用的数据结构。
本实验要求学生熟练地掌握循环队列的插入与删除
操作,并在计算机上实现。
#defineMAX11
intEnQueue(int*queue,intmax,int*head,int*tail,intx)
if((*tail+1)%max==*head)
*tail=(*tail+1)%max;
queue[*tail]=x;
intDeQueue(int*queue,intmax,int*head,int*tail,int*cp)
if(*head==*tail)
*head=(*head+1)%max;
*cp=queue[*head];
voidOutQueue(int*queue,intmax,inth,intt)
while(h!
=t)
h=(h+1)%max;
queue[h]);
intq[MAX];
intq_h=0,q_t=0;
intop,i;
请选择操作,1:
进队,2:
出队,0:
退出"
case0:
请输入进队元素:
if(EnQueue(q,MAX,&
q_h,&
q_t,i)!
=0)
队列满!
else
{
入队成功,队内元素为:
OutQueue(q,MAX,q_h,q_t);
}
if(DeQueue(q,MAX,&
q_t,&
出队元素为:
[%d],队内元素为:
OutQueue(q,MAX,q_h,q_t);
队空!
实验四链式存储结构线性表的操作
链式存储结构的线性表的操作相对复杂一些,主要涉及指针的运用,这是很多学生感觉
有些困难的地方。
本实验就是针对该难点,要求学生掌握链表的构造、链表的插入和删除算
法。
并且要求链表操作算法具有较好的通用性。
二、实验内容
#include<
stdlib.h>
#defineOK1
#defineERROR0
typedefintElemType;
typedefstructNode
ElemTypedata;
structNode*next;
}Node,*LinkList;
//2.以下是菜单选择函数
intmenu_select()
intsn;
主菜单\n"
*********************\n"
1.单链表的建立\n"
2.单链表的结点的删除\n"
3.单链表的输出\n"
0.退出\n"
请选择0---3:
for(;
;
)
scanf("
sn);
if(sn<
0||sn>
3)
\n\t输入错误,重选?
0---3:
break;
returnsn;
voidInitList(LinkList*L)
*L=(LinkList)malloc(sizeof(Node));
(*L)->
next=NULL;
/*voidInitList(LinkListL)
L=(LinkList)malloc(sizeof(Node));
L->
}*/
//3.通过键盘输入链表中元素值,利用头插法建单链表L。
intCreateFromHead(LinkListL)
Node*s;
intc;
intflag=1;
L->
while(flag)
%d,"
if(c!
s=(Node*)malloc(sizeof(Node));
s->
data=c;
next=L->
next;
L->
next=s;
elseflag=0;
returnOK;
//4.在带头结点的单链表L中删除第i个元素。
intDelList(LinkListL,inti)
Node*pre,*r;
intk;
pre=L;
k=0;
while(pre->
next!
=NULL&
k<
i-1)
pre=pre->
k=k+1;
if(!
(pre->
next))
DELETETHELOCATIONISNOTRIGHTFULL"
returnERROR;
r=pre->
pre->
next=pre->
next->
free(r);
returnOK;
//5.输出链表中的值。
voidoutput(LinkListL)
{Node*p;
p=L->
while(p!
=NULL)
%d"
p->
data);
p=p->
return;
//6.主控菜单处理调试程序。
LinkListL;
InitList(&
L);
){
switch(menu_select())
case1:
\n单链表的建立"
请输入链表中结点的值(如:
1,2,3,.....10,0isend):
CreateFromHead(L);
链表结点的删除\n"
请输入被删除结点的序号i:
DelList(L,i);
输出链表中结点的值:
output(L);
再见\n"
return;
}//switch
用链表实现栈
#include<
#defineDataTypeint
#defineMAXSIZE1024
typedefstruct{
DataTypedata[MAXSIZE];
inttop;
}SeqStack;
//栈初始化
SeqStack*Init_SeqStack(){
SeqStack*s;
s=(SeqStack*)malloc(sizeof(SeqStack));
s){
空间不足\n"
returnNULL;
top=-1;
returns;
//判栈空
intEmpty_SeqStack(SeqStack*s){
if(s->
top==-1)
intPush_SeqStack(SeqStack*s,DataTypex){
top==MAXSIZE-1)
//栈满不能入栈
top++;
data[s->
top]=x;
intPop_SeqStack(SeqStack*s,DataType*x){
if(Empty_SeqStack(s))
//栈空不能出栈
*x=s->
top];
top--;
}//栈顶元素存入*x,返回
//取栈顶元素
DataTypeTop_SeqStack(SeqStack*s){
//栈空
returns->
data[s
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 算法 实验 报告 各种