软件技术基础上机实验三.docx
《软件技术基础上机实验三.docx》由会员分享,可在线阅读,更多相关《软件技术基础上机实验三.docx(16页珍藏版)》请在冰点文库上搜索。
软件技术基础上机实验三
姓名:
吴振国学号:
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");
}
}
elseif(i==2)
{
printf("请选择你要进行的操作:
入栈“1”;出栈“2”\n");
scanf("%d",&k);
switch(k)
{
case1:
push2(lp);
break;
case2:
j=pop2(lp);
printf("出栈元素为:
%d\n",j);
break;
default:
printf("输入错误!
\n");
}
}
elsebreak;
}
}
三、测试数据*
输入:
12345//1234
输出:
5(堆栈1出栈)//4(堆栈2出栈)
四:
上机时遇到的问题:
①函数调用后无正确输出,解决办法:
正确使用switch语句,检验逻辑。
五:
实际结果
六、小结&体会
同一个结构中不同链栈需要分别操作。
题目四:
一、程序流程说明
(1)创建队列
(2)编写输出函数,出队列,入队列函数(3)编写主函数
二、程序代码
#include
#defineN20
typedefstruct
{intdata[N];
inttop1,top2;
}queue_type;
voidcreate_list(queue_type*lp)
{
inti,elem;
lp->top1=0;lp->top2=-1;
printf("\npleaseinputdatasofthelist\n");
for(i=0;i{
scanf("%d",&elem);
if(elem==-1)break;
lp->data[i]=elem;
lp->top2++;
}
}
voidprintlist(queue_type*lp)
{
inti,j=0;
printf("\nTheserecordsare:
\n");
if(lp->top2<=0)
{
printf("Nodata!
\n");
return;
}
else
if(lp->top2>lp->top1){
for(i=lp->top1;i<=lp->top2;i++)
{
printf("%4d",lp->data[i]);
}
}
else
{
for(i=lp->top1;i<=N;i++)
{
printf("%4d",lp->data[i]);
}
for(i=0;itop2;i++)
printf("%4d",lp->data[i]);
}
}
voidenqueue(queue_type*lq,intx)
{
inttag;
if((lq->top2+1)%lq->top1!
=0)
tag=1;
if(tag)
{
lq->top2=(lq->top2+1)%N;
lq->data[lq->top2]=x;
}
}
intdequeue(queue_type*q)
{
inti;
i=q->top1;
q->top1=(q->top1+1)%N;
/*printlist(q);*/
return(q->data[i]);
}
main()
{
inti;
queue_typep;
create_list(&p);
printlist(&p);
dequeue(&p);
dequeue(&p);
printlist(&p);
enqueue(&p,12);
printlist(&p);
}
三、测试数据*
输入:
2490-24-5//12(入队列数)
输出:
90-24-5(出队列两次)//90-24-512
四、上机时遇到的问题
①问题现象:
操作类型处错误原因:
不同类型之间操作;解决办法:
修改
五、实际运行结果:
六、小结&体会
队列的操作相对于链表还是非常简单的。
THANKS!
!
!
致力为企业和个人提供合同协议,策划案计划书,学习课件等等
打造全网一站式需求
欢迎您的下载,资料仅供参考