计算方法实验报告心得体会(实验报告实验目的和要求)

一、两个长整数相加

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.实验任务

以字符序列的形式从终端输入语法正确的、不含变量的整数表达式,利用给定的算符优先关系,实现对算术四则混合运算表达式的求值,并演示在求值过程中运算符栈、操作数栈、操作数栈和主要操作的变化过程。注意:要求表达式中的整数可以是多位的。

钻石免费

已有26人支付

注册会员每天签到2个铜币,签到铜币可免费下载、可兑换VIP。如有侵权或者任何问题,请加微信18600754856联系
8848知识分享网 » 计算方法实验报告心得体会(实验报告实验目的和要求)