一元多项式的表示
typedef struct ploy {
double coef; //系数部分
int exp; //指数部分
struct ploy* next;
}ploy;
一元多项式的建立
输入的格式是 1+2x^1+2x^2
这样的格式以#
结束。
ploy* create_ploy() {
ploy* head,*s,*p;
head = (ploy*)malloc(sizeof(ploy));
head->next = NULL;
s = head;
char ch;
int flag = 0; //记录的是除了数字与+之外输入的字母个数
int key = 2;//标记正负
p = (ploy*)malloc(sizeof(ploy));
while (~scanf_s("%c", &ch,1)) {
if (ch == '#')
break;
if (ch == '+'||ch =='-') {
if (flag == 1) //表明输入的是7x这样的情况
s->exp = 1; //x指数尾1的情况
p = (ploy*)malloc(sizeof(ploy)); //建立新节点
flag = 0;
if (ch == '+')
key = 1;
else
key = 0;
}
if (isdigit(ch)) {
if (flag == 0) {
if(key)
p->coef = ch - '0';
else if(key ==0)
p->coef = -(ch - '0');
p->exp = 0; //默认指数是-1
s->next = p;
s = p;
}
else if (flag == 2) //指数不为0
s->exp = ch - '0';
}
else if(ch!='+'&&ch!='-')
flag++;//记得加上
}
s->next = NULL; //最后一个结点指向空
return head;
}
一元多项式相加
实质是:
- 指数不同是链表的合并
- 指数相同,系数相加;若为0,去掉该结点;若不为0,修改结点的系数域。
ploy* add(ploy* La, ploy* Lb) {
ploy* pa, * pb, * pc,*q,*head;
head = (ploy*)malloc(sizeof(ploy));
head->next = NULL;
pc = head;
pa = La->next;
pb = Lb->next;
while (pa && pb) {
if (pa->exp == pb->exp) { //指数相同
pa->coef = pa->coef + pb->coef; //系数相加
if ((int)pa->coef == 0) { //系数相加为0
q = pa; //删除pa指向的结点
pa = pa->next;
free(q);
}
else //系数相加不为0
{
pc->next = pa;
pc = pa;
pa = pa->next;
}
q = pb; //删除pb所指的结点
pb = pb->next;
free(q);
}
else if (pa->exp < pb->exp) {
pc->next = pa;
pc = pa;
pa = pa->next;
}//将pa所指的结点合并,pa指向下一个结点
else {
pc->next = pb;
pc = pb;
pb = pb->next;
}//将pb所指的结点合并,pb指向下一个结点
}
//那个链没有处理完,就处理
if (pa)pc->next = pa;
else pc->next = pb;
return head;
}
一元多项式的打印
void show(ploy* head) {
ploy* p = head->next;
while (p->next) {
if (p->coef > 0.0) { //分为正负打印
if (p->exp == 0)
printf("+%.2lf", p->coef);
else if (p->exp == 1)
printf("+%.2lfx", p->coef);
else
printf("+%.2lfx^%d", p->coef, p->exp);
}
else {
if (p->exp == 0)
printf("-%.2lf", p->coef);
else if (p->exp == 1)
printf("-%.2lfx+", p->coef);
else
printf("-%.2lfx^%d+", p->coef, p->exp);
}
p = p->next;
}
//最后一个
if(p->coef>0.0)
printf("+%.2lfx^%d\n", p->coef, p->exp);
else
printf("-%.2lfx^%d\n", p->coef, p->exp);
}
完整代码
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include<ctype.h>
typedef struct ploy {
double coef; //系数部分
int exp; //指数部分
struct ploy* next;
}ploy;
ploy* create_ploy() {
ploy* head,*s,*p;
head = (ploy*)malloc(sizeof(ploy));
head->next = NULL;
s = head;
char ch;
int flag = 0; //记录的是除了数字与+之外输入的字母个数
int key = 2;//标记正负
p = (ploy*)malloc(sizeof(ploy));
while (~scanf_s("%c", &ch,1)) {
if (ch == '#')
break;
if (ch == '+'||ch =='-') {
if (flag == 1) //表明输入的是7x这样的情况
s->exp = 1; //x指数尾1的情况
p = (ploy*)malloc(sizeof(ploy)); //建立新节点
flag = 0;
if (ch == '+')
key = 1;
else
key = 0;
}
if (isdigit(ch)) {
if (flag == 0) {
if(key)
p->coef = ch - '0';
else if(key ==0)
p->coef = -(ch - '0');
p->exp = 0; //默认指数是-1
s->next = p;
s = p;
}
else if (flag == 2) //指数不为0
s->exp = ch - '0';
}
else if(ch!='+'&&ch!='-')
flag++;//记得加上
}
s->next = NULL; //最后一个结点指向空
return head;
}
ploy* add(ploy* La, ploy* Lb) {
ploy* pa, * pb, * pc,*q,*head;
head = (ploy*)malloc(sizeof(ploy));
head->next = NULL;
pc = head;
pa = La->next;
pb = Lb->next;
while (pa && pb) {
if (pa->exp == pb->exp) { //指数相同
pa->coef = pa->coef + pb->coef; //系数相加
if ((int)pa->coef == 0) { //系数相加为0
q = pa; //删除pa指向的结点
pa = pa->next;
free(q);
}
else //系数相加不为0
{
pc->next = pa;
pc = pa;
pa = pa->next;
}
q = pb; //删除pb所指的结点
pb = pb->next;
free(q);
}
else if (pa->exp < pb->exp) {
pc->next = pa;
pc = pa;
pa = pa->next;
}//将pa所指的结点合并,pa指向下一个结点
else {
pc->next = pb;
pc = pb;
pb = pb->next;
}//将pb所指的结点合并,pb指向下一个结点
}
//那个链没有处理完,就处理
if (pa)pc->next = pa;
else pc->next = pb;
return head;
}
void show(ploy* head) {
ploy* p = head->next;
while (p->next) {
if (p->coef > 0.0) { //分为正负打印
if (p->exp == 0)
printf("+%.2lf", p->coef);
else if (p->exp == 1)
printf("+%.2lfx", p->coef);
else
printf("+%.2lfx^%d", p->coef, p->exp);
}
else {
if (p->exp == 0)
printf("-%.2lf", p->coef);
else if (p->exp == 1)
printf("-%.2lfx+", p->coef);
else
printf("-%.2lfx^%d+", p->coef, p->exp);
}
p = p->next;
}
//最后一个
if(p->coef>0.0)
printf("+%.2lfx^%d\n", p->coef, p->exp);
else
printf("-%.2lfx^%d\n", p->coef, p->exp);
}
int main() {
ploy* head,*head1,*head2;
head1 = create_ploy();
getchar();
head2 = create_ploy();
show(head1);
show(head2);
head = add(head1, head2);
show(head);
return 0;
}