长整数四则运算.docx

上传人:b****1 文档编号:23307546 上传时间:2023-05-16 格式:DOCX 页数:18 大小:41.33KB
下载 相关 举报
长整数四则运算.docx_第1页
第1页 / 共18页
长整数四则运算.docx_第2页
第2页 / 共18页
长整数四则运算.docx_第3页
第3页 / 共18页
长整数四则运算.docx_第4页
第4页 / 共18页
长整数四则运算.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

长整数四则运算.docx

《长整数四则运算.docx》由会员分享,可在线阅读,更多相关《长整数四则运算.docx(18页珍藏版)》请在冰豆网上搜索。

长整数四则运算.docx

长整数四则运算

一试验目的和要求

1.实验目的

了解线性表的逻辑结构特性,熟练掌握线性表的链式存储结构,熟练掌握线性表在链式存储结构上实现基本操作:

查找,插入,删除的算法。

能在实际应用中选用适合的链表结构。

加深对链表的本质了解。

2.实验要求

利用双向链表实现长整数的存储,每个结点含一个整型变量。

设计一个实现任意长的整数进行四则运算的演示程序。

二实验环境

本程序可以在98/2000/XP下运行,可以用VC++6.0执行

三程序的逻辑框图

 

 

四,程序源代码

/*list.h*/

#include

#include

#include

#include

#defineTRUE1

#defineFALSE0

#defineOK1

#defineERROR0

#defineINFEASLBLE-1

#defineOVERFLOW-2

typedefintStatus;

typedefintElemType;

typedefstructDuLNode

{

ElemTypedata;

structDuLNode*prior,*next;

}DuLNode,*DuLinkList;

//构造一个空的双向循环线性表,L为头结点

StatusInitList_DuL(DuLinkList&L);

//在L中确定第i个元素的位置指针p

DuLinkListGetElemP_DuL(DuLinkListL,inti);

//在带头结点的双链循环线性表L中第i个位置之前插入元素e,

//i的合法值为1<=i<=ListLength_DuL(L)+1

StatusListInsert_DuL(DuLinkList&L,inti,ElemTypee);

//删除带头结点的双链循环线性表L中第i个元素,i的合法值为1<=i<=ListLength_DuL(L)

StatusListDelete_DuL(DuLinkList&L,inti,ElemType&e);

 

//若L为空表,则返回TRUE,否则返回FALSE

boolListEmpty_DuL(DuLinkListL);

//线性表L已存在,返回L中数据元素个数

StatusListLength_DuL(DuLinkListL);

//若线性表L已存在,将L置为空表

StatusClearList_DuL(DuLinkList&L);

//销毁线性表L

StatusDestroyList_DuL(DuLinkList&L);

//用e返回L中第i个数据元素的值

voidGetElem_DuL(DuLinkListL,inti,ElemType&e);

//返回双向循环链表L中e出现的次数

intCounter_DuL(DuLinkListL,ElemTypee);

//返回第n个e的在链表中位置n的合法值为0<=n<=Counter_DuL(L,n)

intPosition_DuL(DuLinkListL,intn,ElemTypee);

/*function.cpp*/

#include"list.h"

/**************************************************************************************************/

/****************************函数声明**************************************************************/

/**************************************************************************************************/

DuLinkListcalculate(DuLinkListp,int*j,char*f,int*num,intk);

voidoutput(DuLinkListr);

DuLinkListPack_Up(DuLinkListr);//整理链表r

voidexchange(DuLinkList&L,int&j);

DuLinkListread_r();

voidoperate(DuLinkListp);

voiddecride_d();

intcounter(inta);//计算整数位数

intmax(int*num,intk);//返回最大值

/*list.cpp*/

#include"list.h"

 

StatusInitList_DuL(DuLinkList&L)

{//构造一个空的双向循环线性表,L为头结点

L=(DuLinkList)malloc(sizeof(DuLNode));

if(!

L)exit(OVERFLOW);

L->next=L;

L->prior=L;

returnOK;

}//InitList_DuL

 

DuLinkListGetElemP_DuL(DuLinkListL,inti)

{//在L中确定第i个元素的位置指针p

DuLinkListp;

p=L;

for(intj=0;j

p=p->next;

return(p);

}//GetElemP_DuL

 

StatusListInsert_DuL(DuLinkList&L,inti,ElemTypee)

{//在带头结点的双链循环线性表L中第i个位置之后插入元素e,

//i的合法值为0<=i

DuLinkLists,p;

if(i<0)returnOVERFLOW;

else

{

p=GetElemP_DuL(L,i);

if(!

(p))

returnERROR;

s=(DuLinkList)malloc(sizeof(DuLNode));

if(!

s)returnERROR;

s->data=e;

s->prior=p;s->next=p->next;

p->next->prior=s;p->next=s;

returnOK;

}

}//ListInsert_DuL

 

StatusListDelete_DuL(DuLinkList&L,inti,ElemType&e)

{//删除带头结点的双链循环线性表L中第i个元素,i的合法值为1<=i<=ListLength_DuL(L)

DuLinkListp;

if(!

(p=GetElemP_DuL(L,i))||p==L)

returnERROR;

e=p->data;

p->prior->next=p->next;

p->next->prior=p->prior;

free(p);

returnOK;

}//ListDelete_DuL

 

boolListEmpty_DuL(DuLinkListL)

{//若L为空表,则返回TRUE,否则返回FALSE

if(L->prior==L->next)returnTRUE;

elsereturnFALSE;

}//listElemty_DuL

 

StatusListLength_DuL(DuLinkListL)

{//线性表L已存在,返回L中数据元素个数

inti=0;

DuLinkListp=NULL;

for(p=L;p->next!

=L;p=p->next)

i++;

return(i);

}//ListLength_DuL

 

StatusClearList_DuL(DuLinkList&L)

{//若线性表L已存在,将L置为空表

ElemTypee;

if(!

ListEmpty_DuL(L))

for(inti=1;i<=ListLength_DuL(L);i++)

ListDelete_DuL(L,i,e);

returnOK;

}//ClearList_DuL

 

StatusDestroyList_DuL(DuLinkList&L)

{//销毁线性表L

ElemTypee;

if(!

ListEmpty_DuL(L))

for(inti=1;i<=ListLength_DuL(L);i++)

ListDelete_DuL(L,i,e);

free(L);

returnOK;

}//DestroyList_DuL

 

voidGetElem_DuL(DuLinkListL,inti,ElemType&e)

{//用e返回L中第i个数据元素的值

if(i<0||i>ListLength_DuL(L))

printf("TheFunctionGetElem_Sq()foundNothinginthisposition\n");

else

e=GetElemP_DuL(L,i)->data;

}//GetElem_DuL

 

intCounter_DuL(DuLinkListL,ElemTypee)

{//返回双向循环链表L中e出现的次数

inti;

DuLinkListp=NULL;

for(i=0,p=L;p->next!

=L;p=p->next)

if(p->data==e)i++;

returni+1;

}//Counter_DuL

 

intPosition_DuL(DuLinkListL,intn,ElemTypee)

{//返回第n个e的在链表中位置n的合法值为0

inti,j;

DuLinkListp=NULL;

if(n<1||n>Counter_DuL(L,e))returnOVERFLOW;

else

{

for(i=0,j=0,p=L->next;p!

=L;p=p->next)

{

j++;

if(p->data==';')i++;

if(i==n)break;

}

return(j);

}//else

}//Position_DuL

/*decride.cpp*/

#include

voiddecride_d()

{

printf("*************************************************************\n");

printf("*注意!

!

请严格按照国家对于长整数的表示习惯:

\n");

printf("*即每四位一组;组间用\',\'隔开\';\'每个数以\";\"结束\n");

printf("*否则可能导致系统运行出错!

!

!

\n");

printf("**************************************************************\n");

printf("输入N:

退出,按任意键继续,回车进行计算!

\n");

printf("**************************************************************\n");

}

/*ExChange.cpp*/

#include"function.h"

#include

 

voidexchange(DuLinkList&L,int&j)

{

inti=0,sum=0;

DuLinkListt;

ElemTypee;

for(i=j,sum=0;i>0;i--)

{

t=GetElemP_DuL(L,ListLength_DuL(L));

sum+=((int)t->data-48)*(int)pow(10.0,(double)(j-i));

ListDelete_DuL(L,ListLength_DuL(L),e);

}

ListInsert_DuL(L,ListLength_DuL(L),sum);

j=0;

 

}//exchange

/*Operration.cpp*/

#include"function.h"

/**************************************************************************************************/

/****************************操作函数operate(DuLinkList)******************************************/

/**************************************************************************************************/

voidoperate(DuLinkListp)

{

DuLinkListq;

intk=0,i=0,n=0;

k=Counter_DuL(p,';');

int*j=(int*)malloc(k*sizeof(int));

char*f=(char*)malloc(k*sizeof(char));

int*num=(int*)malloc(k*sizeof(int));

for(i=0;i

j[i-1]=Position_DuL(p,++i,';');

if(p->next->data=='-')f[0]='-';//判断正负数

elsef[0]='+';

for(i=1;i

{

if(GetElemP_DuL(p,j[i-1])->next->data=='-')

f[i]='-';

elsef[i]='+';

}

for(q=p,i=0;i

{

n=0;

q=q->next;

for(;q!

=GetElemP_DuL(p,j[i]);q=q->next)

if(q->data==',')n++;

num[i]=n+1;

}

output(Pack_Up(calculate(p,j,f,num,k)));

free(j);free(f);free(num);

DestroyList_DuL(p);

}//operate

/*------------------------------------------------------------------------------------------------------*/

DuLinkListcalculate(DuLinkListp,int*j,char*f,int*num,intk)//计算

{

DuLinkListr;

intsum=0,i=0,t=0,m=0,ma=0,JW=0;

InitList_DuL(r);

for(JW=0,m=0,ma=max(num,k);m<=ma;m++)

{

for(i=0,sum=0;i

{

if(num[i]<=0);

else

{

t=(f[i]=='-'?

-1:

1);

if(GetElemP_DuL(p,j[i]-1)->data==',')j[i]-=1;

sum+=t*GetElemP_DuL(p,j[i]-1)->data;

num[i]--;

}

}//for

for(i=i-1;i>=0;i--)

j[i]-=1;

if((sum+JW)<10000&&(sum+JW)>-10000){ListInsert_DuL(r,0,sum+JW);JW=0;}

else{ListInsert_DuL(r,0,(sum+JW)%10000);JW=(sum+JW)/10000;}

}//for

returnr;

}//calculate

/*------------------------------------------------------------------------------------------------------*/

DuLinkListPack_Up(DuLinkListr)//整理链表r

{

ElemTypee;

inti=0;

for(i=1;i

{

if(GetElemP_DuL(r,1)->data==0)

ListDelete_DuL(r,1,e);

elsebreak;

}//for清零。

if(GetElemP_DuL(r,1)->data<0)

{

GetElemP_DuL(r,0)->data='-';

for(i=ListLength_DuL(r);i>0;i--)

GetElemP_DuL(r,i)->data*=(-1);

}//if

for(i=ListLength_DuL(r);i>1;i--)

{

if(GetElemP_DuL(r,i)->data<0)

{

GetElemP_DuL(r,i-1)->data--;

GetElemP_DuL(r,i)->data+=10000;

}

}//for

for(i=1;i

{

if(GetElemP_DuL(r,1)->data==0)

ListDelete_DuL(r,1,e);

elsebreak;

}//for清零。

returnr;

}//Pack_Up

/*------------------------------------------------------------------------------------------------------*/

voidoutput(DuLinkListr)

{

intx=0,i=0;

if(GetElemP_DuL(r,0)->data=='-')printf("-");

for(i=1;i<=ListLength_DuL(r);i++)

{

if(i!

=1)

{

x=counter(GetElemP_DuL(r,i)->data);

for(intj=0;j<4-x;j++)

printf("0");

}

printf("%d",GetElemP_DuL(r,i)->data);

if(GetElemP_DuL(r,i)->next!

=r)printf(",");

}//for

DestroyList_DuL(r);

}//output

/*------------------------------------------------------------------------------------------------------*/

intmax(int*num,intk)//返回最大值

{

inti=0,a=0,b=0;

a=num[0];

b=num[1];

for(i=1;i

{

if(a<=b)

a=b;

b=num[i+1];

}

returna;

}//max

/*------------------------------------------------------------------------------------------------------*/

intcounter(inta)//计算整数位数

{

if(1000<=a&&a<10000)return4;

elseif(100<=a&&a<1000)return3;

elseif(10<=a&&a<100)return2;

elseif(0<=a&&a<10)return1;

}//counter

/*Read.cpp*/

#include"function.h"

/**************************************************************************************************/

/****************************读入函数read_r()******************************************************/

/**************************************************************************************************/

DuLinkListread_r()

{

DuLinkListL;

ElemTypee;

inti=0,j=0,n=0;

InitList_DuL(L);

for(j=0;(e=getchar())!

='\n';)

{

if(e==','||e==';')exchange(L,j);

ListInsert_DuL(L,ListLength_DuL(L),(int)e);

if(e!

=','&&e!

=';'&&e!

='-')++j;

}

return(L);

}//read_r

/*main.cpp*/

#include"function.h"

#include

intmain()

{

charch;

decride_d();

do

{

printf("请输入长整数:

....\n");

operate(read_r());

printf("\n");

system("Pause");

decride_d();

fflush(stdin);

}while((ch=getch())!

='N'&&ch!

='n');

return0;

}

五.实验数据和结果分析

六.总结

通过本实验,对链表的逻辑结构特性有一定的了解,对线性表的链式存储结构有比较深刻的印象,灵活运用线性表在

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 文化宗教

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1