1、长整数四则运算一 试验目的和要求1. 实验目的 了解线性表的逻辑结构特性,熟练掌握线性表的链式存储结构,熟练掌握线性表在链式存储结构上实现基本操作:查找,插入,删除的算法。能在实际应用中选用适合的链表结构。加深对链表的本质了解。2. 实验要求 利用双向链表实现长整数的存储,每个结点含一个整型变量。设计一个实现任意长的整数进行四则运算的演示程序。二 实验环境萨大苏打sdasd 本程序可以在98/2000/XP下运行,可以用VC+6.0执行三 程序的逻辑框图四, 程序源代码/*list.h*/#include#include#include#include#define TRUE 1#define
2、 FALSE 0#define OK 1#define ERROR 0#define INFEASLBLE -1#define OVERFLOW -2typedef int Status;typedef int ElemType;typedef struct DuLNode ElemType data; struct DuLNode *prior,*next;DuLNode,*DuLinkList; /构造一个空的双向循环线性表,L为头结点Status InitList_DuL(DuLinkList &L);/在L中确定第i个元素的位置指针p DuLinkList GetElemP_DuL(D
3、uLinkList L,int i);/在带头结点的双链循环线性表L中第i个位置之前插入元素e , /i的合法值为1=i=ListLength_DuL(L)+1Status ListInsert_DuL(DuLinkList &L,int i,ElemType e);/删除带头结点的双链循环线性表L中第i个元素,i的合法值为1=i=ListLength_DuL(L)Status ListDelete_DuL(DuLinkList &L,int i,ElemType &e);/若L为空表,则返回TRUE,否则返回FALSE bool ListEmpty_DuL(DuLinkList L);/线性
4、表L已存在,返回L中数据元素个数Status ListLength_DuL(DuLinkList L);/若线性表L已存在,将L置为空表Status ClearList_DuL(DuLinkList &L);/销毁线性表LStatus DestroyList_DuL(DuLinkList &L);/用e返回L中第i个数据元素的值void GetElem_DuL(DuLinkList L,int i,ElemType &e);/返回双向循环链表L中e出现的次数int Counter_DuL(DuLinkList L,ElemType e);/返回第n个e的在链表中位置 n的合法值为0=nnext
5、=L; L-prior=L; return OK;/InitList_DuLDuLinkList GetElemP_DuL(DuLinkList L,int i)/在L中确定第i个元素的位置指针p DuLinkList p; p=L; for(int j=0;jnext; return (p);/GetElemP_DuLStatus ListInsert_DuL(DuLinkList &L,int i,ElemType e)/在带头结点的双链循环线性表L中第i个位置之后插入元素e , /i的合法值为0=i DuLinkList s,p; if(idata=e; s-prior=p;s-next
6、=p-next; p-next-prior=s;p-next=s; return OK; /ListInsert_DuLStatus ListDelete_DuL(DuLinkList &L,int i,ElemType &e)/删除带头结点的双链循环线性表L中第i个元素,i的合法值为1=idata; p-prior-next=p-next; p-next-prior=p-prior; free(p); return OK;/ListDelete_DuLbool ListEmpty_DuL(DuLinkList L)/若L为空表,则返回TRUE,否则返回FALSE if(L-prior=L-n
7、ext)return TRUE; else return FALSE;/listElemty_DuLStatus ListLength_DuL(DuLinkList L)/线性表L已存在,返回L中数据元素个数 int i=0; DuLinkList p=NULL; for(p=L;p-next!=L;p=p-next) i+; return (i);/ListLength_DuLStatus ClearList_DuL(DuLinkList &L)/若线性表L已存在,将L置为空表 ElemType e; if(!ListEmpty_DuL(L) for(int i=1;i=ListLength
8、_DuL(L);i+) ListDelete_DuL(L,i,e); return OK; /ClearList_DuLStatus DestroyList_DuL(DuLinkList &L)/销毁线性表L ElemType e; if(!ListEmpty_DuL(L) for(int i=1;i=ListLength_DuL(L);i+) ListDelete_DuL(L,i,e); free(L); return OK;/DestroyList_DuLvoid GetElem_DuL(DuLinkList L,int i,ElemType &e)/用e返回L中第i个数据元素的值 if(
9、iListLength_DuL(L) printf(The Function GetElem_Sq() found Nothing in this positionn); else e=GetElemP_DuL(L,i)-data; /GetElem_DuLint Counter_DuL(DuLinkList L,ElemType e)/返回双向循环链表L中e出现的次数 int i; DuLinkList p=NULL; for(i=0,p=L;p-next!=L;p=p-next) if(p-data=e)i+; return i+1;/Counter_DuLint Position_DuL
10、(DuLinkList L,int n,ElemType e)/返回第n个e的在链表中位置 n的合法值为0n=Counter_DuL( L,n) int i,j; DuLinkList p=NULL; if(nCounter_DuL(L,e)return OVERFLOW; 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*/#includevoid decride_d() printf(*n); print
11、f(*注意! 请严格按照国家对于长整数的表示习惯: n); printf(*即每四位一组;组间用,隔开;每个数以;结束 n); printf(*否则可能导致系统运行出错 ! n); printf(*n); printf(输入N:退出,按任意键继续,回车进行计算!n); printf(*n);/*ExChange.cpp*/#includefunction.h #includevoid exchange(DuLinkList &L,int &j) int i=0,sum=0; DuLinkList t; ElemType e; for(i=j,sum=0;i0;i-) t=GetElemP_Du
12、L(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*/#includefunction.h/*/*操作函数operate(DuLinkList )*/*/void operate(DuLinkList p) DuLinkList q; int k=0,i=0,n=0; k=Counte
13、r_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;inext-data=-)f0=-; /判断正负数 else f0=+; for(i=1;inext-data=-) fi=-; else fi=+; for(q=p,i=0;inext; for(;q!=GetElemP_DuL(p,ji);q=q-next) if(q-data=,)n+; numi=n+1; output(Pa
14、ck_Up(calculate(p,j,f,num,k); free(j);free(f);free(num); DestroyList_DuL(p); /operate/*-*/DuLinkList calculate(DuLinkList p,int*j,char *f,int *num,int k) /计算 DuLinkList r; int sum=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;ik;i+) if(numidata=,)ji-=1;
15、sum+=t*GetElemP_DuL(p,ji-1)-data; numi-; /for for(i=i-1;i=0;i-) ji-=1; if(sum+JW)-10000)ListInsert_DuL(r,0,sum+JW);JW=0; else ListInsert_DuL(r,0,(sum+JW)%10000);JW=(sum+JW)/10000; /for return r;/calculate /*-*/DuLinkList Pack_Up(DuLinkList r) /整理链表r ElemType e; int i=0; for(i=1;idata=0) ListDelete_D
16、uL(r,1,e); else break; /for 清零。 if(GetElemP_DuL(r,1)-datadata=-; for(i=ListLength_DuL(r);i0;i-) GetElemP_DuL(r,i)-data*=(-1); /if for(i=ListLength_DuL(r);i1;i-) if(GetElemP_DuL(r,i)-datadata-; GetElemP_DuL(r,i)-data+=10000; /for for(i=1;idata=0) ListDelete_DuL(r,1,e); else break; /for 清零。 return r;/
17、Pack_Up/*-*/ void output(DuLinkList r) int x=0,i=0; if(GetElemP_DuL(r,0)-data=-)printf(-); for(i=1;idata); for(int j=0;jdata); if(GetElemP_DuL(r,i)-next!=r)printf(,); /for DestroyList_DuL(r);/output/*-*/int max(int *num,int k ) /返回最大值 int i=0,a=0,b=0; a=num0; b=num1; for(i=1;ik;i+) if(a=b) a=b; b=nu
18、mi+1; return a;/max/*-*/int counter(int a) /计算整数位数 if(1000=a&a10000) return 4; else if(100=a&a1000)return 3; else if(10=a&a100)return 2; else if( 0=a&a10)return 1;/counter/*Read.cpp*/#includefunction.h/*/*读入函数read_r()*/*/DuLinkList read_r() DuLinkList L; ElemType e; int i=0,j=0,n=0; InitList_DuL(L);
19、 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*/#includefunction.h#includeint main() char ch; decride_d(); do printf(请输入长整数:.n); operate(read_r(); printf(n); system(Pause); decride_d(); fflush( stdin ); while(ch=getch()!=N&ch!=n); return 0;五. 实验数据和结果分析六. 总结通过本实验,对链表的逻辑结构特性有一定的了解,对线性表的链式存储结构有比较深刻的印象
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1