1.链表的基本操作
链表数据结构的定义:由于链表一方面需要在节点中存储数据,另一方面还需要存储"线索",因此,通常采用结构体定义链表节点数据类型。
- structNode;
- typedefstructNode*PtrToNode;
- typedefPtrToNodeList;
- typedefPtrToNodePosition;
- typedefintElementType;
- structNode
- {
- ElementTypeElement;
- PositionNext;
- };
链表的操作不算太多,下面是一些常用的操作:
- ListCreateList();
- voidTraverseList(ListL);
- ListMakeEmpty(ListL);
- intIsEmpty(ListL);
- intIsLast(PositionP,ListL);
- PositionFind(ElementTypeX,ListL);
- voidDelete(ElementTypeX,ListL);
- PositionFindPrevious(ElementTypeX,ListL);
- voidInsert(ElementTypeX,ListL,PositionP);
- voidDeleteList(ListL);
- PositionHeader(ListL);
- PositionFirst(ListL);
- PositionAdvance(PositionP);
- ElementTypeRetrive(PositionP);
下面是实现基本操作以及简单使用的一个完整的例子:
- #include<stdio.h>
- #include<stdlib.h>
- structNode;
- typedefstructNode*PtrToNode;
- typedefPtrToNodeList;
- typedefPtrToNodePosition;
- typedefintElementType;
- structNode
- {
- ElementTypeElement;
- PositionNext;
- };
- ListCreateList();
- voidTraverseList(ListL);
- ListMakeEmpty(ListL);
- intIsEmpty(ListL);
- intIsLast(PositionP,ListL);
- PositionFind(ElementTypeX,ListL);
- voidDelete(ElementTypeX,ListL);
- PositionFindPrevious(ElementTypeX,ListL);
- voidInsert(ElementTypeX,ListL,PositionP);
- voidDeleteList(ListL);
- PositionHeader(ListL);
- PositionFirst(ListL);
- PositionAdvance(PositionP);
- ElementTypeRetrive(PositionP);
- intIsEmpty(ListL)
- {
- returnL->Next==NULL;
- }
- intIsLast(PositionP,ListL)
- {
- returnP->Next==NULL;
- }
- PositionFind(ElementTypeX,ListL)
- {
- PositionP=L->Next;
- while(P!=NULL&&P->Element!=X)
- {
- P=P->Next;
- }
- returnP;
- }
- voidDelete(ElementTypeX,ListL)
- {
- PositionP,TmpCell;
- P=FindPrevious(X,L);
- if(!IsLast(P,L))
- {
- TmpCell=P->Next;
- P->Next=TmpCell->Next;
- free(TmpCell);
- }
- }
- PositionFindPrevious(ElementTypeX,ListL)
- {
- PositionP=L;
- while(P->Next!=NULL&&P->Next->Element!=X)
- {
- P=P->Next;
- }
- returnP;
- }
- voidInsert(ElementTypeX,ListL,PositionP)
- {
- PositionTmpCell;
- TmpCell=malloc(sizeof(structNode));
- if(TmpCell==NULL)
- {
- printf("Outofspace!\n");
- return;
- }
- TmpCell->Element=X;
- TmpCell->Next=P->Next;
- P->Next=TmpCell;
- }
- voidDeleteList(ListL)
- {
- PositionP,Tmp;
- P=L->Next;
- L->Next=NULL;
- while(P!=NULL)
- {
- Tmp=P->Next;
- free(P);
- P=Tmp;
- }
- }
- PositionHeader(ListL)
- {
- returnL;
- }
- PositionFirst(ListL)
- {
- returnL->Next;
- }
- PositionAdvance(PositionP)
- {
- returnP->Next;
- }
- ElementTypeRetrive(PositionP)
- {
- returnP->Element;
- }
- ListCreateList()
- {
- inti;
- PositionP,Tmp;
- ListL=malloc(sizeof(structNode));
- P=L;
- for(i=0;i<5;i++)
- {
- Tmp=malloc(sizeof(structNode));
- Tmp->Element=i;
- P->Next=Tmp;
- P=Tmp;
- }
- P->Next=NULL;
- returnL;
- }
- voidTraverseList(ListL)
- {
- PositionP;
- P=L->Next;
- while(P!=NULL)
- {
- printf("%d\n",P->Element);
- P=P->Next;
- }
- }
- intmain(void)
- {
- ListL=CreateList();
- PositionP=Find(1,L);
- Insert(8,L,P);
- P=FindPrevious(8,L);
- TraverseList(L);
- return0;
- }
2.一元N次多项式相加
对于两个一元多项式,如果需要对他们进行多项式相加操作,常见的两种思路如下:(1)对于一个多项式,保存其最高项次数HighPowder,以及一个该多项式对应次数分别为0-HighPowder的各项的系数的数组()。(2)多项式中系数不为零的每一项,保存其系数与该项的次数。下面分别用这两种思路实现一元多项式加法操作。
思路一:
数据结构定义:
- typedefstructPoly
- {
- intCoeffArray[11];
- intHighPower;
- }*Polynomial;
实现代码:
- #include<stdio.h>
- #include<stdlib.h>
- typedefstructPoly
- {
- intCoeffArray[11];
- intHighPower;
- }*Polynomial;
- voidZeroPolynomial(PolynomialPoly)
- {
- inti;
- for(i=0;i<11;i++)
- {
- Poly->CoeffArray[i]=0;
- }
- Poly->HighPower=0;
- }
- voidAddPolynomial(PolynomialPoly1,PolynomialPoly2,PolynomialPolySum)
- {
- inti;
- ZeroPolynomial(PolySum);
- PolySum->HighPower=Poly1->HighPower>Poly2->HighPower?
- Poly1->HighPower:Poly2->HighPower;
- for(i=PolySum->HighPower;i>=0;i--)
- {
- PolySum->CoeffArray[i]=Poly1->CoeffArray[i]+Poly2->CoeffArray[i];
- }
- }
- intmain(void)
- {
- inti,j,k;
- PolynomialP1,P2,Sum;
- P1=malloc(sizeof(structPoly));
- P2=malloc(sizeof(structPoly));
- Sum=malloc(sizeof(structPoly));
- ZeroPolynomial(P1);
- ZeroPolynomial(P2);
- P1->HighPower=10;
- for(i=10;i>=0;i--)
- {
- P1->CoeffArray[i]=i;
- }
- P2->HighPower=8;
- for(j=8;j>=0;j--)
- {
- P2->CoeffArray[j]=j;
- }
- P2->CoeffArray[8]=8;
- AddPolynomial(P1,P2,Sum);
- printf("ThehighpowerofthePolynomialis%d\n",Sum->HighPower);
- for(k=0;k<=10;k++)
- {
- printf("TheCoeffofpower%dis%d\n",k,Sum->CoeffArray[k]);
- }
- return0;
- }
思路二:
数据结构:
- typedefstructPolyNode*PtrToNode;
- typedefstructPolyNode
- {
- intCoeff;
- intExponent;
- PtrToNodeNext;
- }PolyNode;
实现代码:
- #include<stdio.h>
- #include<stdlib.h>
- typedefstructPolyNode*PtrToNode;
- typedefstructPolyNode
- {
- intCoeff;
- intExponent;
- PtrToNodeNext;
- }PolyNode;
- typedefPtrToNodePolynomial;
- voidAddPolynomial(PolynomialP,PolynomialQ,PolynomialSum)
- {
- PolynomialPIndex,QIndex,SumIndex;
- PIndex=P->Next;
- QIndex=Q->Next;
- SumIndex=Sum;
- while(!(PIndex==NULL&&QIndex==NULL))
- {
- if(PIndex==NULL)
- {
- SumIndex->Next=QIndex;
- QIndex=QIndex->Next;
- SumIndex=SumIndex->Next;
- }
- elseif(QIndex==NULL)
- {
- SumIndex->Next=PIndex;
- PIndex=PIndex->Next;
- SumIndex=SumIndex->Next;
- }
- else
- {
- if(PIndex->Exponent>QIndex->Exponent)
- {
- SumIndex->Next=PIndex;
- PIndex=PIndex->Next;
- SumIndex=SumIndex->Next;
- continue;
- }
- if(PIndex->Exponent==QIndex->Exponent)
- {
- PolynomialPP=malloc(sizeof(structPolyNode));
- PP->Exponent=PIndex->Exponent;
- PP->Coeff=PIndex->Coeff+QIndex->Coeff;
- SumIndex->Next=PP;
- PIndex=PIndex->Next;
- QIndex=QIndex->Next;
- SumIndex=SumIndex->Next;
- continue;
- }
- if(PIndex->Exponent<QIndex->Exponent)
- {
- SumIndex->Next=QIndex;
- QIndex=QIndex->Next;
- SumIndex=SumIndex->Next;
- continue;
- }
- }
- }
- SumIndex->Next=NULL;
- }
- voidTraversePolynomial(PolynomialP)
- {
- PolynomialTmp=P->Next;
- while(Tmp!=NULL)
- {
- printf("Coeffis%dandExponentis%d\n",Tmp->Coeff,Tmp->Exponent);
- Tmp=Tmp->Next;
- }
- }
- intmain(void)
- {
- PolynomialPoly1,Poly2,Poly3,Poly11,Poly22;
- inti,j;
- Poly1=malloc(sizeof(structPolyNode));
- Poly2=malloc(sizeof(structPolyNode));
- Poly3=malloc(sizeof(structPolyNode));
- Poly11=Poly1;
- Poly22=Poly2;
- for(i=5;i>=1;i--)
- {
- PolynomialTmp=malloc(sizeof(structPolyNode));
- Tmp->Coeff=i;
- Tmp->Exponent=i;
- Poly11->Next=Tmp;
- Poly11=Poly11->Next;
- }
- Poly11->Next=NULL;
- for(j=11;j>=3;j--)
- {
- PolynomialTmp=malloc(sizeof(structPolyNode));
- Tmp->Coeff=j;
- Tmp->Exponent=j;
- Poly22->Next=Tmp;
- Poly22=Poly22->Next;
- }
- Poly22->Next=NULL;
- TraversePolynomial(Poly1);
- printf("*****************************************\n");
- TraversePolynomial(Poly2);
- AddPolynomial(Poly1,Poly2,Poly3);
- printf("*****************************************\n");
- TraversePolynomial(Poly3);
- return0;
- }
分享到:
相关推荐
c++,算法链表实现一元多项式相加,通过链表实现,非常好的一个程序
数据结构_两个链表的合并,一元多项式相加
用两个链表组织两个一元多项式,将相加的结果保存在前一个链表中。 输入 m(项数) c1(第一项系数) e1(第一项指数) c2 e2 ....... cm(第m项系数) em(第m项指数) n(项数) c1(第一项系数) e1(第一项指数) c2 e2 ....
基于C++与链表的两个一元多项式的基本运算(加法、减法、 乘法和求导运算)
这是我们学校的一个课程设计题,我是用链表实现的,并且测试类也写得较简单。如果有什么不对的地方,请多指教。
两个一元多项式相加的程序——/定义结点 /创建链表 /递增排序 /两个多项式相加 /显示多项式 /主函数
...
顺序结构、动态链表结构下的一元多项式的加法、减法、乘法的实现
数据结构实验——链表 数据结构实验——链表
关于数据结构课程设计的一些代码,希望能有帮助···········
功能:能够实现一元多项式的输入和输出 能够进行一元多项式相加 能够进行一元多项式相减 能够计算一元多项式在x处的值 用链表实现
在visual c++6.0环境中 链表 动态链表 多项式相加
要求用线性链表存储一元多项式(参照课本)。该程序有以下几个功能: 1. 多项式求和 输入:输入三个多项式,建立三个多项式链表Pa、Pb、Pc (提示:调用CreatePolyn(polynomial &P,int m)。 输出:显示三个输入...
绝对自己编写,用链表实现多项式的加减,希望能对大家有帮助!
本课程设计利用带头结点的单链表求解一元多项式相加的问题,一元多项式的各项都用一个结点保存,每输入一个结点就用头插法插入链表,并将结点按多项式的系数大小排序,相加时只要将指数相同项的系数相加.另外,在单链表...
要求用线性链表存储一元多项式(参照课本)。该程序有以下几个功能: 1. 多项式求和 输入:输入三个多项式,建立三个多项式链表Pa、Pb、Pc (提示:调用CreatePolyn(polynomial &P,int m)。 输出:显示三个输入...
利用C语言中的链表实现一元多项式算法,十分实用,便于c爱好者学习链表结构。
数据结构——循环链表的操作1 数据结构——循环链表的操作1 数据结构——循环链表的操作1 数据结构——循环链表的操作1
数据结构中用c++编写一元多项式的表示及相加。