首页 理论教育 C语言程序设计-一元稀疏多项式加减运算

C语言程序设计-一元稀疏多项式加减运算

时间:2023-10-29 理论教育 版权反馈
【摘要】:实现一元稀疏多项式的加减运算。=NULL;a=a->next){47b=L;48for(b;b->next!=NULL;op_pointer=op_pointer->next){78if79{80op_pointer->coef=-op_pointer->coef;81}82}83for(tail_b;tail_b->next!=NULL;tail_b=tail_b->next);84tail_b->next=A;85C=B;86Sortlist;87return C;88}89void MergeList{//合并C中exp数值相同的结点90Polynomial C1,C2;91C1=C;92C2=C1->next;93while(C2!

C语言程序设计-一元稀疏多项式加减运算

【例9.1】实现一元稀疏多项式的加减运算。

程序内容如下:

1 #include<stdlib.h>

2 #include<string.h>

3 #include<stdio.h>

4 typedef struct Poly Node

5 {

6  float coef;        //系数

7  int exp;           //指数

8  struct Poly Node*next;

9 }Poly Node;

10 typedef Poly Node*Polynomial;

11 Polynomial CreateList()

12 {

13  float co;

14  int ex;

15  Polynomial head,p,l;

16  head=(Polynomial)malloc(sizeof(Poly Node));  

17  p=head;

18  scanf("%f%d",&p->coef,&p->exp);

19  if(head->coef==0&&head->exp==0){

20   head->next=NULL;

21 }else

22 {

23  p->next=(Polynomial)malloc(sizeof(Poly Node));

24  p=p->next;

25  while(1)

26  {

27   scanf("%f%d",&co,&ex);

28   if(co==0&&ex==0)break;//x=0并且y=0代表结束输出

29    p->coef=co;

30    p->exp=ex;

31    l=p;

32    p->next=(Polynomial)malloc(sizeof(Poly Node));

33    p=p->next;

34  }

35  l->next=NULL;

36 }

37 return head;

38 }

39 void Sortlist(Polynomial L)//用冒泡法对链表L中的结点按指数降序排列。

40 {

41  Polynomial a,b;

42  float temp_co; //设置中间变量来交换链表元素的值;

43  int temp_ex;

44  b=L;

45  a=L;

46  for(a;a!=NULL;a=a->next){

47   b=L;

48  for(b;b->next!=NULL;b=b->next)

49  {

50   if(b->exp<b->next->exp){

51    temp_co=b->coef;

52    temp_ex=b->exp;

53    b->coef=b->next->coef;

54    b->exp=b->next->exp;

55    b->next->coef=temp_co;

56    b->next->exp =temp_ex;

57  }

58 }

59 } 

60 return;

61 }

62 void Display(Polynomial p)

63 {

64  Polynomial Pointer;

65  Pointer=p;

66  do

67  {

68   printf("%.2fxˆ%d ",Pointer->coef,Pointer->exp);

69   Pointer=Pointer->next;(www.xing528.com)

70  }while(Pointer!=NULL);

71 }

72 Polynomial Link List(Polynomial A,Polynomial B,int n) //链表A B,n=1表示加法,n=2表示减法

73 {

74  Polynomial tail_b,C,op_pointer;//op_pointer用来取反链表B cof的数值。

75  tail_b=B;

76  op_pointer=B;

77  for(op_pointer;op_pointer!=NULL;op_pointer=op_pointer->next){

78   if(n==2)

79   {

80    op_pointer->coef=-op_pointer->coef;

81   }

82 }

83 for(tail_b;tail_b->next!=NULL;tail_b=tail_b->next);

84  tail_b->next=A;

85  C=B;

86  Sortlist(C);

87  return C;

88 }

89 void MergeList(Polynomial C){   //合并C中exp数值相同的结点

90 Polynomial C1,C2;

91 C1=C;

92 C2=C1->next;

93 while(C2!=NULL)

94 {

95  if(C1->exp==C1->next->exp)

96  {

97   C1->coef=C1->next->coef+C1->coef;

98   C1->next=C1->next->next;

99   free(C2);

100   C2=C1->next;

101  }else

102  {

103   C1=C1->next;

104   C2=C2->next;

105  }

106  }

107 }

108 int main()

109 {

110  Polynomial A,B,Com;

111  int s;

112  printf("\n请输入链表A的数据:格式为coeffient exp以空格分开\n");

113  A=CreateList();

114  Display(A);

115  printf("\n请输入链表B的数据:格式为coeffient exp以空格分开\n");

116  B=CreateList();

117  Display(B);

118  printf("请选择加法还是减法\n");

119  printf("输入1代表加法\n");

120  printf("输入2代表减法\n");

121  scanf("%d",&s);

122  if(s==1||s==2){

123   Com=Link List(A,B,s); 

124   Merge List(Com);

125   Display(Com);

126 }else

127 {

128  printf("输入了非法字符\n");

129 }

130 return 0;

131 }

程序运行结果如图9.5所示:

图9.5 例9.1程序结果图

【例题中关键问题说明】

(1)建立两个带头结点的单链表A、B。

(2)将A、B两个链表连接成一个新链表C。

(3)用冒泡法对C中链表进行排序。

(4)把C链表中指数项相同结点合并。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈