软件技术基础上机实验三_精品文档.docx
《软件技术基础上机实验三_精品文档.docx》由会员分享,可在线阅读,更多相关《软件技术基础上机实验三_精品文档.docx(10页珍藏版)》请在冰豆网上搜索。
![软件技术基础上机实验三_精品文档.docx](https://file1.bdocx.com/fileroot1/2022-10/6/f430eac0-e803-4fcc-b235-dbf86d68df75/f430eac0-e803-4fcc-b235-dbf86d68df751.gif)
姓名:
吴振国学号:
2011019190006
上机实验三
题目一:
一、程序流程说明
(1)创建一个链栈,
(2)编写输出,进栈出站函数,(3)编写主函数
二、程序代码
#include
#include
#defineLENsizeof(node_type)
typedefstructnode
{
intdata;
structnode*next;
}node_type;
typedefstruct{
node_type*top;
intlength;
}lstack_type;
lstack_type*create_list(void)
{
lstack_type*p;
p=(lstack_type*)malloc(sizeof(lstack_type));
p->top=NULL;
p->length=0;
return(p);
}
voidprint(node_type*head)
{
node_type*p;
printf("Now,thoserecordsare:
\n");
p=head;
if(head!
=NULL)
{
do{
printf("%4d",p->data);
p=p->next;
}
while(p!
=NULL);
}
}
intpush(lstack_type*lp,intx)
{node_type*p;
p=(node_type*)malloc(LEN);
if(p!
=NULL)
{ p->data=x;
p->next=lp->top;
lp->top=p;
lp->length++;
return
(1);
}
elsereturn(0);
}
intpop(lstack_type*lp)
{
node_type*p;
intx;
if(lp->top==NULL){
printf("stackisunderflow");
return(0);
}
else{
x=lp->top->data;
p=lp->top;
lp->top=lp->top->next;
lp->length--;
free(p);
return(true);
}
}
voidmain()
{
lstack_type*p1;
inta=0,b=0,m=0;
p1=create_list();
printf("\ninputthenumbers:
\n");
scanf("%d",&m);
while(m!
=0)
{push(p1,m);
scanf("%d",&m);
}
print(p1->top);
pop(p1);
pop(p1);
print(p1->top);
}
三:
典型测试数据(输入):
246943
应输出(上机前自己分析的结果):
439642出栈后642
四:
上机时遇到的问题:
①不能输出解决办法:
更改函数返回类型
②编译出错解决办法:
输入数据时“&”不要忘
五:
实际运行结果
六、小结&体会
链栈的使用很方便,比顺序栈更好操作。
题目二:
一、程序流程说明
(1)创建一个循环队列
(2)编写出队列函数,入队列函数,和负数删除函数
(3)编写主函数
二、程序代码
#include
#defineN20
typedefstruct
{intdata[N];
intfront,rear;
}queue_type;
voidcreate_list(queue_type*lp)
{
inti,elem;
lp->front=0;lp->rear=0;
printf("\npleaseinputdatasofthelist\n");
lp->data[0]=NULL;
for(i=1;i{
scanf("%d",&elem);
if(elem==-1)break;
lp->data[i]=elem;
lp->rear++;
}
}
voidprintlist(queue_type*lp)
{
inti,j=0;
printf("\nTheserecordsare:
\n");
if(lp->rear<=0)
{
printf("Nodata!
\n");
return;
}
else
for(i=lp->front+1;i<=lp->rear;i++)
{
printf("%4d",lp->data[i]);
}
}
voidenqueue(queue_type*q,intx)
{
q->rear=(q->rear+1)%N;
q->data[q->rear]=x;
}
intdequeue(queue_type*q)
{
inti;
i=q->front;
q->front=(q->front+1)%N;
/*printlist(q);*/
return(q->data[i+1]);
}
voidaa(queue_type*lp){
inti,l=lp->rear,j;
printf("long=%4d",lp->rear);
for(i=lp->data[lp->front+1];i<=l+1;i++){
j=dequeue(lp);
if(j>0)
enqueue(lp,j);
}
}
main()
{
queue_typep;
create_list(&p);
printlist(&p);
aa(&p);
printf("afterdeletetelistis:
\n");
printlist(&p);
}
三、测试数据*
输入:
23-46-58-97-1020(-1)
应输出:
2368720
四:
上机时遇到的问题:
①负数不能完全删除解决办法:
更改循环,使每一个数都能与0比较,是负数则删除(调用出队列函数)
五、实际运行结果:
六、小结&体会
循环队列的使用能是空间更加合理的被利用。
题目三:
一、程序流程说明
(1)编写两个pop函数,两个pus函数
(2)编写主函数
二、程序代码
#include
#defineM10
#definetrue1
#definefalse0
typedefstruct{
intdata[M];
inttop1,top2;
}stack_type;
intpush1(stack_type*s)
{
intx;
printf("请输入数据(以’0‘结束):
\n");
scanf("%d",&x);
while(x!
=0&&s->top1<=s->top2)
{
s->data[s->top1]=x;
s->top1=s->top1+1;
scanf("%d",&x);
}
if(s->top1==s->top2)
printf("栈已满!
\n");
return;
}
intpush2(stack_type*s)
{
intx;
printf("请输入数据(以’0‘结束):
\n");
scanf("%d",&x);
while(x!
=0&&s->top1<=s->top2)
{
s->data[s->top2]=x;
s->top2=s->top2-1;
scanf("%d",&x);
}
if(s->top1==s->top2)
printf("栈已满!
\n");
return;
}
intpop1(stack_type*s)
{
intout;
if(s->top1<0)return(false);
else
{
out=s->data[s->top1-1];
s->top1=s->top1-1;
return(out);
}
}
intpop2(stack_type*s)
{
intout;
if(s->top2>=M)return(false);
else
{
out=s->data[s->top2+1];
s->top2=s->top2+1;
return(out);
}
}
voidmain()
{
inti,j,k;
stack_typeas,*lp;
lp=&as;
lp->top1=0;
lp->top2=M-1;
while
(1)
{
printf("请选择你要操作的栈:
输入“1”或“2”\n");
printf("返回“0”\n");
scanf("%d",&i);
if(i==1)
{
printf("请选择你要进行的操作:
入栈“1”;出栈“2”\n");
scanf("%d",&k);
switch(k)
{
case1:
push1(lp);
break;
case2:
j=pop1(lp);
printf("出栈元素为:
%d\n",j);
break;
default:
printf("输入错误!
\n");
}