计算机软件及应用数据结构实验报告_第1页
计算机软件及应用数据结构实验报告_第2页
计算机软件及应用数据结构实验报告_第3页
计算机软件及应用数据结构实验报告_第4页
计算机软件及应用数据结构实验报告_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

编号:江西理工大学数据结构课程设计报告班级:网络112班学号:09姓名:李秀光时间:2021年12月31日~2021年1月11日指导教师:涂燕琼井福荣2021年01月目录第一章数制转换 1一、需求分析 11、输入的形式和输入值的范围 12、输出的形式 13、程序所能到达的功能 14、测试数据 1二、概要设计 21、抽象数据类型的定义 22、主程序的流程以及各程序模块之间的层次调用关系 2三、详细设计 21、数据类型 22、伪码算法 33、流程图 54、调试分析 65、用户使用说明 66、测试结果 77、附录 8第二章一元多项式 11一、需求分析 111、输入的形式和输入值的范围 112、输出的形式 113、程序所能到达的功能 114、测试数据 12二、概要设计 121、抽象数据类型的定义 122、主程序的流程以及各程序模块之间的层次调用关系 13三、详细设计 131、数据类型 132、伪码算法 143、流程图 174、调试分析 185、用户使用说明 186、测试结果 197、附录 20第一章数制转换一、需求分析1、输入的形式和输入值的范围n和f的输入形式均为int型,n和f的输入范围均为1~327672、输出的形式十六进制10-15输出A-E,超过十六进制时按16以上数值按原值输出。3、程序所能到达的功能把十进制数n转换成任意进制数f〔对于输入的任意一个非负十进制整数,输出与其等值的任意进制数〔如二,四,八,十六进制〕。4、测试数据n〔十进制〕f〔进制〕输出值22210110354411202537681240032767167FFF 二、概要设计1、抽象数据类型的定义ADTStack{根本操作:InitStack(&S) 操作结果:构造一个空栈s。Push(&S,e)初始条件:栈s已存在。操作结果:插入元素e为新的栈顶元素。Pop(SqStack&S) 初始操作:栈s已存在且非空。操作结果:删除s的栈顶元素,并用e返回其值。StackEmpty(SqStackS) 初始条件:栈s已存在。 操作结果:假设栈为空那么返回1,否那么返回0。}ADTStack2、主程序的流程以及各程序模块之间的层次调用关系见〔三、详细设计3、流程图〕↓三、详细设计1、数据类型//=====ADTStack的表示与实现=====// //-----数制转换-----//#defineSTACK_INIT_SIZE100 //存储空间初始分配量#defineSTACKINCREMENT10 //存储空间分配增量typedefstruct{ int*base; int*top; intstacksize;}SqStack;//-----根本操作的函数原型说明-----//voidInitStack(SqStack&S) //构造一个空栈svoidPush(SqStack&S,inte)//插入e为新的栈顶元素intPop(SqStack&S) //删除s的栈顶元素,并用e返回其值intStackEmpty(SqStackS) //假设栈为空那么返回1,否那么返回0voidconversion(intn,intf) //对于输入的任意一个非负十进制整数,打印输出与其等值的八进制数2、伪码算法 //-----根本操作的算法描述-----//voidInitStack(SqStack&S){//构造一个空栈s S.base=(int*)malloc(STACK_INIT_SIZE*sizeof(int)); if(!S.base)exit(-2); S.top=S.base; S.stacksize=STACK_INIT_SIZE;}//InitStackvoidPush(SqStack&S,inte){//插入元素e为新的栈顶元素 if(S.top-S.base>=S.stacksize){S.base=(int*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(int)); if(!S.base)exit(-2); S.top=S.base+S.stacksize; S.stacksize+=STACKINCREMENT; } *S.top++=e;}//PushintPop(SqStack&S){ //删除s的栈顶元素,并用e返回其值 inte; if(S.top==S.base)return0; e=*--S.top; returne;}//PopintStackEmpty(SqStackS){ //假设栈为空那么返回1,否那么返回0 if(S.top==S.base)return1; elsereturn0;}//StackEmpty//对于输入的任意一个非负十进制整数,打印输出与其等值的八进制数voidconversion(intn,intf){ InitStack(S); while(n){ Push(S,n%f); n=n/f; } while(!StackEmpty(S)){ Pop(S,e) printf("%d",e); }}//conversion3、流程图输入n和fq=y||q=Y打印标题开始输入n和fq=y||q=Y打印标题开始输出:要换转的十进制数错误Y输出:要换转的十进制数错误n>0输入q Nn>0输入qf>0f>0Y输出:请输入正确的进制位! 输出:请输入正确的进制位!InitStack()初始化栈 YInitStack()初始化栈n!=0 Nn!=0Push(S,n%f) Y NPush(S,n%f)Nn=n/fn=n/f!StackEmpty(S) !StackEmpty(S)Y输出转换后的数值输出转换后的数值结束结束 4、调试分析〔1〕调试过程中遇到的问题和解决方法在调试过程中主要遇到一些符号打错或输出、输出和函数之类的名称打错或漏打,根据第一行提示的错误然后进行修改,修改之后再运行调试,如此循环,直到彻底正常运行,后面就是优化见面的问题了。〔2〕算法的时空分析和改良设想算法时间复杂度:f(n)改良设想:可在输出时将>10的数字用A-Z输出。〔3〕经验和体会等从这是实验当中,我体会最深的是编程要特别仔细,因为稍不注意就可能打错字母,这些错误有时在调试当中特别难找,就是一个小小的字母可能也要让你花上好长时间来修改,还有就是要形成自己的编程风格,这样的代码看起来不至于那么乱,给有人条理的感觉,也便于代码的维护。5、用户使用说明运行 输入n和f〔n和f均大于0〕n和f正确输入,然后打印输出n转换成f进制后的数值输入q〔输入q=〔y||Y〕那么继续转换,否那么结束〕结束。6、测试结果 7、附录〔1〕带注释的源程序#include<stdio.h>#include<stdlib.h>#defineSTACK_INIT_SIZE100#defineSTACKINCREMENT10typedefstruct{int*base;int*top;intstacksize;}SqStack;//构造一个空栈voidInitStack(SqStack&S){S.base=(int*)malloc(STACK_INIT_SIZE*sizeof(int));if(!S.base)exit(-2);S.top=S.base;S.stacksize=STACK_INIT_SIZE;}//插入e为新的栈顶元素voidPush(SqStack&S,inte){if(S.top-S.base>=S.stacksize){S.base=(int*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(int));if(!S.base)exit(-2);S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;}*S.top++=e;}//删除s的栈顶元素,并用e返回其值intPop(SqStack&S){inte;if(S.top==S.base)return0;e=*--S.top;returne;}//假设栈为空那么返回1,否那么返回0intStackEmpty(SqStackS){if(S.top==S.base)return1;elsereturn0;}//对于输入的任意一个非负十进制整数,打印输出与其等值的八进制数voidconversion(intn,intf){inte;SqStackS;InitStack(S);while(n){Push(S,n%f);n=n/f;}while(!StackEmpty(S)){switch(e=Pop(S)){case10:printf("A");break;case11:printf("B");break;case12:printf("C");break;case13:printf("D");break;case14:printf("E");break;case15:printf("F");break;default:printf("%d",e);break;}}printf("\n\n");}//操作,输入要转换的十进制数与要转换成的进制位voidOperate(){intn,f;charq='y';while(q=='y'||q=='Y'){printf("请输入要转换的十进制数值:");scanf("%d",&n);printf("\n请输入要转换成的进制位:");scanf("%d",&f);printf("\n%d转换成%d进制数:",n,f);if(n>0){if(f>0){conversion(n,f);}elseprintf("请输入正确的进制位!\n\n");}else{printf("要换转的十进制数错误。\n\n");}printf("是否继续?〔y/n〕:");scanf("%s",&q);printf("\n");}}//标题voidtitle(){printf("\t\t\t***************************\n");printf("\t\t\t*\t数制转换\t*\n");printf("\t\t\t***************************\n");}intmain(){title();printf("\n");Operate();}〔2〕程序文件名的清单数制转换.cpp第二章一元多项式一、需求分析1、输入的形式和输入值的范围choose、m〔非零项个数〕和expn〔指数〕的输入形式均为int型,coef〔系数〕的输入形式为float型,choose的输入值为1、2和0,m和expn的输入范围均为1~32767,coef的输入范围为±3.4E38。2、输出的形式例:3.00X^8+8.00X^7-5.00X^5+1.00X^2-2.35X^13、程序所能到达的功能任务:能够按照指数降序排列建立并输出多项式。能够完成两个多项式的相加、相减,并将结果输入。4、测试数据一元多项式运算一元多项式结果-x2+x3+2x2+3x3+4x54x5+4x3+1x2x3-2x4+5.2x+x2–5x4+3.2x-7x4+1x3+1x2+8.4x1-2x2+3x3+4x4 -x–x2+4x3+x4 3x4-1x3-1x2-x1二、概要设计1、抽象数据类型的定义ADTPolynomial{ 根本操作:CreatPolyn(&P,m) 操作结果:输入m项的系数和指数,建立一个一元多项式p DestroyPolyn(&P) 初始条件:一元多项式P已存在。 操作结果:销毁一元多项式P。PrintPolyn(P) 初始条件:一元多项式P已存在。 操作结果:打印输出一元多项式P。AddPolyn(&Pa,&Pb) 初始条件:一元多项式Pa和Pb已存在。 操作结果:多项式加法:Pa=Pa+Pb,并销毁一元多项式PbSubtractPolyn(&Pa,&Pb) 初始条件:一元多项式Pa和Pb已存在。 操作结果:多项式减法:Pa=Pa-Pb,并销毁一元多项式Pb }ADTPolynomial2、主程序的流程以及各程序模块之间的层次调用关系见〔三、详细设计3、流程图〕↓三、详细设计1、数据类型//=====ADTPolynomial的表示与实现=====// //-----一元多项式-----// typedefstruct{ //项的表示,多项式的项作为LinkList的数据元素 floatcoef; //系数 intexpn; //指数}term,ElemType; //term用于本ADT,ElemType用于LinkList的数据对象名typedefLinkListpolynomial; //用带表头结点的有序链表表示多项式 //-----根本操作的函数原型说明-----//voidCreatPolyn(polynomial&P,intm) //输入m项的系数和指数,建立表示一元多项式的有序链表pintDestroyPolyn(polynomialp) //销毁一元多项式pvoidPrintPolyn(polynomialP) //打印输出一元多项式pvoidAddPolyn(polynomial*Pa,polynomial*Pb) //多项式加法:Pa=Pa+Pb,并销毁一元多项式PbvoidSubtractPolyn(polynomial*Pa,polynomial*Pb) //多项式减法:Pa=Pa-Pb,并销毁一元多项式Pb2、伪码算法 //-----根本操作的算法描述(局部重要操作)-----//intcmp(terma,termb){ /依a的指数值<(或=)(或>)b的指数值,分别返回-1,0,和+1}//cmpvoidCreatPolyn(polynomial&P,intm){ //输入m项的系数和指数,建立表示一元多项式的有序链表p InitList(P); h=GetHead(P); e.coef=0.0; e.expn=-1; SetCurElem(h,e); //设置头结点的数据元素 printf("系数指数\n"); for(i=1;i<=m;++i){ //一次输入m个非零项 scanf(e.coef,e.expn); if(!LocateElemP(P,e,&q,cmp)){ //当前链表中不存在该指数项 if(MakeNode(&s,e)) InsFirst(&P,q,s); //生成结点并插入链表 }//if }//for}//CreatPolynvoidAddPolyn(polynomial*Pa,polynomial*Pb){//多项式加法:Pa=Pa+Pb,并销毁一元多项式Pb ha=GetHead(*Pa);hb=GetHead(*Pb);//ha和hb分别指向Pa和Pb地头结点 qa=NextPos(ha);qb=NextPos(hb); //qa和qb分别指向Pa和Pb中当前结点〔现为第一个结点〕 while(!ListEmpty(*Pa)&&!ListEmpty(*Pb)&&qa){ //Pa和Pb均非空且ha没指向尾结点〔qa!=0〕 a=GetCurElem(qa);b=GetCurElem(qb);//a和b为两表中当前比拟元素 switch(cmp(a,b)){ case-1: //多项式Pa中当前结点地指数值小 ha=qa; qa=NextPos(ha); //ha和qa均向后移一个结点 break; case0: //两者地指数值相等 sum=a.coef+b.coef; //修改Pa当前结点地系数值 if(sum!=0.0){ SetCurElem(qa,sum); ha=qa; }else{ //删除多项式Pa中当前结点 DelFirst(Pa,ha,&qa); FreeNode(&qa); } DelFirst(Pb,hb,&qb); FreeNode(&qb); qb=NextPos(hb); qa=NextPos(ha); break; case1: //多项式Pb中当前结点地指数值小 DelFirst(Pb,hb,&qb); InsFirst(Pa,ha,qb); qb=NextPos(hb); ha=NextPos(ha); break; }//switch }//while if(!ListEmpty(*Pb)){ Append(Pa,qb); //链接Pb中剩余结点 FreeNode(&hb); //释放Pb头结点 }//if DestroyPolyn(Pb); //销毁Pb}//AddPolynvoidOpposite(polynomialPa){ //一元多项式系数取反 p=Pa.head; while(p->next){ //为一元多项式减法做准备,将系数全部取反,然后执行一元多项式的加法。 p=p->next; p->data.coef*=-1; }//while}//OppositevoidSubtractPolyn(polynomial*Pa,polynomial*Pb){ //多项式减法:Pa=Pa-Pb,并销毁一元多项式Pb Opposite(*Pb); //先为一元多项式Pb系数全部取反 AddPolyn(Pa,Pb); //执行一元多项式的加法,取反后相当于减法。}//SubtractPolynvoidSort(polynomialP){ //将链表升序排序转换成降序排序tailNode=P.tail; //tailNode标记P链表的尾结点while(P.head->next!=tailNode){ //当P的头结点下一个结点〔第一个元素从是头结点的下一个元素〕不等//于尾结点时执行 curNode=P.head->next; while(curNode!=tailNode){ // if(curNode->data.expn<curNode->next->data.expn){ //当当前元素的指数小于下一个元素的指数时执行交换 e=curNode->data; curNode->data=curNode->next->data; curNode->next->data=e; }//if newNode=curNode; //while循环到最后时newNode指向tailNode的前一个结点 curNode=curNode->next; //将eNode结点下移 }//while tailNode=newNode; //将tailNode结点前移〔此时最大的指数已经移到尾结点〕 }//while}//Sort开始3、流程图开始打印标题打印标题f==f==’y’||f==’Y’打印菜单打印菜单 YNchoose输入fchoose输入f 01、2InitList(P)输入mInitList(P)输入mSetCurElem(h,e)〔输入第二个一元多项式〕 2SetCurElem(h,e)将一元多项式Pb的全部系数取反i=1;i<=m;++i将一元多项式Pb的全部系数取反i=1;i<=m;++i N 1 〔第1次N执行输入m〕!Pa&&!!Pa&&!Pb&&qa Y输入e.coef和e.expn输入e.coef和e.expn Y打印输出Pacmp(a,b)!LocateElemP(P,e,&q,cmp)打印输出Pacmp(a,b)!LocateElemP(P,e,&q,cmp)N-1 -2Sort()将Pa的升序转换成降序 0Sort()将Pa的升序转换成降序删除Pa和Pb系数和指数将Pb的系数加到Pa的系数 Y删除Pa和Pb系数和指数将Pb的系数加到Pa的系数MakeNode(&s,e)MakeNode(&s,e)Append(Pa,qb)FreeNode(&hb)NAppend(Pa,qb)FreeNode(&hb)!Pb!Pb销毁链表PbInsFirst(&P,q,s)结束 Y Y销毁链表PbInsFirst(&P,q,s)结束 4、调试分析〔1〕调试过程中遇到的问题和解决方法在调试过程中主要遇到一些符号打错或输出、输出和函数之类的名称打错或漏打,根据第一行提示的错误然后进行修改,修改之后再运行调试,如此循环,直到彻底正常运行,后面就是优化见面的问题了。〔2〕改良设想增加两个一元多项式的乘法和除法操作,简化代码,减少时间和空间复杂度。〔3〕经验和体会等从这是实验当中,我体会最深的是编程要特别仔细,因为稍不注意就可能打错字母,这些错误有时在调试当中特别难找,就是一个小小的字母可能也要让你花上好长时间来修改,还有就是要形成自己的编程风格,这样的代码看起来不至于那么乱,给有人条理的感觉,也便于代码的维护,还有就是函数调用的问题,函数调用多了容易出现错误,函数写多了也容易忘记,这就要求程序员有良好的注释习惯。5、用户使用说明运行选择操作〔1,2,0〕输入第一个一元多项式非零项的个数m 输入第一个一元多项式的系数和项数〔系数项数〕输入第一个二元多项式非零项的个数m输入第二个一元多项式的系数和项数〔系数项数〕打印输出运算后的一元多项式输入f假设f==’y’||f==’Y’那么继续选择操作否那么结束程序。 6、测试结果7、附录〔1〕带注释的源程序#include<stdio.h>#include<stdlib.h>#defineDestroyPolynDestroyList#definePolynLengthListLengthtypedefstruct{ //项的表示,多项式的项作为LinkList的数据元素floatcoef; //系数 intexpn; //指数}term,ElemType; //term用于本ADT,ElemType用于LinkList的数据对象名typedefstructLNode{ //结点类型 ElemTypedata; structLNode*next;}*Link,*Position;typedefstruct_LinkList{ //链表类型 Linkhead,tail; //head指向头结点,tail指向最后一个结点 intlen; //指向线性链表中数据元素的个数}LinkList;typedefLinkListpolynomial; //用带表头结点的有序链表表示多项式//依a的指数值<(或=)(或>)b的指数值,分别返回-1,0,和+1intcmp(terma,termb){ if(a.expn==b.expn) return0; else return(a.expn>b.expn)?1:-1;}//构造一个空地线性链表LvoidInitList(LinkList&L){ Linkp; p=(Link)malloc(sizeof(LNode)); //生成头结点 if(p){ p->next=NULL; //将头尾结点都分配好,并将其下一结点置空 L.head=L.tail=p; L.len=0; //初始为0 }}//返回线性链表L中头结点的位置PositionGetHead(LinkListL){ returnL.head;}//p指向线性链表中的一个结点,返回e更新p所指结点中数据元素的值voidSetCurElem(Link&p,ElemTypee){ p->data=e;}//p指向线性链表中地一个结点,返回p所指结点中数据元素地位置地值ElemTypeGetCurElem(Linkp){ returnp->data;}//假设升序链表L中存在与e满足判定函数compare()取值为0的元素,那么q指示L中//第一个值为e地结点的位置,并返回1;否那么q指示第一个与e满足判定函数//compare()取值>0地元素地前驱地位置。并返回0.〔用于一元多项式〕intLocateElemP(LinkListL,ElemTypee,Position*q,int(*compare)(ElemType,ElemType)){ Linkp=L.head,pp; do{ pp=p; p=p->next; }while(p&&(compare(p->data,e)<0)); //没到表尾且p->data.expn<e.expn if(!p||compare(p->data,e)>0){ //到表尾或compare(p->data,e)>0 *q=pp; return0; }else{ *q=p; return1; }}//分配由p指向地值为e地结点,并返回1;假设分配失败。那么返回0intMakeNode(Link*p,ElemTypee){ *p=(Link)malloc(sizeof(LNode)); //动态分配一个Link空间 if(!*p) return0; (*p)->data=e; return1;}//h指向L地一个结点,把h当做头结点,将s所指结点插入在第一个结点之前intInsFirst(LinkList*L,Linkh,Links){ s->next=h->next; h->next=s; if(h==(*L).tail) //如果h指向尾结点 (*L).tail=h->next; //修改尾指针 (*L).len++; return1;}//假设线性链表L为空表,那么返回1,否那么返回0intListEmpty(LinkListL){ if(L.len) return0; else return1;}//p指向线性链表L中地一个结点,返回p所指结点地直接后继地位置//假设无后继,那么返回NULLPositionNextPos(Linkp){ returnp->next;}//h指向L地一个结点,把h当做头结点,删除链表中地第一个结点并以q返回。//假设链表为空〔h指向表尾结点〕,q=NULL,返回0intDelFirst(LinkList*L,Linkh,Link*q){ *q=h->next; if(*q){ //链表非空 h->next=(*q)->next; if(!h->next) //删除尾结点 (*L).tail=h; //修改尾指针 (*L).len--; return1; }else return0; //链表空}//释放p所指结点voidFreeNode(Link*p){ free(*p); //先释放存储空间,然后置空 *p=NULL;}//将指针s(s->data为第一个数据元素)所指(彼此以指针项链,以NULL结尾)地//一串结点连接在线性链表L地最后一个结点之后,并改变链表L地尾指针指向新地尾结点intAppend(LinkList*L,Links){ inti=1; //记录s为头地串结点个数 (*L).tail->next=s; //尾结点指向s while(s->next){ s=s->next; i++; } (*L).tail=s; (*L).len+=i; return1;}//将线性链表L重置为空表〔头尾结点相同为空表〕,并释放远链表地结点//空间,不释放头尾即诶但,只是置空intClearList(LinkList*L){ Linkp,q; if((*L).head!=(*L).tail){ //不是空表 p=q=(*L).head->next; (*L).head->next=NULL; while(p!=(*L).tail){ p=q->next; free(q); q=p; } free(q); (*L).tail=(*L).head; (*L).len=0; } return1;}//销毁线性链表L,L不再存在intDestroyList(LinkList*L){ ClearList(L); //清空链表〔头尾结点并没有释放〕 FreeNode(&(*L).head); //再释放头尾结点 (*L).tail=NULL; (*L).len=0; return1;}//输入m项的系数和指数,建立表示一元多项式的有序链表pvoidCreatPolyn(polynomial&P,intm){ Positionh,q,s; terme; inti; InitList(P); h=GetHead(P); e.coef=0.0; e.expn=-1; SetCurElem(h,e); //设置头结点的数据元素 printf("系数指数\n"); for(i=1;i<=m;++i){ //一次输入m个非零项 scanf("%f%d",&e.coef,&e.expn); if(!LocateElemP(P,e,&q,cmp)){ //当前链表中不存在该指数项 if(MakeNode(&s,e)) InsFirst(&P,q,s); //生成结点并插入链表 } }}//多项式加法:Pa=Pa+Pb,并销毁一元多项式PbvoidAddPolyn(polynomial*Pa,polynomial*Pb){ Positionha,hb,qa,qb; terma,b; ha=GetHead(*Pa); hb=GetHead(*Pb); //ha和hb分别指向Pa和Pb地头结点 qa=NextPos(ha); qb=NextPos(hb); //qa和qb分别指向Pa和Pb中当前结点〔现为第一个结点〕 while(!ListEmpty(*Pa)&&!ListEmpty(*Pb)&&qa){ //Pa和Pb均非空且ha没指向尾结点〔qa!=0〕 a=GetCurElem(qa); b=GetCurElem(qb); //a和b为两表中当前比拟元素 switch(cmp(a,b)){ case-1: //多项式Pa中当前结点地指数值小 ha=qa; qa=NextPos(ha); //ha和qa均向后移一个结点 break; case0: //两者地指数值相等 qa->data.coef+=qb->data.coef; //修改Pa当前结点地系数值 if(qa->data.coef!=0.0){ SetCurElem(qa,qa->data); ha=qa; }else{ //删除多项式Pa中当前结点 DelFirst(Pa,ha,&qa); FreeNode(&qa); } DelFirst(Pb,hb,&qb); FreeNode(&qb); qb=NextPos(hb); qa=NextPos(ha); break; case1: //多项式Pb中当前结点地指数值小 DelFirst(Pb,hb,&qb); InsFirst(Pa,ha,qb); qb=NextPos(hb); ha=NextPos(ha); break; } } if(!ListEmpty(*Pb)){ Append(Pa,qb); //链接Pb中剩余结点 FreeNode(&hb); //释放Pb头结点 } DestroyPolyn(Pb); //销毁Pb}//一元多项式系数取反voidOpposite(polynomialPa){ Positionp; p=Pa.head; while(p->next){ //为一元多项式减法做准备,将系数取反,然后执行一元多项式的加法。 p=p->next; p->data.coef*=-1; }}//多项式减法:Pa=Pa-Pb,并销毁一元多项式PbvoidSubtractPolyn(polynomial*Pa,polynomial*Pb){ Opposite(*Pb); AddPolyn(Pa,Pb);}//将链表升序排序转换成降序排序voidSort(polynomialP){ LinkcurNode,tailNode,newNode;terme;tailNode=P.tail; //tailNode标记P链表的尾结点 while(P.head->next!=tailNode){ //当P的头结点下一个结点〔第一个元素从是头结点的下一个元素〕不等//于尾结点时执行 curNode=P.head->next; while(curNode!=tailNode){ // if(curNode->data.expn<curNode->next->data.expn

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论