计算方法实验报告心得体会(实验报告实验目的和要求)
一、两个长整数相加
1.实验任务
要求用链表(单链表或双向链表)实现两个任意位数的整数相加。例如,为存储100位的整数可以建立有100个结点的单链表,每个结点存储1位(如果每个结点存储4位,建立25个结点的单链表也可以)。
2.变量说明
x 第一个长整数
y 第二个长整数
L 两个长整数的和
p 指向L的next指针
LNode 单链表类型
L,L1,L2 单向链表
*head 指向链表的头指针
*next 链表结点指针域
m 整数类型,表示进位
s,t 整数类型
3.算法描述
Status MergeList_List(LinkList &La, LinkList &Lb, LinkList &Lc)
int( * compare)(ElemType,ElemType)){
//已知单链表线性表La和Lb的元素按值非递减排列
//归并La和Lb得到新的单链线性表Lc,Lc的元素也按值非递减排列。
if (!InitList(Lc)) return ERROR; //存储空间分配失败
ha=GetHead(La); hb=GetHead(Lb); //ha和hb分别指向La和Lb的头结点
pa=NextPos(La,ha); pb=NextPos(Lb,hb); //pa和pb分别指向La和Lb中当前结点
while(pa&&pb){ //La和Lb均为非空
a=GetCurElem(pa); b=GetCurElem(pb); //a和b为两表中当前比较元素
if((*compare)(a,b)<=0){ //a<=b
DelFirst(ha,q); Append(Lc,q);pa=NextPos(La,ha);}
else{ //a>b
DelFirst(hb,q); Append(Lc,q); pb=NextPos(Lb,hb);}
}//while
if(pa) Append(Lc,pa); //链接La中剩余结点
else Append(Lc,pb); //链接Lb中剩余结点
FreeNode(ha); FreeNode(hb); //释放La和Lb的头结点
return OK;
}//Merge List-L
4.程序流程图
程序:
#include<stdio.h>
#include<malloc.h>
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
LinkList CreateList_L()
{
int i;
char m;
struct LNode *p,*L;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
m=getchar();
while(m!='\n')
{
LinkList p;
p=(LinkList)malloc(sizeof(LNode));
p->data=m-'0';
p->next=L->next;
L->next=p;
m=getchar();
}
return L;
}
LinkList add(LinkList &L1,LinkList &L2)
{
LinkList s,t,L,p;
int f,m;
f=0;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
s=L1->next;t=L2->next;
while(s&&t)
{
p=(LinkList)malloc(sizeof(LNode));
m=s->data+t->data+f;
if (m>9){
m=m-10;f=1;}
else f=0;
p->data=m;
p->next=L->next;
L->next=p;
s=s->next;t=t->next;
}
while(s)
{
p=(LinkList)malloc(sizeof(LNode));
m=s->data+f;
if (m>9){
m=m-10;f=1;}
else f=0;
p->data=m;
p->next=L->next;
L->next=p;
s=s->next;
}
while(t)
{
p=(LinkList)malloc(sizeof(LNode));
m=t->data+f;
if (m>9){
m=m-10;f=1;}
else f=0;
p->data=m;
p->next=L->next;
L->next=p;
t=t->next;
}
if (f==1)
{ p=(LinkList)malloc(sizeof(LNode));
p->data=f;
p->next=L->next;
L->next=p;
}
return L;
}
void main()
{
LinkList p,L,x,y;
x=CreateList_L();
y=CreateList_L();
L=add(x,y);
p=L->next;
while(p)
{
printf("%d",p->data);
p=p->next;
}
}
5.调试情况
(1)刚开始设计这个程序的时候没有考虑到进制问题,两个数已经加完了还在进位,经过问同学以及看书过程后又加上了一条while语句,最后成功运行。
(2)一开始的时候经常丢掉变量的“&”符号,以后一定要多注意这些细节。
(3)本程序的模块的划分的比较合理,且尽可能的将指针的操作封装到了模块的里面,使调试的时候比较顺利。
6.运行结果
7.心得体会
在此实验的思考以及编译过程中,我最大的体会是自己的水平真的还不值一提,敲代码时还出现了特别多的error,运行过程中还出现了代码没错误但是就是运行不出来的结果。同时我对课本所学的知识进行了复习和巩固,复习的内容包括单链表的建立、正序逆序的分别、单链表的输出、两个单链表的操作、相加以及进位的算法思想的建立和正确地编译。
二、算术表达式求值
1.实验任务
以字符序列的形式从终端输入语法正确的、不含变量的整数表达式,利用给定的算符优先关系,实现对算术四则混合运算表达式的求值,并演示在求值过程中运算符栈、操作数栈、操作数栈和主要操作的变化过程。注意:要求表达式中的整数可以是多位的。