Problem Description 定义一个名为itm(多项式)的结构体: struct itm{ int a, m;//a为系数,m为指数 struct itm *next; }; 声明结点为结构体itm的变量,那么可以用结点来表示多项式中的一项。 要求编写一个程序将两个链表合并为一个,合并后的链表表示两个多项式相加的结果,且表头指针为first,即把second链表的内容加到first链表中去。 Input Description 按照降次输入两个多项式,每个多项式的输入格式为: 每行输入两个整数,第一个表示系数a(a!=0),第二个表示指数m(m>=0),输入0 0时结束一个多项式的输入。 Output Description 按照降次输出合并后的多项式。格式为: 6x^5+7x^4+4x^3+5x^1+7x^0 注意其中的x是小写字母x。 Sample Input 6 5 -4 3 2 1 7 0 0 0 7 4 8 3 3 1 0 0 Sample Output 6x^5+7x^4+4x^3+5x^1+7x^0(完整C语言代码)
时间: 2023-03-13 13:32:59 浏览: 183
答:答案:struct itm {
int a; //系数
int m; //指数
struct itm *next; //指向下一结点
};
struct itm *first, *second; //定义两个链表
//合并两个链表
void mergeList(struct itm *first, struct itm *second) {
struct itm *p1 = first, *p2 = second;
struct itm *prev = NULL; //用于记录比较大的结点的前一个结点
//遍历链表
while (p1 != NULL && p2 != NULL) {
if (p1->m > p2->m) {
prev = p1;
p1 = p1->next;
} else if (p1->m < p2->m) {
//如果prev不为空,则将p2插入到prev和p1之间
if (prev != NULL) {
prev->next = p2;
p2 = p2->next;
prev->next->next = p1;
prev = prev->next;
} else {
//如果prev为空,则将p2插入到first和p1之间
first = p2;
p2 = p2->next;
first->next = p1;
prev = first;
}
} else { //如果指数相等
p1->a += p2->a; //系数相加
//如果系数为0,则删除该结点
if (p1->a == 0) {
if (prev != NULL) {
prev->next = p1->next;
free(p1);
p1 = prev->next;
} else {
first = p1->next;
free(p1);
p1 = first;
}
} else {
prev = p1;
p1 = p1->next;
}
p2 = p2->next;
}
}
//如果second链表未遍历完,则将剩余部分接到first链表的末尾
if (p2 != NULL) {
prev->next = p2;
}
}
阅读全文