计算机基础算法实验报告
- 格式:doc
- 大小:66.50 KB
- 文档页数:13
计算机基础算法实验报告
班级:
学号:
姓名:
指导教师:
完成日期: 2 实验一 实现两个整数相加
1. 实验任务
实现两个长整数相加:要求用链表(单链表或双向链表)实现任意位数的整数相加。
2. 设计思想
用单链表实现两个任意位整型相加,建立三个动态链表,两个分别用来存入两个加数,第三个链表用来存入和。考虑到进位以及算术加法习惯,采用逆序插入节点,先存高位再存低位数,头指针指向最后插入的节点。进行相加后存入第三个链表,最后将结果输出。
3.主要变量说明
data 链表结点的数据域
*next 链表结点的指针
node单链表类型
*list 单链表类型指针
head 指向链表的头指针
l3 指向第三个链表的头指针
j 进位标志
4.算法描述
首先定义单链表的结构体类型,然后输入两个数,调用创建链表函数创建两个单链表将输入的数分别依次逆序存入,高位存入第一个结点,低位存入之后的结点,最后的结点存个位,并不断循环始终使头指针指向新插入的结点。然后调用相加函数,并动态创建第三个链表将结果仍逆序存入第三个链表中。最后调用输出函数将结果输出。
5.程序结构
List creat()
操作结果:构造一个动态链表
list add(list l1,list l2)
初始条件:链表l1,l2已存在
操作结果:将两个链表的数据依次对应相加,并将结果倒叙存入链表l3
void out(list l)
初始条件:链表已存在
操作结果:依次输出链表中的数据 3 主函数:
void main()
{
list l1,l2,l3;
printf("请输入第一个整数,末尾输入-1表结束: ");
l1=creat();
out(l1);
printf("请输入第二个整数,末尾输入-1表结束: ");
l2=creat();
out(l2);
printf(”相加结果为: ”);
l3=add(l1,l2);
out(l3);
}
6.运行结果
请输入第一个整数,末尾输入-1表结束:1 2 3 4 -1
4321
请输入第二个整数,末尾输入-1表结束:7 8 9 -1
987
相加结果为:2023
7.心得体会
通过本次编写程序,我对单链表有了更深的理解,由于没有使用双向链表,就采取了逆向插入结点,这使我对逆向插入有更深的理解。正向插入节点需要两个指针来完成插入结点,头指针位置不动,而逆向插入头指针永远指向新插入的结点,这就省去了一个指针,用头指针代替。
8.程序清单
#include
#include
#define len sizeof(node)
typedef struct node
{
int data;
struct node *next;
}node,*list; 4 list creat()
{
node *head;
node *p1,*p2;
p1=p2=(list)malloc(len);
scanf("%d",&p1->data);
head=NULL;
while(p1->data!=-1)
{
p1->next=head; head=p1;
p1=(node*)malloc(sizeof(node));
scanf("%d",&p1->data);
}
return(head);
}
list add(list l1,list l2)
{
node *p1,*p2,*p3,*l3; l3=NULL;
int sum=0;
int j=0;//定义进位标志
p1=l1;
p2=l2;
while(p1&&p2)
{
p3=(list)malloc(len);
sum=p1->data+p2->data+j;
if(sum>9)
{
p3->data=sum-10;
j=1;
}
else if(sum>=0&&sum<10)
{
p3->data=sum;
j=0;
} 5 p1=p1->next;
p2=p2->next;
p3->next=l3;
l3=p3;
}
while(p1)
{
p3=(list)malloc(len);
sum=p1->data+j;
if(sum>9)
{
p3->data=sum-10;
j=1;
}
else if(sum>=0&&sum<10)
{
p3->data=sum;
j=0;
}
p1=p1->next;
p3->next=l3;
l3=p3;
}
while(p2)
{
p3=(list)malloc(len);
sum=p2->data+j;
if(sum>=10)
{
p3->data=sum-10;
j=1;
}
else if(sum>=0&&sum<10)
{
p3->data=sum;
j=0;
} 6 p2=p2->next;
p3->next=l3;
l3=p3;
}
if(j)
{
p3=(list)malloc(len);
p3->data=1;
p3->next=l3;
l3=p3;
}
//head=l3;
return(l3);
}
void out(list l)
{
node *p;
p=l;
while(p)
{
printf("%d",p->data);
p=p->next;
}
printf("\n");
}
void main()
{
list l1,l2,l3;
printf("请输入第一个整数,末尾输入-1表结束: ");
l1=creat();
out(l1);
printf("请输入第二个整数,末尾输入-1表结束: ");
l2=creat();
out(l2);
printf(”相加结果为: ”);
l3=add(l1,l2);
out(l3);} 7 实验二:算术表达式求值.
1.实验任务
以字符序列的形式从终端输入语法正确的,不含变量的整数表达式,利用给定的算符优先关系,实现对算术四则混合运算表达式的求值,并演示在求值过程中运算符栈,操作数栈,操作数栈和主要操作的变化过程。
分析:
(1) 输入要求:以字符序列的形式输入不含变量的表达式(表达式中的整数可以是多位的)。
(2) 演示要求:求值过程中利用到运算符栈,操作数栈。
(3) 程序所达到的功能:利用给定的算符优先关系,通过栈实现算数四则混合运算表达式求值。
2.设计思想
将表达式按顺序输入并进栈,有运算符栈和运算数栈两种,利用函数判断是否为运算符,若为运算符则转换为实数并入栈,第一个整数为栈底,最后一个整数为栈顶,输入#表示输入结束。利用栈顶指针进行出栈,用函数判断是否为运算符,若为运算符由给出的运算符优先级关系进行表达式计算,结果仍进栈,再进行比较、计算,直到最后计算出一个实数,最后与#比较再出栈即为表达式求值结果。
3.算法描述
(1) 定义两个指针 top base
(2) 屏幕输出:请输入表达式:(end #):输入任意的数并调用template
struct SqStack和template
Status Push(T1 &S,T2 e)使表达式入栈。
(3) 调用函数Status In(char Test,char* TestOp)使运算符入栈。
(4) 调用函数float Operate(float a,unsigned char theta, float b)和switch
(precede(GetTop,char>(OPTR), c))进行判断并计算表达式。
(5) 调用关系:主函数 void main()调用函数EvaluateExpression
4. 程序结构 8 template struct SqStack
操作结果:创建顺序栈结构模板。
template Status InitStack(T1 &S)
操作结果:初始化栈模板。
template Status Push(T1 &S,T2 e)
操作结果:表达式入栈。
template Status Pop(T1 &S,T2 &e) 操作结果:表达式出栈。
template T2 GetTop(T1 S)
操作结果:获取栈顶元素。
Status In(char Test,char* TestOp)
操作结果:判断是否为运算符。
float Operate(float a,unsigned char theta, float b)
操作结果:运算。
switch (precede(GetTop,char>(OPTR), c))
操作结果:判断并进行出栈运算。
主函数
void main()
{
printf("请输入表达式(end #):\n");
printf("结果为%d\n",EvaluateExpression());
}
5.运行结果请输入表达式(end#):1+2*3—6/3+(3+2)*3 #
结果为:20.
6.心得体会
通过本次程序编写,我对栈以及利用栈进行算术表达式的求值的认识有了提高。我体会到了编写程序需要耐心和细心,少加或多加一个括号都会导致程序出错。要把算法付诸于程序,需要不断调试并修改。
7.程序清单
#include
#include
#include
#define error 0
#define ok 1
#define overflow -1