⑴ 输入并建立多项式;
⑵ 输出多项式,输出形式为整数序列:n,c1,e1,c2,e2……cn,en,其中n是多项式的项数,ci,ei分别为第i项的系数和指数。所有输出都按指数降序排列。
⑶ 多项式A和B相加,建立多项式A+B,输出相加的多项式;
⑷ 多项式A和B相减,建立多项式A-B,输出相减的多项式;
⑸ 多项式A和B相乘,建立多项式A×B,输出相乘的多项式;
⑹ 设计一个菜单,至少具有上述操作要求的基本功能。
(7) 通过文件输入、输出多项式
链式存储表示的类型定义
typedef struct ploy
{
float coef; /*系数部分*/
int expn; /*指数部分*/
struct ploy *next;
}PLoy;
初始化链表,生成只有头结点的空链表
PLoy *init_Ploy_LinkList(void)
{
PLoy *head;
head = (PLoy *)malloc(sizeof(PLoy));
head->coef = 0.0;
head->expn = 0;
head->next = NULL;
return head;
}
将项(co,ex)以k的方式插入到以L为头指针的一元多项式链表中
插入后的一元多项式链表是按指数从大到小排列的
void add_ploy_item(PLoy *L,float co,int ex,int k)
{
PLoy *pre = L, *p = L->next, *q;
float x;
while (p != NULL && p->expn > ex)
{
pre = p;
p = p->next;
}
if (p == NULL)//链表已经到最后,开辟新结点,直接插入到最后
{
q = (PLoy *)malloc(sizeof(PLoy));
q->coef = k*co;
q->expn = ex;
q->next = p;
pre->next = q;
}
else if (p->expn == ex)//有同类项
{
x = p->coef + k * co;
if (fabs(x) <= 1.0e-6)//合并后系数为0,删除该结点
{
pre->next = p->next;
free(p);
p = pre->next;
}
else
{
p->coef = x;//合并后不为0,修改该系数
}
}
else//没有同类项,开辟新结点,直接插入
{
q = (PLoy *)malloc(sizeof(PLoy));
q->coef = k * co;
q->expn = ex;
q->next = p;
pre->next = q;
}
}
每输入一项(co,ex),调用add_ploy_item函数,将其插入到以head为头结点的链表的合适位置`
void create_Ploy_LinkList(PLoy *head)
{
float coef;
int expn;
while (1)
{
printf("\n请输入一元多项式的系数(0.0表示结束): ");
scanf("%f", &coef);
if (coef == 0.0)
{
break;
}
else
{
printf("\n请输入一元多项式的指数: ");
scanf("%d", &expn);
add_ploy_item(head, coef, expn, 1);
}
}
}
将按指数从小到大有序的多项式LA和LB相加得到结果多项式链表LC
void add_ploy_LinkList(PLoy *LC, PLoy *LA, PLoy *LB)
{
PLoy *p;
p = LA->next;
while (p != NULL)
{
add_ploy_item(LC, p->coef, p->expn, 1);
//将多项式LA的每一项(c,e),依次将其插入到结果多项式链表的合适位置
p = p->next;
}
p = LB->next;
while (p != NULL)
{
add_ploy_item(LC, p->coef, p->expn, 1);
//将多项式LB的每一项(c,e)相加插入到结果多项式链表的合适位置
p = p->next;
}
}
将按指数从小到大有序的多项式LA和LB相乘得到结果多项式链表LC
void multi_ploy_LinkList(PLoy *LC, PLoy *LA, PLoy *LB)
{
PLoy *p = LA->next, *q;
float coef;
int expn;
while (p != NULL)//将多项式LA的每一项(c,e)
{
q = LB->next;
while (q != NULL)//与多项式LB的所有项依次相乘
{
coef = (float)p->coef * q->coef; //系数相乘得到积的系数
expn = p->expn + q->expn;//指数相加得到积的指数
if (fabs(coef) > 1.0e-6)//积的系数不为0,将其插入到结果多项式链表的合适位置
{
add_ploy_item(LC, coef, expn, 1);
}
q = q->next;
}
p = p->next;
}
}
输出以L为头结点的单链表中所有结点的值
void output_Ploy_LinkList(PLoy *L)
{
PLoy *p = L->next;
int first = 1;
if (p == NULL)
{
printf("\n您所输入的多项式为空!!\n\n");
}
else
{
while (p != NULL)
{
if (p->coef > 0 && first)
{
printf("%g", p->coef);
first = 0;
}
else if (p->coef > 0)
{
printf("+%g", p->coef);
}
else
{
printf("%g", p->coef);
first = 0;
}
if (p->expn != 0 && p->expn != 1)
{
printf("X^");
printf("%d", p->expn);
}
else if (p->expn == 1)
{
printf("X");
}
p = p->next;/* 移动指针p */
}
}
printf("\n\n");
}
将读取的多项式式,依照k方式写入到存放结果文件ployC.txt
void read_ploy_LinkList(PLoy *L)
{
FILE *fp;
PLoy *p = L->next;
fp = fopen("ployC.txt", "at+");
if (fp == NULL)
{
printf("Fail to open file!\n\n");
}
if ( p == NULL )
{
printf("输入文件的多项式为空\n\n");
}
fprintf(fp, ",");
while (p != NULL)
{
fprintf(fp, "%g %d, ", p->coef, p->expn);
p = p->next;
}
fprintf(fp,"\n");
fclose(fp);
}
读取k方式的文件,读出第n个多项式,写到多项式L上
void write_ploy_LinkList(PLoy *head, int k,int n)
{
float coef;
int expn,i = 0,c;
char ch;
FILE *fr;
if (k == 1)
{
fr = fopen("ployA.txt", "r");
}
else
{
fr = fopen("ployB.txt", "r");
}
while (i < n-1 && (c = fgetc(fr)) != EOF)// n-1就是你想跳过的行数
{
if (c == '\n')
{
i++;
}
}
while (1)
{
if ((ch = fgetc(fr)) == '\n') //读到换行符,结束
{
break;
}
else
{
fscanf(fr, "%g %d,", &coef, &expn);
//printf("%g,%d\n", coef, expn);
add_ploy_item(head, coef, expn, 1);
}
}
fclose(fr);
}
注:文件格式:
,1 2,(空格)1 2,(空格)1 2,(回车)