燕山大学里仁秋基础算法实验Word文档下载推荐.docx
《燕山大学里仁秋基础算法实验Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《燕山大学里仁秋基础算法实验Word文档下载推荐.docx(15页珍藏版)》请在冰豆网上搜索。
LNode*creat(void)
操作结果:
创建一个单向链表,并且逆序输入链表元素
voidprint(LNode*head)
输出单向链表
LNode*Creat(LNode*head1,LNode*head2)
对两个链表进行相加操作,建立相加后的链表
}ADTLNode
4.算法描述
定义三个指针变量head1head2head3
屏幕输出:
pleaseputanumber
输入任意位数数字,调用LNode*creat(void),建立链表head1
pleaseputanotherone
输入任意位数数字,调用LNode*creat(void),建立链表head2
调用函数Creat(head1,head2)对链表head1,head2进行相加操作,建立新链表head3
调用函数print(head3)输出链表head3
”head3”
程序结束
5.程序结构
voidmain()
↓
LNode*creat(void)voidprint(LNode*head)LNode*Creat(LNode*head1,LNode*head2)
6.调试情况
(1)刚开始的时候曾忽略一些变量的“&
”使调试程序时花费了不少时间。
今后应该重视参数的变量和赋值属性的区分和标识。
(2)本程序的模块的划分的比较合理,且尽可能的将指针的操作封装到了模块的里面,使调试的时候比较顺利。
(3)开始设计的时候没有注意到当两个数都加完了,但还是进位的情况,经过讨论在while循环的外面又加上了一条语句,使程序更加准却,并使其的健壮性提到了提高。
7.运行结果
⑴123456789123456789+123456789123456789
⑵999995+5
⑶5+999995
8.设计技巧
采用由表尾到表头逆向建立链表的方法。
9.心得体会
通过对实验的思考以及编译过程,我可以对课本所学知识进行熟练运用,包括单链表的建立,正序逆序的分别,单链表的输出,两个单链表的操作,相加以及进位的算法思想的建立以及正确编译。
程序清单:
#include<
stdio.h>
malloc.h>
#defineNULL0
typedefstructLNode{
intdata;
structLNode*next;
}LNode;
charn;
LNode*creat(void){
LNode*head;
LNode*p,*q;
head=(LNode*)malloc(sizeof(LNode));
head->
data=0;
q=NULL;
while((n=getchar())!
='
\n'
)
if(n>
=48&
&
n<
=57){
p=(LNode*)malloc(sizeof(LNode));
p->
data=n-48;
next=q;
q=p;
}
head->
next=p;
return(head);
}
voidprint(LNode*head){
LNode*r;
printf("
Thenumis:
\n"
);
r=head;
if(head!
=NULL)
do{
printf("
%d"
r->
next->
data);
r=r->
next;
while(r->
next!
=NULL);
printf("
LNode*Creat(LNode*head1,LNode*head2){
LNode*p,*q,*r,*s,*t;
intcarry=0;
intnum;
head=(LNode*)malloc(sizeof(LNode));
r=head1->
s=head2->
while((r!
=NULL)&
(s!
=NULL)){
p=(LNode*)malloc(sizeof(LNode));
num=r->
data+s->
data+carry;
p->
data=num%10;
carry=num/10;
q=p;
r=r->
s=s->
}
t=(r!
=NULL)?
r:
s;
while(t!
=NULL){
num=t->
t=t->
if(carry!
=0){
data=carry;
return(head);
voidmain(){
LNode*head1,*head2,*head3;
pleaseputanumber\n"
head1=creat();
pleaseputanotherone\n"
head2=creat();
head3=Creat(head1,head2);
print(head3);
二、算术表达式求值
用栈的形式实现算数表达式的求值。
利用给定的运算符的优先关系,实现对四则混合运算表达式的求值,并能演示在求值过程中运算符栈、操作数栈和主要操作的变化过程。
(1)利用给定的运算符的优先级关系,对算术四则混合运算的表达式
的求值。
(2)演示程序以用户和计算机对话的形式进行,即在计算机的终端显
示“提示信息”之后,由用户在键盘上输入相应的信息,以字符序列
的形式从终端输入语法正确且不含变量的整数表达式最后以“#”键
来结束。
(1)字符栈的抽象数据类型定义:
ADTstack{
数据对象:
D={Ai|Ai∈Charset,i=1,2,3,…n,n>
=0}
数据关系:
R={<
Ai-1,Ai>
|Ai-1,Ai∈D,i=2,3,…n}
基本操作:
Initstack(&
S)
操作结果:
构造一个空栈S。
Destorystack(&
初始条件:
栈S已经存在。
栈S被摧毁。
Push(&
S,e)
插入元素e作为新的栈顶元素。
Gettop(S,&
e)
用e返回栈S的栈顶的元素。
Pop(&
S,&
删除栈S的栈顶的元素,并且用e返回其值。
(2)整型栈的抽象数据类型定义:
ADTIntstack{
D={Ai|Ai∈Intset,i=1,2,3,…n,n>
IntInitstack(&
IntPush(&
IntGettop(S,&
IntPop(&
(1)主程序模块
Voidmain()
{
初始化;
实现表达式的求值;
输出结果;
(2)操作符栈模块——实现字符栈抽象数据类型的实现。
(3)操作数栈模块——实现整型栈抽象数据类型的实现。
(4)功能模块——实现表达式的求值。
主程序模块
功能模块
操作符模块操作数模块
(1)刚开始由于对问题分析的不透彻导致只用了一种抽象数据类型,经过几次测试结果只要一超过128就开始出现错,最后经过考虑又增加了intstack这种数据类型来存放操作数,而使问题得到的解决。
(2)本次程序的模块的设计不太合理,导致在写函数调用的时候很麻分;
改进方法:
将一组相关的函数操作封装在一起。
⑴3+9*8+8*(6+89-8+52)/2#
⑵21*89+89+12/(1+3)-45+9#
经过对程序的设计使自己对栈后进先出的特点有了更深的理解,同时
可以根据运行结果所出的错,去大致的推测程序的一些逻辑错误,也
可以一边给程序加上一些输出标志,慢慢的推断程序到底是在那部分
出了错误,提高了自己对程序逻辑错误的认识,从而使自己的改程序
的能力得到了提高,也积累了宝贵的编程经验。
#include<
iostream.h>
#defineSTACKSIZE100
#defineSTACKMORE10
typedefstructstack{
char*base;
char*top;
intstacksize;
}stack;
typedefstructintstack{
int*base;
int*top;
}intstack;
voidinitstack(stack&
s)
{
s.base=(char*)malloc(STACKSIZE*sizeof(char));
if(!
s.base)cout<
<
"
error"
endl;
s.top=s.ba