燕山大学里仁秋基础算法实验.docx
- 文档编号:2857378
- 上传时间:2022-11-16
- 格式:DOCX
- 页数:15
- 大小:95.37KB
燕山大学里仁秋基础算法实验.docx
《燕山大学里仁秋基础算法实验.docx》由会员分享,可在线阅读,更多相关《燕山大学里仁秋基础算法实验.docx(15页珍藏版)》请在冰豆网上搜索。
燕山大学里仁秋基础算法实验
计算机基础算法实验报告
班级:
学号:
姓名:
指导教师:
完成日期:
一、两个长整数相加
1.实验任务
用链表(单链表或双向链表)实现任意位数的整数相加。
2.设计思想
首先创建逆序链表1,即将输入的数字逆序进入链表,再创建链表2,将输入的数字逆序进入链表。
此时两个链表的头节点的下一个节点均对应为数字的个位数,再对两个链表进行相加操作,分别从两个链表的头节点的下一节点进行两两相加,相加结果临时存入num变量,并且放置整型变量carry储存进位,进行num对10求余,余数存入节点p,carry为整型变量,对carry进行相加结果/10操作,若相加结果小于10,carry=0,若结果大于10,carry=1。
将相加结果存入新链表的头节点的下一节点,循环两个链表,直至两个链表循环结束。
此时新链表即为相加后的链表,理论可以实现任意位数的正整数相加。
3.主要变量说明
ADTLNode{
数据元素:
此单向链表中的所有元素类型为字符型的数字字符
数据关系:
链表中数据元素之间是线性关系。
基本操作:
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
#include
#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;
p->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("\n");
}
LNode*Creat(LNode*head1,LNode*head2){
LNode*head;
LNode*p,*q,*r,*s,*t;
intcarry=0;
intnum;
head=(LNode*)malloc(sizeof(LNode));
head->data=0;
r=head1->next;
s=head2->next;
q=NULL;
while((r!
=NULL)&&(s!
=NULL)){
p=(LNode*)malloc(sizeof(LNode));
num=r->data+s->data+carry;
p->data=num%10;
carry=num/10;
p->next=q;
q=p;
r=r->next;
s=s->next;
}
t=(r!
=NULL)?
r:
s;
while(t!
=NULL){
p=(LNode*)malloc(sizeof(LNode));
num=t->data+carry;
p->data=num%10;
carry=num/10;
p->next=q;
q=p;
t=t->next;
}
if(carry!
=0){
p=(LNode*)malloc(sizeof(LNode));
p->data=carry;
p->next=q;
q=p;
}
head->next=p;
return(head);
}
voidmain(){
LNode*head1,*head2,*head3;
printf("pleaseputanumber\n");
head1=creat();
printf("pleaseputanotherone\n");
head2=creat();
head3=Creat(head1,head2);
print(head3);
}
二、算术表达式求值
1.实验任务
用栈的形式实现算数表达式的求值。
利用给定的运算符的优先关系,实现对四则混合运算表达式的求值,并能演示在求值过程中运算符栈、操作数栈和主要操作的变化过程。
2.设计思想
(1)利用给定的运算符的优先级关系,对算术四则混合运算的表达式
的求值。
(2)演示程序以用户和计算机对话的形式进行,即在计算机的终端显
示“提示信息”之后,由用户在键盘上输入相应的信息,以字符序列
的形式从终端输入语法正确且不含变量的整数表达式最后以“#”键
来结束。
3.主要变量说明
(1)字符栈的抽象数据类型定义:
ADTstack{
数据对象:
D={Ai|Ai∈Charset,i=1,2,3,…n,n>=0}
数据关系:
R={
基本操作:
Initstack(&S)
操作结果:
构造一个空栈S。
Destorystack(&S)
初始条件:
栈S已经存在。
操作结果:
栈S被摧毁。
Push(&S,e)
初始条件:
栈S已经存在。
操作结果:
插入元素e作为新的栈顶元素。
Gettop(S,&e)
初始条件:
栈S已经存在。
操作结果:
用e返回栈S的栈顶的元素。
Pop(&S,&e)
初始条件:
栈S已经存在。
操作结果:
删除栈S的栈顶的元素,并且用e返回其值。
}
(2)整型栈的抽象数据类型定义:
ADTIntstack{
数据对象:
D={Ai|Ai∈Intset,i=1,2,3,…n,n>=0}
数据关系:
R={
基本操作:
IntInitstack(&S)
操作结果:
构造一个空栈S。
Destorystack(&S)
初始条件:
栈S已经存在。
操作结果:
栈S被摧毁。
IntPush(&S,e)
初始条件:
栈S已经存在。
操作结果:
插入元素e作为新的栈顶元素。
IntGettop(S,&e)
初始条件:
栈S已经存在。
操作结果:
用e返回栈S的栈顶的元素。
IntPop(&S,&e)
初始条件:
栈S已经存在。
操作结果:
删除栈S的栈顶的元素,并且用e返回其值。
}
4.算法描述
(1)主程序模块
Voidmain()
{
初始化;
实现表达式的求值;
输出结果;
}
(2)操作符栈模块——实现字符栈抽象数据类型的实现。
(3)操作数栈模块——实现整型栈抽象数据类型的实现。
(4)功能模块——实现表达式的求值。
5.程序结构
主程序模块
↓
功能模块
↓
操作符模块操作数模块
6.调试情况
(1)刚开始由于对问题分析的不透彻导致只用了一种抽象数据类型,经过几次测试结果只要一超过128就开始出现错,最后经过考虑又增加了intstack这种数据类型来存放操作数,而使问题得到的解决。
(2)本次程序的模块的设计不太合理,导致在写函数调用的时候很麻分;改进方法:
将一组相关的函数操作封装在一起。
7.运行结果
⑴3+9*8+8*(6+89-8+52)/2#
⑵21*89+89+12/(1+3)-45+9#
8.设计技巧
用栈的形式实现算数表达式的求值。
9.心得体会
经过对程序的设计使自己对栈后进先出的特点有了更深的理解,同时
可以根据运行结果所出的错,去大致的推测程序的一些逻辑错误,也
可以一边给程序加上一些输出标志,慢慢的推断程序到底是在那部分
出了错误,提高了自己对程序逻辑错误的认识,从而使自己的改程序
的能力得到了提高,也积累了宝贵的编程经验。
程序清单:
#include
#include
#include
#defineSTACKSIZE100
#defineSTACKMORE10
typedefstructstack{
char*base;
char*top;
intstacksize;
}stack;
typedefstructintstack{
int*base;
int*top;
intstacksize;
}intstack;
voidinitstack(stack&s)
{
s.base=(char*)malloc(STACKSIZE*sizeof(char));
if(!
s.base)cout<<"error"< s.top=s.ba
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 燕山 大学 里仁秋 基础 算法 实验