7-2 多项式的加法
用链表表示多项式,并实现多项式的加法运算
输入格式:
输入在第一行给出第一个多项式POLYA的系数和指数,并以0,0 结束第一个多项式的输入;在第二行出第一个多项式POLYB的系数和指数,并以0,0 结束第一个多项式的输入。
输出格式:
对每一组输入,在一行中输出POLYA+POLYB和多项式的系数和指数。
输入样例:
5,0 2,1 1,6 8,15 0,0
-2,1 3,6 4,8 0,0
输出样例:
5,0 4,6 4,8 8,15
实现代码如下:
#include<stdio.h>
#include<stdlib.h>typedef struct Node {
float ratio;//系数
int index;//指数
struct Node* next;
}*PNode,*LinkList;LinkList createNode() {
LinkList head;
PNode p, q;
float ratio;//系数
int index;//指数//创建一个头节点,再对后续的内容进行输入
head = (struct Node*)malloc(sizeof(struct Node));
head->next = NULL;q = head;
scanf("%f,%d", &ratio, &index);
while (ratio != 0 || index != 0) {
p = (struct Node*)malloc(sizeof(struct Node));
p->next = NULL;
//以上是创建节点
q->next = p;
//赋值
p->index = index;
p->ratio = ratio;
//要记得将节点指向下一个节点
q = q->next;
scanf("%f,%d", &ratio, &index);
}
return head;//将头节点作为返回值,可以打包带走
}void sort(LinkList head) {
PNode p, q;
float temp1;
int temp2;
//使用冒泡排序法来排序(从小到大排列)
for (p = head->next; p != NULL; p = p->next) {
for (q = p->next; q != NULL; q = q->next) {
if (q->index < p->index) {
temp1 = q->ratio;
q->ratio = p->ratio;
p->ratio = temp1;
temp2 = q->index;
q->index = p->index;
p->index = temp2;
}
}
}
}
void Add_List(LinkList list1, LinkList list2) {//合并主要是借用list1链表去将list2的节点进行循环比对,最后全部接到list1上,再将list2删除掉PNode p,q;
PNode pre,temp;
p = list1->next;
q = list2->next;
pre = list1;//表示两个链表前面的一个节点
while (p!=NULL && q!=NULL) {
if (q->index < p->index) {//前插操作
temp = q->next;
q->next = p;
pre->next = q;
pre = q;
q = temp;
}
else if(q->index == p->index) {//当两者系数一样时,将q的系数加到p上,再对其合并后的系数进行分析
p->ratio += q->ratio;
if (p->ratio == 0) {//当系数为零时,记得要将p和q的节点全部向后推一步,同时将两者之前的节点删除
pre->next = p->next;
free(p);
p = pre->next;
temp = q;
q = q->next;
free(temp);
}
else {//若合并后不为零,但是基于p链表作为主链表,将合并后的q节点删去
pre = p;
p = p->next;
temp = q;
q = q->next;
free(temp);
}
}
else {//推进
pre = p;
p = p->next;
}
}
if (q != NULL) {
pre->next = q;
}
free(list2);}
void outlist(LinkList head) {
PNode p;
for (p = head->next; p != NULL; p = p->next) {
printf("%.0f,%d ", p->ratio, p->index);
}
}int main() {
LinkList list1 = createNode();
LinkList list2 = createNode();
sort(list1);
sort(list2);
//test,检查sort功能
/*outlist(list1);
printf("\n");
outlist(list2);
printf("\n");*/
Add_List(list1, list2);
outlist(list1);
return 0;
}
实现结果: