电子科技大学软件技术基础实验报告3.docx
《电子科技大学软件技术基础实验报告3.docx》由会员分享,可在线阅读,更多相关《电子科技大学软件技术基础实验报告3.docx(14页珍藏版)》请在冰豆网上搜索。
电子科技大学软件技术基础实验报告3
电子科技大学通信与信息工程学院
标准实验报告
(实验)课程名称软件技术基础实验
电子科技大学教务处制表
电子科技大学
实验报告
一、实验室名称:
校公共机房
二、实验项目名称:
堆栈和队列程序设计
三、实验学时:
4学时
四、实验原理:
使用VS2010等C语言集成开发环境(IDE),在微型计算机上对程序进行编辑、编译、连接与运行。
通过上机练习掌握堆栈和链表的建立、插入删除,遍历等方法和过程。
五、实验目的:
1.熟练堆栈和链表的概念和基本操作方法。
2.掌握课程平台使用方法。
六、实验内容:
上机完成所有函数,编程实验,调试运行程序并完成报告。
七、实验器材(设备、元器件):
硬件要求:
普通pc机,1G内存,100G硬盘空间即可。
软件要求:
Windows7,包括C编译器的IDE。
八、实验步骤、实验编程与运行结果:
●现在列出4个题目的代码:
//第一题:
#include
#include
#defineelemtypeint
typedefstructs_tack
{
intlength;
inttop;
}stackt;
typedefstructstack
{
elemtypedata;
structstack*next;
}stack_t;
stack_t*initstack()
{
stack_t*top;
top=(stack_t*)malloc(sizeof(stack_t));
top->next=NULL;
top->data=0;
returntop;
}
voiddisplay(stack_t*head)
{
stack_t*p;
printf("当前链栈的数据元素:
\n");
for(p=head->next;p!
=NULL;p=p->next)//top为头结点,不存放数据
printf("%d",p->data);
printf("\n");
}
voidpush(stack_t*top,elemtypex)
{
stack_t*p;
p=(stack_t*)malloc(sizeof(stack_t));
p->data=x;
p->next=top->next;
top->next=p;
}
voidpop(stack_t*top)
{
stack_t*t,*x;
printf("出栈元素:
%d\n",top->next->data);
x=top->next;
t=x;
top->next=top->next->next;
free(t);
}
intmain()
{
stack_t*top=NULL;
intt;
top=initstack();
while
(1)
{
printf("请输入新的链栈元素:
");
scanf("%d",&t);
if(t==0)break;
push(top,t);
}
display(top);
pop(top);
display(top);
pop(top);
display(top);
}
//第二题
#include
#include
#defineN20
typedefstruct
{
intdata[N];
intfront,rear;
}queue_type;
voidcreate(queue_type*s)
{
s->data[0]=2;
s->data[1]=3;
s->data[2]=-4;
s->data[3]=6;
s->data[4]=-5;
s->data[5]=8;
s->data[6]=-9;
s->data[7]=7;
s->data[8]=-10;
s->data[9]=20;
s->front=0;
s->rear=10;
}
voidenqueue(queue_type*q,inta)
{
if(((q->rear)+1)%N==q->front)printf("队列已满");
else
{
q->rear=(q->rear+1)%N;
q->data[q->rear-1]=a;
}
}
intdequeue(queue_type*q)
{
if(q->front==q->rear)printf("队列为空");
else
{
q->front=(q->front+1)%N;
return(q->data[q->front-1]);
}
}
voidshow(queue_type*q,inta,intb)
{
inti,flag=0;
printf("\n队列元素:
\n");
if(a>=b)flag=1;
for(i=a;i
printf("%d",q->data[i]);
printf("\n");
}
voidaa(queue_type*q)
{
intdequeue(queue_type*q);
intlength;
length=(q->rear)-(q->front);
for(;length>0;length--)
{
if(q->data[q->front]<0)
{
q->front=(q->front+1)%N;
printf("\n负数出队:
%d",q->data[q->front-1]);
}
else
{
printf("\n正数插入队尾:
%d",q->data[q->front]);
q->front=(q->front+1)%N;
q->rear=q->rear+1;
q->data[q->rear-1]=q->data[q->front-1];
}
}
}
intmain()
{
inta;
queue_typet;
create(&t);
show(&t,t.front,t.rear);
printf("\n执行出队操作,出队元素:
%d\n",dequeue(&t));
show(&t,t.front,t.rear);
printf("\n执行入队操作,请输入入队元素:
");
scanf("%d",&a);
enqueue(&t,a);
show(&t,t.front,t.rear);
printf("\n执行aa函数:
");
aa(&t);
show(&t,t.front,t.rear);
}
//第三题
#include
#include
#defineelemtypeint
#definemaxnum100
typedefstructstack
{
elemtypedata[maxnum];
inttop0;
inttop1;
intlength0;
intlength1;
}stack_type;
voidpush(stack_type*ss,elemtypex,intflag)
{
inti;
if(flag==0)
{
for(i=ss->length0+1;i>=0;i--)
ss->data[i]=ss->data[i-1];
ss->data[0]=x;
ss->length0++;
}
else
{
for(i=maxnum-ss->length1;i<=99;i++)
ss->data[i-1]=ss->data[i];
ss->data[maxnum-1]=x;
ss->length1++;
}
}
voidpop(stack_type*ss,intflag)
{
inti,j;
if(flag==0)
{
for(i=0;i<(ss->length0-1);i++)
ss->data[i]=ss->data[i+1];
ss->length0--;
}
else
{
j=ss->length1;
for(i=maxnum-1;j>1;j--,i--)
ss->data[i]=ss->data[i-1];
ss->length1--;
}
}
voidshow(stack_type*ss,intflag)
{
inti;
if(flag==0)
{
printf("0号链表如下:
\n");
for(i=0;ilength0;i++)
printf("%d",ss->data[i]);
printf("\n");
}
else
{
printf("1号链表如下:
\n");
for(i=maxnum;i>(maxnum-ss->length1);i--)
printf("%d",ss->data[i-1]);
printf("\n");
}
}
intmain()
{
stack_types;
intt,flag,i;
s.length0=0;
s.length1=0;
s.top0=0;
s.top1=99;
while
(1)
{
printf("请输入新的栈元素:
");
scanf("%d",&t);
if(t==0)break;
printf("请选择操作的栈:
");
scanf("%d",&flag);
push(&s,t,flag);
}
show(&s,0);show(&s,1);
printf("分别弹出每个栈一次,结果如下:
\n");
pop(&s,0);pop(&s,1);
show(&s,0);show(&s,1);
}
//第四题
#include
#include
#defineN10
typedefstruct
{
intdata[N];
intfront,rear;
inttag;//tag=1,满;tag=0,不满
}queue_type;
voidcreate(queue_type*s)
{
s->data[0]=2;
s->data[1]=3;
s->data[2]=-4;
s->data[3]=6;
s->data[4]=-5;
s->data[5]=8;
s->data[6]=-9;
s->data[7]=7;
s->data[8]=-10;
s->data[9]=20;
s->front=0;
s->rear=9;
s->tag=1;
}
voidenqueue(queue_type*q,inta)
{
if(q->tag==0)
{
if((q->rear-q->front+1)%N==9)q->tag=1;
q->rear=(q->rear+1)%N;
q->data[q->rear]=a;
}
elseprintf("队满,无法入队");
}
intdequeue(queue_type*q)
{
q->front=(q->front+1)%N;
q->tag=0;
return(q->data[q->front-1]);
}
voidshow(queue_type*q,inta,intb,intta)
{
inti,flag=0;
printf("\n队列元素:
\n");
if(a
for(i=a;i<=b;i++)
printf("%d",q->data[i]);
if(a>=b)
{
for(i=a;iprintf("%d",q->data[i]);
for(i=0;i<=b;i++)
printf("%d",q->data[i]);
}
if(ta==1)printf("\n队满\n");
elseprintf("\n");
}
intmain()
{
inta;
queue_typet;
create(&t);
show(&t,t.front,t.rear,t.tag);
printf("\n执行出队操作,出队元素:
%d\n",dequeue(&t));
show(&t,t.front,t.rear,t.tag);
printf("\n执行入队操作,请输入入队元素:
");
scanf("%d",&a);
enqueue(&t,a);
show(&t,t.front,t.rear,t.tag);
}