线性表的建立与应用实验报告.docx
《线性表的建立与应用实验报告.docx》由会员分享,可在线阅读,更多相关《线性表的建立与应用实验报告.docx(16页珍藏版)》请在冰豆网上搜索。
![线性表的建立与应用实验报告.docx](https://file1.bdocx.com/fileroot1/2023-2/28/6e880e72-ebd2-4541-9315-0a8594753a34/6e880e72-ebd2-4541-9315-0a8594753a341.gif)
线性表的建立与应用实验报告
实验报告
课程名称数据结构实验
实验名称线性表的建立与应用
实验类型设计型
实验地点实验日期
指导教师杨崇
专业
班级
学号
姓名
成绩
辽宁石油化工大学计算机与通信工程学院
实验一
一实验目的:
通过实验,了解并掌握线性表逻辑特性和物理特性,了解并掌握队列和栈的运算方法,培养结合理论知识进行实际应用的实践能力。
二实验内容:
栈和队列的初始化及基本运算的实现,实现栈和队列的初始化、栈的入栈、退栈操作、队列的入队、退队运算,以及将退栈结果入队、退队结果入栈等基本操作。
三实验原理:
栈是限制在线性表的一端进行插入和删除的线性表。
允许插入、删除的这一端称为栈顶,另一个固定端称为栈底。
当表中没有元素时称为空栈。
栈的运算包括初始化、入栈、退栈、读取栈顶元素等。
当栈为空的时候不允许退栈,当栈为满的时候不允许入栈。
标识栈的特性的是四个变量:
栈的首地址V,栈的容量m,栈顶指针Top。
栈的初始化:
voidinit-stack(s,m.top)
ETs;intm,*top;
{s=malloc(m*sizeof(ET));
*top=0;
return;
}
入栈运算
voidpush(s,m,top,x)
ETs[],x;intm,*top;
{if{*top==m}{printf(“stackoverflow\n”);return;}
*top=*top+1;
s[*top-1]=x;return;
}
退栈运算
voidpop(s,m.top,y)
ETs[],*y;intm,*top;
{if(*top==0){printf(“stackunderflow\n”);return;
y=s[*top-1];
*top=*top-1;
return;
}
读取栈顶元素
voidtop(s,m,top,y)
ETs[],*y;intm,*top;
{if(*top==0){printf(“stackempty\n”);return;}
y=s[*top-1];
return;}
插入在线性表的一端进行,而删除在表的另一端进行,我们将这种数据结构称为队或队列,把允许插入的一端叫队尾(rear),把允许删除的一端叫队头(front)。
当队列中没有数据时,我们称这个时候的队列为空队
队列也是一种运算受限制的线性表,它的运算包括:
初始化队、入队、退队、读取队首和队尾的数据。
当队列为空时不允许退队,当队列未满的时候不允许入队。
在实际应用中,通常使用循环队列
初始化循环队列
voidinit_queue(q,m,front,rear,s)
ETq;intm,*front,*rear,*s;
{q=malloc(m*sizeof(ET));
*front=m;*rear=m;*s=0;
return;}
循环队列入队运算
vsidaddcq(q,m,rear,front,s,x)
ETq[];intm,*front,*rear,*s;
{if((*s==1)&&(*rear==*front)){printf(“queueoverflow\n”);return;}
*rear=*rear+1;
if(*rear==m+1)*rear=1;
q[*rear-1]=x;*s=1;return;}
循环队列退队运算
voiddelcq(q,m,rear,front,s,y)
ETq[],*y;intm,*front,*rear,*s;
{if(*s==0){printf(“queueunderflow\n”);return;}
*front=*front+1;
if(*front==m+1)*front=1;
*y=q[front-1];
if(*front==*rear)*s=0;
return;}
四、实验步骤:
1进入TurboC2.0,新建一个文件。
2输入程序,程序要求使用子函数进行组织。
3将源程序保存到指定文件夹“D:
\学生姓名”。
4按F9调试,纠正语法错误。
5按Ctrl+F9运行,调试逻辑错误。
6按Alt+F5查看结果。
五、实验截图:
六、程序源代码:
#include"math.h"
#include"stdlib.h"
#definendstructnode
structnode
{
intd;
structnode*next;
};
nd*create(head)
nd*head;
{
intd;
nd*p;
nd*q;
d=1;
head=(nd*)malloc(sizeof(nd));
head->next=NULL;
p=head;
while(d>0)
{
printf("\nPleaseinputthenumber:
");
scanf("%d",&d);
if(d>0)
{
q=(nd*)malloc(sizeof(nd));
q->d=d;
q->next=NULL;
p->next=q;
p=p->next;
}
}
return(head);
};
prt(head)
nd*head;
{
nd*p;
if(head!
=NULL)
{
p=head->next;
printf("Theelementinthelistare:
");
while(p!
=NULL)
{
printf("%d",p->d);
p=p->next;
}
printf("\n");
}
}
nd*look(head,x)
nd*head;
intx;
{
nd*p;
p=head;
while((p->next!
=NULL)&&(((p->next)->d)!
=x))p=p->next;
return(p);
}
ins(head,x,y)
nd*head;intx;inty;
{
nd*p,*q;
p=look(head,x);
q=(nd*)malloc(sizeof(nd));
q->d=y;
q->next=p->next;
p->next=q;
}
del(head,x)
nd*head;intx;
{
nd*p;
nd*q;
p=head->next;
q=head;
while((p->d!
=x)&&(p->next!
=NULL))
{
p=p->next;
q=q->next;
}
if(p->d==x)
{
q->next=p->next;
free(p);
}
else
printf("Nothieelementinthelist\n");
}
nd*un(l1,l2)
nd*l1,*l2;
{nd*p,*q;
if(l2!
=NULL)
{
p=l1;
while(p->next!
=NULL)p=p->next;
p->next=l2->next;
}
free(l2);
return(l1);
}
nd*re(head)
nd*head;
{
nd*p,*q,*h;
p=head->next;
q=p->next;
h=q;
p->next=NULL;
while(q!
=NULL)
{
head->next=q;
h=h->next;
q->next=p;
p=q;
q=h;
}
return(head);
}
nd*copy(head)
nd*head;
{
nd*p,*q,*h,*t;
p=(nd*)malloc(sizeof(nd));
p->next=NULL;
q=head->next;
h=p;
while(q!
=NULL)
{
t=(nd*)malloc(sizeof(nd));
t->d=q->d;
t->next=NULL;
h->next=t;
h=h->next;
q=q->next;
}
return(p);
}
nd*dec(head,x)
nd*head;intx;
{
nd*p,*q;
inti=0;
p=head;
while((p!
=NULL)&&(i!
=x))
{
p=p->next;
i++;
}
if(ielse
{
q=(nd*)malloc(sizeof(nd));
q->next=p->next;
p->next=NULL;
return(q);
}
}
intwel()
{
intx;
printf("\n");
printf("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n");
printf("$Welcomeusethisprogram!
$\n");
printf("$Pleaseinputthecommand!
$\n");
printf("$1.Create12.insert3.delete$\n");
printf("$4.unite5.reverse6.copy$\n");
printf("$7.find8.decompose9.Create2$\n");
printf("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n");
printf("Thecommandis:
");
scanf("%d",&x);
return(x);
}
intfind(head,x)
nd*head;intx;
{
inti=0;
nd*p;
p=head;
while((p!
=NULL)&&(p->d!
=x))
{
p=p->next;
i++;
}
if(p->d==x)return(i);
else
return(0);
}
main()
{
nd*head,*head2,*p;
intcommand;
intnum,sta,x,t;
command=wel();
while(command!
=0)
{
switch(command)
{
case1:
head=create(head);prt(head);break;
case2:
printf("Pleaseinputthestation:
");
scanf("%d",&sta);
printf("Pleaseinputthenumber:
");
scanf("%d",&num);
ins(head,sta,num);
prt(head);
break;
case3:
printf("Pleaseinputthenumber:
");
scanf("%d",&num);del(head,num);prt(head);
break;
case4:
prt(head);
if(head2!
=NULL)
{prt(head2);
head=un(head,head2);free(head2);prt(head);
}
break;
case5:
head=re(head);prt(head);
break;
case6:
head2=copy(head);printf("List1");prt(head);
printf("List2");prt(head2);
break;
case7:
printf("Pleaseinputthenumberyoufind:
");
scanf("%d",&x);
t=find(head,x);
if(t==0)printf("Nothiselementinthelist\n");
else
printf("Theelement'sstationis:
%d\n",t);
break;
case8:
printf("Pleaseinputthestationyou'lldecompose");
scanf("%d",&x);
head2=dec(head,x);
prt(head);prt(head2);
break;
case9:
head2=create(head2);prt(head2);
}
command=wel();
}
free(head);
free(head2);
}
七、实验中应注意的问题与思考题:
1在对栈和队列的运算过程中保证数据结构的逻辑完整性。
2栈和循环队列元素的打印。
在打印过程中应该正确分析循环队列的具体情况,做到正确打印。
3栈与队列均不允许在中间插入数据,保证运算的正确性;线性队列不能重复使用,不符合流程化要求,应采取循环队列。
4当栈满,而此时要进行退队入栈运算时应进行怎样的处理才能避免数据的丢失?
答:
先判断若栈满,则另外进行存储。
5当队列满,而此时要进行退栈入队运算时应进行怎样的处理才能避免数据的丢失?
答:
先判断若队列满,则另外进行存储。
6应用程序要求循环执行,每次运算结束后要求打印栈和队列中的元素,以查看结果。
7对各个功能模块采用独立编制子函数,增强程序的可执行性、可移植性和可读性。
增加情报信息量,对实际应用中可能发生的情况考虑周全,对非法情形要提出适当的处理方案。
【实验总结】
1通过实验,了解并掌握线性表逻辑特性和物理特性。
2了解并掌握队列和栈的运算方法,培养结合理论知识进行实际应用的实践能力。
【指导教师评语及成绩】
成绩:
________指导教师(签字):
年月日