`
tubaluer
  • 浏览: 1443490 次
文章分类
社区版块
存档分类
最新评论
  • sblig: c / c++ 是不一样的都会输出 100
    j = j++

重学数据结构001——链表基本操作与一元多项式相加

 
阅读更多

1.链表的基本操作

链表数据结构的定义:由于链表一方面需要在节点中存储数据,另一方面还需要存储"线索",因此,通常采用结构体定义链表节点数据类型。

  1. structNode;
  2. typedefstructNode*PtrToNode;
  3. typedefPtrToNodeList;
  4. typedefPtrToNodePosition;
  5. typedefintElementType;
  6. structNode
  7. {
  8. ElementTypeElement;
  9. PositionNext;
  10. };

链表的操作不算太多,下面是一些常用的操作:

  1. //创建链表
  2. ListCreateList();
  3. //遍历链表
  4. voidTraverseList(ListL);
  5. //清空链表
  6. ListMakeEmpty(ListL);
  7. //判断给定列表是否为空
  8. intIsEmpty(ListL);
  9. //判断节点在给定链表中是否为空
  10. intIsLast(PositionP,ListL);
  11. //在指定的链表中查找给定元素。
  12. //存在则返回其第一次出现的位置,不存在则返回NULL
  13. PositionFind(ElementTypeX,ListL);
  14. //删除链表中的某个元素
  15. voidDelete(ElementTypeX,ListL);
  16. //在指定链表中查找给定元素的前驱节点
  17. PositionFindPrevious(ElementTypeX,ListL);
  18. //在链表给定位置的后面插入元素
  19. voidInsert(ElementTypeX,ListL,PositionP);
  20. //删除链表
  21. voidDeleteList(ListL);
  22. //返回链表的头结点
  23. PositionHeader(ListL);
  24. //返回链表第一个数据元素节点
  25. PositionFirst(ListL);
  26. //返回当前位置的下一个位置
  27. PositionAdvance(PositionP);
  28. //获取当前位置元素的值
  29. ElementTypeRetrive(PositionP);

下面是实现基本操作以及简单使用的一个完整的例子:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. structNode;
  4. typedefstructNode*PtrToNode;
  5. typedefPtrToNodeList;
  6. typedefPtrToNodePosition;
  7. typedefintElementType;
  8. structNode
  9. {
  10. ElementTypeElement;
  11. PositionNext;
  12. };
  13. //创建链表
  14. ListCreateList();
  15. //遍历链表
  16. voidTraverseList(ListL);
  17. //清空链表
  18. ListMakeEmpty(ListL);
  19. //判断给定列表是否为空
  20. intIsEmpty(ListL);
  21. //判断节点在给定链表中是否为空
  22. intIsLast(PositionP,ListL);
  23. //在指定的链表中查找给定元素。
  24. //存在则返回其第一次出现的位置,不存在则返回NULL
  25. PositionFind(ElementTypeX,ListL);
  26. //删除链表中的某个元素
  27. voidDelete(ElementTypeX,ListL);
  28. //在指定链表中查找给定元素的前驱节点
  29. PositionFindPrevious(ElementTypeX,ListL);
  30. //在链表给定位置的后面插入元素
  31. voidInsert(ElementTypeX,ListL,PositionP);
  32. //删除链表
  33. voidDeleteList(ListL);
  34. //返回链表的头结点
  35. PositionHeader(ListL);
  36. //返回链表第一个数据元素节点
  37. PositionFirst(ListL);
  38. //返回当前位置的下一个位置
  39. PositionAdvance(PositionP);
  40. //获取当前位置元素的值
  41. ElementTypeRetrive(PositionP);
  42. intIsEmpty(ListL)
  43. {
  44. returnL->Next==NULL;
  45. }
  46. intIsLast(PositionP,ListL)
  47. {
  48. returnP->Next==NULL;
  49. }
  50. PositionFind(ElementTypeX,ListL)
  51. {
  52. PositionP=L->Next;
  53. while(P!=NULL&&P->Element!=X)
  54. {
  55. P=P->Next;
  56. }
  57. returnP;
  58. }
  59. voidDelete(ElementTypeX,ListL)
  60. {
  61. PositionP,TmpCell;
  62. P=FindPrevious(X,L);
  63. if(!IsLast(P,L))
  64. {
  65. TmpCell=P->Next;
  66. P->Next=TmpCell->Next;
  67. free(TmpCell);
  68. }
  69. }
  70. PositionFindPrevious(ElementTypeX,ListL)
  71. {
  72. PositionP=L;
  73. while(P->Next!=NULL&&P->Next->Element!=X)
  74. {
  75. P=P->Next;
  76. }
  77. returnP;
  78. }
  79. voidInsert(ElementTypeX,ListL,PositionP)
  80. {
  81. PositionTmpCell;
  82. TmpCell=malloc(sizeof(structNode));
  83. if(TmpCell==NULL)
  84. {
  85. printf("Outofspace!\n");
  86. return;
  87. }
  88. TmpCell->Element=X;
  89. TmpCell->Next=P->Next;
  90. P->Next=TmpCell;
  91. }
  92. voidDeleteList(ListL)
  93. {
  94. PositionP,Tmp;
  95. P=L->Next;
  96. L->Next=NULL;
  97. while(P!=NULL)
  98. {
  99. Tmp=P->Next;
  100. free(P);
  101. P=Tmp;
  102. }
  103. }
  104. PositionHeader(ListL)
  105. {
  106. returnL;
  107. }
  108. PositionFirst(ListL)
  109. {
  110. returnL->Next;
  111. }
  112. PositionAdvance(PositionP)
  113. {
  114. returnP->Next;
  115. }
  116. ElementTypeRetrive(PositionP)
  117. {
  118. returnP->Element;
  119. }
  120. ListCreateList()
  121. {
  122. inti;
  123. PositionP,Tmp;
  124. ListL=malloc(sizeof(structNode));
  125. P=L;
  126. for(i=0;i<5;i++)
  127. {
  128. Tmp=malloc(sizeof(structNode));
  129. Tmp->Element=i;
  130. P->Next=Tmp;
  131. P=Tmp;
  132. }
  133. P->Next=NULL;
  134. returnL;
  135. }
  136. voidTraverseList(ListL)
  137. {
  138. PositionP;
  139. P=L->Next;
  140. while(P!=NULL)
  141. {
  142. printf("%d\n",P->Element);
  143. P=P->Next;
  144. }
  145. }
  146. intmain(void)
  147. {
  148. //创建链表
  149. ListL=CreateList();
  150. //查找元素1在链表中的位置
  151. PositionP=Find(1,L);
  152. //在元素1后面插入元素8
  153. Insert(8,L,P);
  154. //查找元素8前驱结点
  155. P=FindPrevious(8,L);
  156. //遍历链表
  157. TraverseList(L);
  158. return0;
  159. }

2.一元N次多项式相加

对于两个一元多项式,如果需要对他们进行多项式相加操作,常见的两种思路如下:(1)对于一个多项式,保存其最高项次数HighPowder,以及一个该多项式对应次数分别为0-HighPowder的各项的系数的数组()。(2)多项式中系数不为零的每一项,保存其系数与该项的次数。下面分别用这两种思路实现一元多项式加法操作。

思路一:

数据结构定义:

  1. typedefstructPoly
  2. {
  3. intCoeffArray[11];
  4. intHighPower;
  5. }*Polynomial;

实现代码:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. typedefstructPoly
  4. {
  5. intCoeffArray[11];
  6. intHighPower;
  7. }*Polynomial;
  8. voidZeroPolynomial(PolynomialPoly)
  9. {
  10. inti;
  11. for(i=0;i<11;i++)
  12. {
  13. Poly->CoeffArray[i]=0;
  14. }
  15. Poly->HighPower=0;
  16. }
  17. voidAddPolynomial(PolynomialPoly1,PolynomialPoly2,PolynomialPolySum)
  18. {
  19. inti;
  20. ZeroPolynomial(PolySum);
  21. PolySum->HighPower=Poly1->HighPower>Poly2->HighPower?
  22. Poly1->HighPower:Poly2->HighPower;
  23. for(i=PolySum->HighPower;i>=0;i--)
  24. {
  25. PolySum->CoeffArray[i]=Poly1->CoeffArray[i]+Poly2->CoeffArray[i];
  26. }
  27. }
  28. intmain(void)
  29. {
  30. inti,j,k;
  31. PolynomialP1,P2,Sum;
  32. P1=malloc(sizeof(structPoly));
  33. P2=malloc(sizeof(structPoly));
  34. Sum=malloc(sizeof(structPoly));
  35. //初始化
  36. ZeroPolynomial(P1);
  37. ZeroPolynomial(P2);
  38. P1->HighPower=10;
  39. for(i=10;i>=0;i--)
  40. {
  41. P1->CoeffArray[i]=i;
  42. }
  43. P2->HighPower=8;
  44. for(j=8;j>=0;j--)
  45. {
  46. P2->CoeffArray[j]=j;
  47. }
  48. P2->CoeffArray[8]=8;
  49. AddPolynomial(P1,P2,Sum);
  50. printf("ThehighpowerofthePolynomialis%d\n",Sum->HighPower);
  51. for(k=0;k<=10;k++)
  52. {
  53. printf("TheCoeffofpower%dis%d\n",k,Sum->CoeffArray[k]);
  54. }
  55. return0;
  56. }

思路二:

数据结构:

  1. typedefstructPolyNode*PtrToNode;
  2. //定义链表节点,也就是多项式中的某一项;
  3. typedefstructPolyNode
  4. {
  5. intCoeff;
  6. intExponent;
  7. PtrToNodeNext;
  8. }PolyNode;

实现代码:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. typedefstructPolyNode*PtrToNode;
  4. //定义链表节点,也就是多项式中的某一项;
  5. typedefstructPolyNode
  6. {
  7. intCoeff;
  8. intExponent;
  9. PtrToNodeNext;
  10. }PolyNode;
  11. typedefPtrToNodePolynomial;
  12. /************************************************************
  13. *多项式相加的函数:
  14. *P、Q为存储两个多项式各项的单链表(含头结点)
  15. *Sum为多项式相加结果存放的单链表
  16. *
  17. ************************************************************/
  18. voidAddPolynomial(PolynomialP,PolynomialQ,PolynomialSum)
  19. {
  20. PolynomialPIndex,QIndex,SumIndex;
  21. PIndex=P->Next;
  22. QIndex=Q->Next;
  23. SumIndex=Sum;
  24. while(!(PIndex==NULL&&QIndex==NULL))
  25. {
  26. if(PIndex==NULL)
  27. {
  28. SumIndex->Next=QIndex;
  29. QIndex=QIndex->Next;
  30. SumIndex=SumIndex->Next;
  31. }
  32. elseif(QIndex==NULL)
  33. {
  34. SumIndex->Next=PIndex;
  35. PIndex=PIndex->Next;
  36. SumIndex=SumIndex->Next;
  37. }
  38. else
  39. {
  40. if(PIndex->Exponent>QIndex->Exponent)
  41. {
  42. SumIndex->Next=PIndex;
  43. PIndex=PIndex->Next;
  44. SumIndex=SumIndex->Next;
  45. //continue在判断下面if条件时会有异常,类似Java
  46. //的空引用异常
  47. continue;
  48. }
  49. if(PIndex->Exponent==QIndex->Exponent)
  50. {
  51. PolynomialPP=malloc(sizeof(structPolyNode));
  52. PP->Exponent=PIndex->Exponent;
  53. PP->Coeff=PIndex->Coeff+QIndex->Coeff;
  54. SumIndex->Next=PP;
  55. PIndex=PIndex->Next;
  56. QIndex=QIndex->Next;
  57. SumIndex=SumIndex->Next;
  58. continue;
  59. }
  60. if(PIndex->Exponent<QIndex->Exponent)
  61. {
  62. SumIndex->Next=QIndex;
  63. QIndex=QIndex->Next;
  64. SumIndex=SumIndex->Next;
  65. continue;
  66. }
  67. }
  68. }
  69. SumIndex->Next=NULL;
  70. }
  71. /************************************************************
  72. *遍历单链表(含头结点)函数:
  73. *P:待遍历的链表
  74. *************************************************************/
  75. voidTraversePolynomial(PolynomialP)
  76. {
  77. PolynomialTmp=P->Next;
  78. while(Tmp!=NULL)
  79. {
  80. printf("Coeffis%dandExponentis%d\n",Tmp->Coeff,Tmp->Exponent);
  81. Tmp=Tmp->Next;
  82. }
  83. }
  84. intmain(void)
  85. {
  86. PolynomialPoly1,Poly2,Poly3,Poly11,Poly22;
  87. inti,j;
  88. Poly1=malloc(sizeof(structPolyNode));
  89. Poly2=malloc(sizeof(structPolyNode));
  90. Poly3=malloc(sizeof(structPolyNode));
  91. Poly11=Poly1;
  92. Poly22=Poly2;
  93. //创建两个链表时,需要保证是按照指数递减的方式构造的
  94. for(i=5;i>=1;i--)
  95. {
  96. PolynomialTmp=malloc(sizeof(structPolyNode));
  97. Tmp->Coeff=i;
  98. Tmp->Exponent=i;
  99. Poly11->Next=Tmp;
  100. Poly11=Poly11->Next;
  101. }
  102. Poly11->Next=NULL;
  103. for(j=11;j>=3;j--)
  104. {
  105. PolynomialTmp=malloc(sizeof(structPolyNode));
  106. Tmp->Coeff=j;
  107. Tmp->Exponent=j;
  108. Poly22->Next=Tmp;
  109. Poly22=Poly22->Next;
  110. }
  111. Poly22->Next=NULL;
  112. TraversePolynomial(Poly1);
  113. printf("*****************************************\n");
  114. TraversePolynomial(Poly2);
  115. AddPolynomial(Poly1,Poly2,Poly3);
  116. printf("*****************************************\n");
  117. TraversePolynomial(Poly3);
  118. return0;
  119. }

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics