【例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链表中指数项相同结点合并。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。