版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 采用循环双向链表,能实现多个长整型进行加法运算 /*文件名: 1_2.c*实验环境: turbo c 2.0*完成时间: 2003年2月17日*-*改进说明:采用循环双向链表,能实现多个长整型进行加法运算.*/ #include #include #include #include #include #define true 1#define false 0#define operand_num 2#define positive 1#define negative 0 typedef int elemtype;typedef int status;typedef struct nodety
2、peelemtype data;struct nodetype *prior;struct nodetype *next; nodetype, *linktype; status createopheadbuff(linktype *, int);status createoperandlist(linktype *, int);void createresultlist(linktype *, linktype *, int);status deletezero(linktype *);status pushdatatolist(linktype *, int, int);status ap
3、pendnodetolist(linktype *, linktype);linktype computepnlist(linktype, linktype, int);linktype computeppnnlist(linktype, linktype, int);status makenode(linktype *, elemtype);status printlist(linktype);status clearmemory(linktype *, int);status deletelist(linktype);status errorprocess(char, int); int
4、main(void)int icounter,iopnum = 2;/*操作数的个数,默认为2 */char strnum10, corder5;linktype resultlist = null, /*结果链表的头指针 */*listheadbuff = null; /*指向操作数头指针缓冲 */ doprintf(请输入需要的操作数的个数,注意至少为2: );gets(strnum);iopnum = atoi(strnum); while (iopnum 2);/*构造操作数链表的头指针缓冲区 */createopheadbuff(&listheadbuff, iopnum);/*提示
5、用户输入数据,并构造操作数链表 */while (!createoperandlist(listheadbuff, iopnum)printf(n出现非法输入,需要退出吗?n);printf(键入y则退出,键入n重新输入(y/n):);gets(corder);if (corder0 = y | corder0 = y)clearmemory(listheadbuff, iopnum);return 0;printf(打印输入情况:n);for (icounter = 0; icounter iopnum; icounter+)printf(- - -第%d个操作数 - - -n, icoun
6、ter + 1);deletezero(listheadbuff + icounter);printlist(*(listheadbuff + icounter); /*相加所有操作数链表的结果,并存放在resultlist中*/createresultlist(&resultlist, listheadbuff, iopnum);printf(打印结果:n);printlist(resultlist); clearmemory(listheadbuff, iopnum);deletelist(resultlist);printf(运算完毕!);getch(); return 0; statu
7、s createopheadbuff(linktype *pbuff, int size)int icounter; *pbuff = (linktype *)malloc(sizeof(linktype) * size);if (!*pbuff)printf(error, the memory is overflow!n);return false;for (icounter = 0; icounter itemp | itemp 9999)printf(n出现非法输入 2!n);return false;/*为操作数链表加入结点 */makenode(&newnode, itemp);ap
8、pendnodetolist(headbuff + icounter, newnode);inodenum+; /*当前链表已经加入的一个结点 */if (*cpcurr = ;)/*将控制结点插在链表头 */pushdatatolist(headbuff + icounter, inodenum, isign);inodenum = 0; /*逻辑结点个数初始化为0 */isign = positive; /*符号标识默认为正的 */if (icounter + 1) iopnum)icounter+; /*标识下一个链表头指针 */cpcurrnum = cpcurr + 1;else i
9、f (*cpcurr = -)isign = negative; /*符号标识改为负的 */cpcurr+;cpcurrnum = cpcurr;else if (*cpcurr = +);/*读完后停止构造操作数链表 */if (*cpcurr = 0)pushdatatolist(headbuff + icounter, inodenum, isign);break; /* end for */ return true; /*正正,结果为正的.*负负,结果为负的.*长正短负,结果为正的.*长负短正,要变为长正短负,结果为负的.*异号时同样长*注意要删除每次算出的中间链表,最后传回resul
10、t*/void createresultlist(linktype *resulthead,linktype *headbuff, int iopnum)int icounter, isign;linktype resultlist = null, templist, currnode_1, currnode_2; for (resultlist = *headbuff, icounter = 1;icounter data 0 &(*(headbuff + icounter)-data 0)/*正正,结果为正的 */resultlist = computeppnnlist(templist,
11、 *(headbuff + icounter), positive);else if (resultlist-data data data + (*(headbuff + icounter)-data = 0) /*异号时同样长 */currnode_1 = resultlist;currnode_2 = *(headbuff + icounter);do /*直到找到第一个不等值的结点 */if (currnode_1-data currnode_2-data)isign = (resultlist-data 0) ?positive : negative;resultlist = comp
12、utepnlist(templist, *(headbuff + icounter), isign);break;else if (currnode_1-data data)isign = (*(headbuff + icounter)-data 0) ?positive : negative;resultlist = computepnlist(*(headbuff + icounter), templist, isign);break;currnode_1 = currnode_1-next;currnode_2 = currnode_2-next; while (currnode_1 !
13、= resultlist);else if (fabs(resultlist-data) fabs(*(headbuff + icounter)-data)isign = (resultlist-data 0) ? positive : negative;resultlist = computepnlist(templist, *(headbuff + icounter), isign);else if (fabs(resultlist-data) data)isign = (*(headbuff + icounter)-data 0) ?positive : negative;resultl
14、ist = computepnlist(*(headbuff + icounter), templist, isign); if (*headbuff templist | templist *(headbuff + icounter)deletelist(templist); /*清除上次的中间链表 */*删除多出的0,如删除0000,0010,3333中的0000为0010,3333*/deletezero(&resultlist);*resulthead = resultlist; /*每次只处理两个操作数链表,符号相异时list_1为正的, list_2为负的*如果两个操作数链表不一样
15、长则list_1为长的结果链表的结构和操作*数链表一样,最后返回结果链表*/linktype computepnlist(linktype list_1, linktype list_2, int isign)int iresult = 0, iborrow = 0, iresultnodenum = 0;linktype currnodearray2,newnode = null, resultlist = null; /*初始为每一个操作数链表的尾结点地址 */currnodearray0 = (list_1)-prior;currnodearray1 = (list_2)-prior;
16、while (currnodearray0 != list_1)| (currnodearray1 != list_2)if (iborrow data 0)iborrow = 0;iresult = -1;else if (currnodearray0-data = 0)iborrow = -1; /*继续向高位借1位 */iresult = 9999; if (currnodearray0 != list_1)& (currnodearray1 != list_2)if (currnodearray0-data data)& iborrow = 0)iborrow = -1; /*不够减则
17、向高位借1位 */iresult += 10000;iresult += currnodearray0-data -currnodearray1-data; currnodearray0 = currnodearray0-prior;currnodearray1 = currnodearray1-prior;else if (list_1 != currnodearray0) /*处理剩下的链表 */iresult += currnodearray0-data;currnodearray0 = currnodearray0-prior; /*将算好的结点加入结果链表 */pushdatatol
18、ist(&resultlist, iresult, positive);iresultnodenum+;if (currnodearray0 = list_1)& (currnodearray1 = list_2)/*在链表头插入控制结点 */makenode(&newnode, iresultnodenum);pushdatatolist(&resultlist, iresultnodenum, isign); iresult = 0; /*准备计算下一个结点 */ return resultlist; /*每次只处理两个操作数链表,正正,结果为正的,负负,结果为负的 */linktype
19、computeppnnlist(linktype list_1, linktype list_2, int isign)int iresult = 0, icarry = 0, iresultnodenum = 0;linktype currnodearray2,newnode = null, resultlist = null; /*初始为每一个操作数链表的尾结点地址 */currnodearray0 = (list_1)-prior;currnodearray1 = (list_2)-prior; while (true)if (icarry 0) /*处理前一位的进位 */iresult
20、 += icarry;icarry = 0; if (currnodearray0 != list_1 &currnodearray1 != list_2)iresult += currnodearray0-data + currnodearray1-data;currnodearray0 = currnodearray0-prior;currnodearray1 = currnodearray1-prior;else if (currnodearray0 != list_1)iresult += currnodearray0-data;currnodearray0 = currnodearr
21、ay0-prior;else if (currnodearray1 != list_2)iresult += currnodearray1-data;currnodearray1 = currnodearray1-prior; if (iresult = 10000)icarry = iresult / 10000;iresult = iresult % 10000; pushdatatolist(&resultlist, iresult, positive);iresultnodenum+;if (icarry = 0 & currnodearray0 = list_1& currnodea
22、rray1 = list_2)makenode(&newnode, iresultnodenum);pushdatatolist( &resultlist, iresultnodenum, isign);break; iresult = 0; /*准备计算下一个结点 */ return resultlist; /*删除多出的0,如删除0000,0010,3333中的0000为0010,3333* ,但链表为只有一个逻辑结点为0时则不删除.*/status deletezero(linktype *list)linktype currnode, delnode; /*一旦遇到第一个不为0的结点则
23、退出,但*链表为只有一个逻辑结点为0时则不删除*/currnode = delnode = (*list)-next;while (fabs(*list)-data) 1 & currnode-data = 0)(*list)-next = currnode-next;currnode-next-prior = *list;delnode = currnode;currnode = currnode-next;free(delnode);/*控制结点减少一个逻辑结点的个数 */(*list)-data += (*list)-data 0) ? -1 : 1; return true; stat
24、us pushdatatolist(linktype *head, int inodenum, int sign)linktype newnode; /* sign为1时为正的, sign为0时为负的 */inodenum *= (sign = positive) ? 1 : -1;makenode(&newnode, inodenum);if (*head != null)/*将newnode所指的结点插入链表,使成为头结点 */newnode-next = *head;newnode-prior = (*head)-prior;(*head)-prior = newnode;newnode
25、-prior-next = newnode;*head = newnode; return true; status appendnodetolist(linktype *head, linktype newnode)static linktype currnode = null; if (*head = null)*head = currnode = newnode;else/*在链表尾部添加结点 */newnode-next = currnode-next;currnode-next = newnode;newnode-prior = currnode;newnode-next-prior
26、 = newnode;/*当前指针向前一步 */currnode = currnode-next; return true; status makenode(linktype *p, elemtype e)*p = (linktype)malloc(sizeof(nodetype) * 1);if (!(*p)printf(error, the memory is overflow!n);return false;(*p)-data = e;(*p)-prior = (*p)-next = (*p); return true; status printlist(linktype head)/* linktype currnode = head; use for debug */linktype currnode = head-next; if (head = null) return false;if (head-data data);currnode = currn
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论