问题:设计一个算法,将一个用循环链表表示的稀疏多项式分解成两个多项式,使
这两个多项式中各自仅含奇次项或偶次项,并要求利用原链表中的结点空间构成这两个链
表。
/*
设计一个算法,将一个用循环链表表示的稀疏多项式分解成两个多项式,使
这两个多项式中各自仅含奇次项或偶次项,并要求利用原链表中的结点空间构成这两个链
表。
*/
// 1.创建一个循环链表
#define _CRT_SECURE_NO_WARNINGS 1 //程序出现C4996:scanf错误的解决方法
#include<stdio.h>
#include<stdlib.h>
typedef struct PolyNode {
float coef; //单项式的系数
int exp; //单项式的指数
struct PolyNode *next;
} PolyNode,*LinkedPoly;
//尾插法 创建循环链表
LinkedPoly createTail(LinkedPoly &L) {
L = (LinkedPoly)malloc(sizeof(PolyNode)); //建立头节点
PolyNode *r,*s; //创建尾指针以及节点
float coef; //定义系数
int exp; //定义指数
r = L;
scanf("%f %d", &coef, &exp);
while (coef != 99 && exp != 99) {
s = (PolyNode*)malloc(sizeof(PolyNode));
s->coef = coef;
s->exp = exp;
r->next = s;
r = s;
scanf("%f %d", &coef, &exp);
}
r->next = L; //尾指针链接到头部
return L;
}
void printList(LinkedPoly L); //声明函数
// 分成两个多项式
void Divide(LinkedPoly L) {
PolyNode *r_odd, *odd; //创建一个指向奇数次多项式的尾指针以及头指针
PolyNode *pre = L;
PolyNode *p = L->next;
odd = (LinkedPoly)malloc(sizeof(PolyNode));
odd->next = NULL;
r_odd = odd;
while (p != L) {
if (p->exp % 2 == 0) {
pre = p;
p = p->next;
}
else {
pre->next = p->next; //先删
p->next = r_odd->next; //后添加 使用尾插法
r_odd->next = p;
r_odd = p;
p = pre->next;
}
}
r_odd->next = odd;
printf("奇次多项式:");
printList(odd);
printf("\n偶次多项式:");
printList(L);
}
//打印链表
void printList(LinkedPoly L) {
PolyNode *p=L->next;
while (p != L) {
if (p->next != L) {
printf("%.1fX^%d + ", p->coef, p->exp);
}
else {
printf("%.1fX^%d", p->coef, p->exp);
}
p = p->next;
}
printf("\n");
}
//主函数
void main() {
LinkedPoly L;
createTail(L); //创建循环链表
printList(L); //打印循环链表
printf("\n");
Divide(L); //分成两个多项式
}