include
include
typedef struct Polynode {
int coef; // 系数
int exp; // 指数
struct Polynode* next;
}Polynode,*Polylist;
//输入数据, 边输入边排序进链表
void InputDataAndSortingData(Polylist Polynomial, int n);
//初始化多项式链表
void Init(Polylist &Polynomial);
//将两个多项式相加
void PolynomialAdd(Polylist A, Polylist B);
// 输出计算结果
void DisplayResult(Polylist A);
// 指令输入与判断
int Input_judgefun(int function);
// 显示菜单
void Menu();
// 关于我们
void AboutUs();
int main() {
Menu();
int function;
function = Input_judgefun(function);
while (function != 0) {
switch (function) {
case 1:
int n1; // n1 为多项式 A 的项数
printf("请输入第一个多项式的项数:");
scanf("%d", &n1);
Polylist A;
Init(A); // 初始化链表 A
InputDataAndSortingData(A, n1); // 输入并整理数据
int n2;// n2 为多项式 B 的项数
printf("请输入第二个多项式的项数:");
scanf("%d", &n2);
Polylist B;
Init(B);// 初始化链表 B
InputDataAndSortingData(B, n2);// 输入并整理数据
PolynomialAdd(A, B); // 进入函数开始计算
DisplayResult(A); // 显示计算结果
break;
case 2:
AboutUs();
break;
}
printf("请输入下一步指令:\n");
function = Input_judgefun(function);
}
printf("感谢使用!\n");
return 0;
}
//输入数据, 边输入边排序进链表
void InputDataAndSortingData(Polylist Polynomial, int n) {
if(n == 0){
// 项数为零,直接返回
return;
}
int i;
Polylist q, p;
printf("请依次输入每一项的系数和指数:");
for (i = 1; i <= n; i++) {
Polylist s = (Polylist)malloc(sizeof(Polynode));
scanf("%d%d", &s->coef, &s->exp);
if (!(Polynomial->next)) { // 插入第一个结点
s->next = Polynomial->next;
Polynomial->next = s;
}
else {
// p、q 均为工作指针,其中 q 在前,p 在后
q = Polynomial;
p = Polynomial->next;
while (p) {
if (s->exp > p->exp) {
// 如果要插入的结点 s 的 exp 值大于 p 结点的 exp 值就将 s 插入到 p 结点之前
s->next = p;
q->next = s;
break;
}else if(s->exp == p->exp){//指数相等系数直接相加
p->coef+=s->coef;
break;
}else{// p、q 指针后移
q = q->next;
p = p->next;
}
}
if (!p) {// 插入节点的 exp 值是最小的,插在链表末尾
s->next = q->next;
q->next = s;
}
}
}
}
//将两个多项式相加,线性表合并算法
void PolynomialAdd(Polylist A, Polylist B) {
Polylist p, q, tail, temp;
int sum;
// 令 p 和 q 分别指向 A 和 B 多项式链表的第一个结点
p = A->next;
q = B->next;
tail = A; // tail 指向多项式的尾结点
while (p && q) { // 当两个多项式均未扫描结束时
if (p->exp > q->exp) {
// p 指向的多项式指数大于 q 的指数,将 p 结点加入到和多项式中
tail->next = p;
tail = p;
p = p->next;
}
else if (p->exp == q->exp) {
// 若指数相等,则相应的系数相加
sum = p->coef + q->coef;
if (sum != 0) {
// 系数和非零,则系数和置入结点 p,p 加入到和多项式,
// 释放结点 q,并将指针后移
p->coef = sum;
tail->next = p;
tail = p;
p = p->next;
temp = q; q = q->next; free(temp);
}
else {
// 若系数和为零,则删除结点 p 与 q,并将指针指向下一个结点
temp = p; p = p->next; free(temp);
temp = q; q = q->next; free(temp);
}
}
else {
// p 指向的多项式指数小于 q 的指数,将 q 结点加入到和多项式中
tail->next = q;
tail = q;
q = q->next;
}
}
if (p) {
// 多项式 A 中还有剩余,将剩余的结点加入到和多项式中
tail->next = p;
}
else {
// 多项式 B 中还有剩余,将剩余的结点加入到和多项式中
tail->next = q;
}
free(B); //释放 B 链表所占的内存
}
//初始化多项式链表
void Init(Polylist &X) {
X = (Polylist)malloc(sizeof(Polynode));
X->next = NULL; // 将链表的头节点的 next 域置为空
X->exp = 32767; // 初始时头节点的 exp 域为无穷大
X->coef = 32767; // 初始时头节点的 coef 域为无穷大
}
// 输出计算结果
void DisplayResult(Polylist A) {
Polylist p,temp;
p = A->next;
printf("计算结果:");
if(p == NULL){ // 处理为相加为 0 的情况
printf("0");
}
else
while (p) {
// 如果不是最后一个结点,则分别打印系数、未知元、指数、空格、加号、空格
// 如果是最后一个结点 ,则分别打印系数、未知元、指数
// 同平常书写一样,如果系数或指数为 1 则省略不打印,如果是常数项,则只打印常数
if (p->next != NULL && p->exp != 1 && p->coef != 1) {
printf("%dx^%d + ", p->coef, p->exp);
}
else if (p->next != NULL && p->exp == 1 && p->coef != 1) {
printf("%dx + ", p->coef);
}
else if (p->next != NULL && p->exp != 1 && p->coef == 1) {
printf("x^%d + ", p->exp);
}
else if (p->next != NULL && p->exp == 1 && p->coef == 1) {
printf("x + ");
}
else if (p->next != NULL && p->exp == 0) {
printf("%d + ", p->coef);
}
else if(p->next == NULL && p->exp == 0){
printf("%d", p->coef);
}
else if (p->next == NULL && p->exp != 1 && p->coef != 1) {
printf("%dx^%d", p->coef, p->exp);
}
else if (p->next == NULL && p->exp == 1 && p->coef != 1) {
printf("%dx", p->coef);
}
else if (p->next == NULL && p->exp != 1 && p->coef == 1) {
printf("x^%d", p->exp);
}
else if (p->next == NULL && p->exp == 1 && p->coef == 1) {
printf("x");
}
temp = p;
p = p->next;
free(temp); // 依次释放每个节点的内存
}
free(A); // 释放 A 节点
printf("\n");
}
// 指令输入与判断
int Input_judgefun(int function){
scanf("%d", &function);
while (function < 0 || function > 2) {
// 有效指令为 0、1、2,如菜单中所示
printf("输入指令有误!请重新输入:");
scanf("%d", &function);
}
return function;
}
// 显示菜单
void Menu() {
printf("\t\t\t\t\t欢迎使用一元稀疏多项式加法计算器!\n");
printf("\t\t\t\t\t\t******菜单******\n");
printf("\t\t\t\t\t\t* *\n");
printf("\t\t\t\t\t\t* 1.开始计算 *\n");
printf("\t\t\t\t\t\t* *\n");
printf("\t\t\t\t\t\t* 2.关于我们 *\n");
printf("\t\t\t\t\t\t* *\n");
printf("\t\t\t\t\t\t* 0.退出 *\n");
printf("\t\t\t\t\t\t* *\n");
printf("\t\t\t\t\t\t****************\n");
printf("请输入对应功能前的数字:");
}
// 关于我们
void AboutUs(){
printf("更新时间:2020/7/3\n");
}