【【8560】采用单向链表实现一元多项式的存储并实现两个多项式相加并输出结果】
文章图片
关注公众号程序猿从入门到入土查询更方便哦
采用单向链表实现一元多项式的存储并实现两个多项式相加并输出结果
#define _CRT_SECURE_NO_WARNINGS#includeusing namespace std;
typedef struct node { node* next;
int x, z;
}LNode, * LinkList;
int main() { int n;
cin >> n;
LinkList L1 = new LNode;
LinkList p = L1;
for (int i = 0;
i < n;
i++) {
LinkList temp = new LNode;
scanf("%d,%d", &temp->x, &temp->z);
temp->next = NULL;
p->next = temp;
p = p->next;
} cin >> n;
LinkList L2 = new LNode;
p = L2;
for (int i = 0;
i < n;
i++) {
LinkList temp = new LNode;
scanf("%d,%d", &temp->x, &temp->z);
temp->next = NULL;
p->next = temp;
p = p->next;
} LinkList L3 = new LNode;
LinkList p1, p2;
p1 = L1->next;
p2 = L2->next;
p = L1->next;
//后指针
LinkList q = L2->next;
LinkList pre = L1;
//前指针
LinkList u;
//临时存储 while (p != NULL && q != NULL) {//当p,q不为空if (p->z < q->z) {//p系数小于q系数
pre = p;
p = p->next;
//p指针后移
}
else if (p->z == q->z) {//如果指数相等
float x = p->x + q->x;
//系数相加
if (x != 0) {//系数不等于0
p->x = x;
//赋值后将p给pre
pre = p;
}
else {//系数等于0
pre->next = p->next;
//指向下一个结点
free(p);
//删除结点
}
p = pre->next;
//p指针后移
u = q;
//保留q以备删除
q = q->next;
//q指针后移
free(u);
}
else {//p系数大于q系数
u = q->next;
//将q接在pre后
q->next = p;
pre->next = q;
pre = q;
q = u;
}
}
if (q) {//如果q不为空,将q接在后面
pre->next = q;
}
free(L2);
//删除L2头节点 LinkList temp = L1->next;
//输出链表
while (temp != NULL) {if (temp->x != 0)
printf("%d*x^%d ", temp->x, temp->z);
temp = temp->next;
} return 0;
}
推荐阅读
- 【8555】编写在非递减有序链表中插入一个元素使链表元素仍有序的函数,并利用该函数建立一个非递减有序单向链表
- 【7051】已知散列函数为H(key)=key%p,冲突处理方法分别为线性探测法实现散列表的建立(插入算法实现)
- 【7050】已知散列函数为H(key)=key mod 13,冲突处理方法为外拉链法实现散列表的建立(利用插入算法实现)
- 【8553】随机产生或键盘输入一组元素,建立一个带头结点的单向链表(无序),遍历单向链表,显示相应元素