版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
4.4双向链表应用举例双向链表的每个结点分别包含指向后继结点和前驱结点两个指针。既可以从链首往链尾方向处理也可以从链尾往链首方向处理注意,采用双向链表存储后,链表的各基本操作需要同时维护好链表结点指针构成的两个方向链。下面以无符号大数的表示和加法运算实现为例介绍双链表处理。12图1.5无符号大数的双向链表表示struct Node{int digit;//数字structNode*next,*prev;//前后结点指针};//无符号大数结构体structUBigNumber{intdigitCount;//位数structNode*pHead,*pTail;//指向头结点,尾结点};3//下列函数返回的大数占用的内存资源由函数调用者负责释放//输入无符号大数structUBigNumberInputUBN();//打印无符号大数voidPrintUBN(structUBigNumberubn);//两个无符号大数相加structUBigNumberAddUBN(structUBigNumber*pA,structUBigNumber*pB);//销毁无符号大数,释放空间voidDestoryUBN(structUBigNumber*pA);4(待续)//下列函数是无符号大数处理辅助函数//建立表示无符号大数用带头结点双链表void_InitUBN(structUBigNumber*pUBN);//无符号大数尾部添加一位数void_AppendDigit(structUBigNumber*pUBN,intdigit);//无符号大数前部添加一位数void_AppendFrontDigit(structUBigNumber*pUBN,intdigit);//无符号大数规范表示,去除高位多余0,至少含一位数字void_Normalize(structUBigNumber*pUBN);//动态分配一个结点,返回结点指针//分配失败时,简化程序,退出运行structNode*_NewNode();5//输入无符号大数structUBigNumberInputUBN(){structUBigNumberresult;_InitUBN(&result);charch;
...//跳过非数字字符while(ch>='0'&&ch<='9'){_AppendDigit(&result,ch-'0');//添加1位ch=getchar();}_Normalize(&result);returnresult;}6//建立表示无符号大数用带头结点双链表void_InitUBN(structUBigNumber*pUBN){structNode*p=_NewNode();pUBN->pHead=pUBN->pTail=p;//建头结点p->next=p->prev=NULL;pUBN->digitCount=0;//位数0}7//无符号大数尾部添加一位数void_AppendDigit(structUBigNumber*pUBN,intdigit){if(pUBN->digitCount==1&&pUBN->pTail->digit==0)//原只有一个高位0{pUBN->pTail->digit=digit;//位数不变,数值为0return;}structNode*p=_NewNode();//申请新结点p->digit=digit;//设置结点数值p->next=NULL;//修改双链表,添加成为新尾部结点p->prev=pUBN->pTail;pUBN->pTail->next=p;pUBN->pTail=p;++pUBN->digitCount;//修改位数}8//无符号大数前添加一位数void_AppendFrontDigit(structUBigNumber*pUBN,intdigit){structNode*p=_NewNode();//申请新结点p->digit=digit;//设置结点数值p->next=pUBN->pHead->next;//修改双链表,添加在头结点后if(p->next!=NULL)p->next->prev=p;p->prev=pUBN->pHead;pUBN->pHead->next=p;if(pUBN->pTail==pUBN->pHead)pUBN->pTail=p;//原先只有头结点时,新结点也是尾结点++pUBN->digitCount;//修改位数}9//无符号大数规范表示,去除高位多余0,至少含一位数字void_Normalize(structUBigNumber*pUBN){if(pUBN->digitCount==0)_AppendDigit(pUBN,0);//去除高位多余的0while(pUBN->digitCount>1&&pUBN->pHead->next->digit==0){structNode*p;p=pUBN->pHead->next;//待删除的结点pUBN->pHead->next=p->next;//正向链表中删除p->next->prev=pUBN->pHead;//反向链表中删除free(p);//释放结点--pUBN->digitCount;//调整位数}}10//打印无符号大数voidPrintUBN(structUBigNumberubn){assert(ubn.digitCount>0&&ubn.pHead->next!=NULL);//断言:至少有1位数字structNode*la=ubn.pHead->next;//头结点无数据,跳过while(la){printf("%d",la->digit);la=la->next;}}11//两个无符号大数相加structUBigNumberAddUBN(structUBigNumber*pA,structUBigNumber*pB){structUBigNumberresult,*pResult=&result;_InitUBN(pResult);intiCarry=0;//进位,初始0structNode*p1,*p2;p1=pA->pTail;p2=pB->pTail;//从低位开始处理while(p1!=pA->pHead&&p2!=pB->pHead)//两数相同位处理{intdigit=p1->digit+p2->digit+iCarry;iCarry=digit/10;digit%=10;//新进位h和当前结果位_AppendFrontDigit(pResult,digit);//添加至结果最高位p1=p1->prev;//准备处理前一位p2=p2->prev;}(待续)
12while(p1!=pA->pHead)//第一大数剩余位处理{intdigit=p1->digit+iCarry;iCarry=digit/10;digit%=10;_AppendFrontDigit(pResult,digit);p1=p1->prev;}while(p2!=pB->pHead)//第二大数剩余位处理{intdigit=p2->digit+iCarry;iCarry=digit/10;digit%=10;_AppendFrontDigit(pResult,digit);p2=p2->prev;}(待续)
13if(iCarry!=0)//最后进位处理_AppendFrontDigit(pResult,iCarry);returnresult;}14//销毁无符号大数,释放空间voidDestoryUBN(structUBigNumber*pUBN){while(pUBN->pHead!=NULL)//清空后应该只剩一个头结点{structNode*p=pUBN->pHead;//待删除结点pUBN->pHead=p->next;//尾指针前移free(p);//释放结点}}15//动态分配一个结点,返回结点指针//分配失败时,简化程序,退出运行structNode*_NewNode(){structNode*p;p=(structNode*)malloc(sizeof(structNode));if(p==NULL)//分配失败{printf("Error:outofmemory\n");exit(-1);//简化程序,退出运行}returnp;}16intmain(){structUBigNumberA,B,C;A=InputUBN();B=InputUBN();//无符号大数输入C=AddUBN(&A,&B);//无符号大数相加PrintUBN(A);printf("+");PrintUBN(B);printf("=");PrintUBN(C);DestoryUBN(&A);//销毁无符号大数DestoryUBN(&B);DestoryUBN(&C);return0;}运行情况如下:21433245327543276473624763245324700342463724567342587325874325874554475143324532754327647362476324532470034+463724567342587325874325874554475=143788257321670234688350650407024509174.5其
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 网红儿童常见面试题目与解答
- 2026年中考语文百校联考冲刺押题密卷及答案(共十八套)
- 环保小卫士测试题目与答案
- 审计学基础知识题库含答案解析
- 全国计算机等级考试(二级Web程序设计)试题及答案
- 教育孩子的心得体会(范文四篇)
- 纪律教育学习月活动心得体会(通-用6篇)
- 2026年信息管理员岗位考试试题及答案
- 2026年最-新注册会计师考试《会计》重难点章节试题与答案
- 2025年人工智能(AI)训练师专业知识考试题(附答案)
- 2026年四川省拟任县处级党政领导职务政治理论水平任职资格考试冲刺试题及答案
- 2026年云南高考(历史)考试试卷真题及答案
- 2026年医师定期考核业务水平测评理论考试(人文医学)练习题及答案
- 建筑识图与构造
- 2026年高考全国2卷数学高考真题试题(含答案)
- 2025年高校教学统计分析岗笔试试题(附答案)
- 2026湖南娄底新化县经济发展投资集团有限公司人员招聘1人笔试历年参考题库附带答案详解
- 2026年水利水电建筑工程技术人员专项题库答案与解释
- 高考志愿填报数据特征与分布规律研究
- 福建省物业管理师职业技能鉴定考试(技能实操中级、四级)题库及答案
- 消防员职业特性与使命担当
评论
0/150
提交评论