数据结构与算法-实验1-多项式的计算:合并同类项、升幂排序、多项式加法、减法、乘法

#include

#include

#include

using namespace std;

//多项式的项

typedef struct polynomial     //定义struct类型数据

{

int n;                    //统计链表中元素个数

int coef, index;          //每一项系数及指数

struct polynomial *next;  //指向下一项的指针

}POLY;

POLY *Create_poly(void);

POLY *Sort_poly(POLY *head);     //对多项式按升幂顺序排

POLY *Tidy_poly(POLY *head);     //对多项式合并同类项

POLY *Add_poly(POLY *, POLY *);  //多项式加法

POLY *Dec_poly(POLY *, POLY *);  //多项式减法

POLY *Mul_poly(POLY *, POLY *);  //多项式乘法

void Print_poly(POLY *);

 

int main(void)

{

POLY *heada = NULL, *headb = NULL, *headsum = NULL, *headmul = NULL;

printf("创建第一个多项式:\n");

heada = Create_poly();

printf("创建第二个多项式:\n");

headb = Create_poly();

printf("第一个多项式是:\n");

Print_poly(heada);

printf("第二个多项式是:\n");

Print_poly(headb);

headsum = Add_poly(heada, headb);

printf("两多项式相加结果是:");

Print_poly(headsum);

headsum = Dec_poly(heada, headb);

printf("两多项式相减结果是:");

Print_poly(headsum);

headmul = Mul_poly(heada, headb);

printf("两多项式相乘结果是:");

Print_poly(headmul);

return 0;

}

 

//创建

POLY *Create_poly()

{

int count = 0;                                //数据节点个数计数

int  coef = 0, index = 0;

POLY *head = NULL, *s = NULL, *r = NULL;

head = (POLY *)malloc(sizeof(POLY));     //申请新节点空间,头节点

r = head;

printf("请输入多项式每一项的系数及其对应的指数(以0 0结束):\n");

scanf_s("%d%d", &coef, &index);

while (coef != 0)

{

s = (POLY *)malloc(sizeof(POLY));

s->coef = coef, s->index = index;

r->next = s;

r = s;                             //移动的节点,起针的作用

count++;

scanf_s("%d%d", &coef, &index);

}

r->next = NULL;

head->n = count;

head = Tidy_poly(head);

return head;

}

//合并同类项

POLY *Tidy_poly(POLY *head)

{

int p2start = 0;

POLY *p1 = NULL, *p2 = NULL, *p2p = NULL;

if (head == NULL){ return NULL; }       //如果传进的是空表,则返回空

if (head->next == NULL){ return head; } //如果传进的是只有一个节点的表,则直接返回此表

 

p1 = p2 = p2p = head;

while (p1->next != NULL)

{

while (p2->next != NULL)

{

if (p1->index == p2->index)

{

if (p2start == 0)

{

p2start = 1;

p2 = p2->next;  //首次分离p2p与p2

}

else

{

p1->coef = p1->coef + p2->coef;

//然后进行删除后面相同指数的节点操作

if (p2->next == NULL)

{

p2p->next = NULL;

head->n--;

break;

}

p2 = p2->next;

p2p->next = p2;

head->n--;

}

}

else  //指数不等,移动p2

{

if (p2->next == NULL){ break; }

p2p = p2;

p2 = p2->next;

}

}

if (p1->index == p2->index&&p2start == 1)  //回收最后一个元素

{

p1->coef = p1->coef + p2->coef;

p2p->next = NULL;

head->n--;

}

if (p1->next == NULL)

{

head = Sort_poly(head);  //排序

return head;

}

p1 = p2 = p2p = p1->next;

p2start = 0;

}

head = Sort_poly(head);   //排序

return head;

}

//升幂排序

POLY *Sort_poly(POLY *head)

{

int pflag1 = 0,flag = 1;

POLY *p1 = NULL, *pMin = NULL, *p2 = NULL, *ptemp = NULL;

if (head == NULL){ return NULL; }       //如果传进的是空表,则返回空

if (head->next == NULL){ return head; } //如果传进的是只有一个节点的表,则直接返回此表

 

p1 = pMin = ptemp = p2 = head;

while (p1->next != NULL)

{

if (pflag1 == 0)

{

pflag1 = 1;

}

else

{

ptemp = p1;

pMin = p2 = p1->next;

}

while (p2->next != NULL)    //找出最小指数

{

p2 = p2->next;

if (pMin->index > p2->index)  //分离pMin、p2

{

pMin = p2;

}

}

if (pMin != head)               //注意起始的时候别访问越界

{

while (ptemp->next != pMin) //定位ptemp在pMin之前

{

ptemp = ptemp->next;

}

}

if (flag==1)    //第一次插入的是head后

{

if (head == pMin) //是跟在head后的开头元素吗

{

p1 = head;

flag = 0;

continue;

}

else

{

//把元素剪出来,插入head后面

if (pMin->next == NULL)

{

ptemp->next = NULL;

}

else

{

ptemp->next = pMin->next;

}

pMin->next = head->next;

head->next = pMin;

p1 = head;

flag = 0;

continue;

}

}

else

{

//这里是插入在p1后

if (pMin->next == NULL)

{

ptemp->next = NULL;

}

else

{

ptemp->next = pMin->next;

}

pMin->next = p1->next;

p1->next = pMin;

p1 = pMin;

}

}

return head;

}

//相加

POLY *Add_poly(POLY *opera1, POLY *opera2)

{

POLY *head, *tmp, *s = NULL;

int value;

opera1 = opera1->next;

opera2 = opera2->next;

head = tmp = (POLY*)malloc(sizeof(POLY));

head->next = NULL;

while (opera1 &&opera2)

{

if (opera1->index == opera2->index)

{

value = opera1->coef + opera2->coef;

if (value != 0)

{

s = (POLY *)malloc(sizeof(POLY));

s->coef = value;

s->index = opera1->index;

s->next = NULL;

}

opera1 = opera1->next;

opera2 = opera2->next;

}

else

if (opera1->index <opera2->index)

{

s = (POLY *)malloc(sizeof(POLY));

s->coef = opera1->coef;

s->index = opera1->index;

s->next = NULL;

opera1 = opera1->next;

}

else

{

s = (POLY *)malloc(sizeof(POLY));

s->coef = opera2->coef;

s->index = opera2->index;

s->next = NULL;

opera2 = opera2->next;

}

if (head->next == NULL)

{

head->next = s;

tmp = s;

}

else

{

tmp->next = s;

tmp = s;

}

}

tmp->next = opera1 ? opera1 : opera2;

return head;

}

//相减,不能改变原链,多项式还有其他用

POLY *Dec_poly(POLY *head1, POLY *head2)

{

//定义为head1-head2,漏斗法

int value;

int flag = 0,flag1=1,flag2=1;

int pflag=1;

POLY *head = NULL, *pt1 = NULL, *pt2 = NULL, *phead = NULL, *s = NULL;

pt1 = head1;

pt2 = head2;

while (pt1->next != NULL&&pt2->next != NULL)  //两个多项式分别多于两项,其中任一置空的都已回收

{

if (flag == 0)

{

flag = 1;

}

else

{

if (pflag == 1)       //移动pt1

{

pt1 = pt1->next;

}

else if (pflag==2)   //移动pt2

{

pt2 = pt2->next;

}

else if (pflag == 3) //同时移动pt1、pt2

{

pt1 = pt1->next;

pt2 = pt2->next;

}

}

if (pt1->index == pt2->index)

{

value = pt1->coef - pt2->coef;

if (value != 0)

{

s = (POLY *)malloc(sizeof(POLY));

s->coef = value;                  //系数

s->index = pt1->index;            //指数

s->next = NULL;

if (flag1 == 1)  //首次将head、phead接上第一个节点空间

{

flag1 = 0;   //状态置换

head = phead = s;

pflag = 3;

}

else

{

phead->next = s;

phead = phead->next;

pflag = 3;

}

}

}

else if (pt1->index index)

{

s = (POLY *)malloc(sizeof(POLY));

s->coef = pt1->coef;

s->index = pt1->index;

s->next = NULL;

if (flag1 == 1)  //首次将head、phead接上第一个节点空间

{

flag1 = 0;

head = phead = s;

pflag = 1;

}

else

{

phead->next = s;

phead = phead->next;

pflag = 1;

}

}

else

{

value = 0 - pt2->coef;

s = (POLY *)malloc(sizeof(POLY));

s->coef = value;

s->index = pt2->index;

s->next = NULL;

if (flag1 == 1)  //首次将head、phead接上第一个节点空间

{

flag1 = 0;

head = phead = s;

pflag = 2;

}

else

{

phead->next = s;

phead = phead->next;

pflag = 2;

}

}

}

//什么置空导致while退出,还是同时空(合并或者不合并,或者不作处理),回收元素

if (pt1->next == NULL&&pt2->next != NULL)     //pt1置空

{

while (pt2->next != NULL)

{

if (flag2 == 1)

{

flag2 = 0;

}

else

{

pt2 = pt2->next;

}

if (flag == 0)  //要回收pt1,即head==phead==NULL

{

flag = 1;   //状态置换

s = (POLY *)malloc(sizeof(POLY));

s->coef = pt1->coef;

s->index = pt1->index;

s->next = NULL;

head = phead = s;

value = 0 - pt2->coef;

s = (POLY *)malloc(sizeof(POLY));

s->coef = value;

s->index = pt2->index;

s->next = NULL;

phead->next= s;

phead = phead->next;

}

else

{

if (pflag == 3)  //此时的pt2不回收

{

pflag = 4;   //置新状态

continue;

}  

value = 0 - pt2->coef;

s = (POLY *)malloc(sizeof(POLY));

s->coef = value;

s->index = pt2->index;

s->next = NULL;

phead->next = s;

phead = phead->next;

}

}

}

else if (pt2->next== NULL&&pt1->next != NULL) //pt2置空

{

while (pt1->next != NULL)

{

if (flag2 == 1)

{

flag2 = 0;

}

else

{

pt1 = pt1->next;

}

if (flag == 0)  //要回收pt2,即head==phead==NULL

{

flag = 1;   //状态置换

value = 0 - pt2->coef;

s = (POLY *)malloc(sizeof(POLY));

s->coef = value;

s->index = pt2->index;

s->next = NULL;

head = phead = s;

s = (POLY *)malloc(sizeof(POLY));

s->coef = pt1->coef;

s->index = pt1->index;

s->next = NULL;

phead->next = s;

phead = phead->next;

}

else

{

if (pflag == 3)    //此时的pt1不回收

{

pflag = 4;     //置新状态

continue;

}  

s = (POLY *)malloc(sizeof(POLY));

s->coef = pt1->coef;

s->index = pt1->index;

s->next = NULL;

phead->next = s;

phead = phead->next;

}

}

}

else  //同时置空

{

if (flag == 0)  //即一开始两数就仅有一项

{

if (pt1->index < pt2->index)

{

s = (POLY *)malloc(sizeof(POLY));

s->coef = pt1->coef;

s->index = pt1->index;

s->next = NULL;

head = s;

value = 0 - pt2->coef;

s = (POLY *)malloc(sizeof(POLY));

s->coef =value;

s->index = pt2->index;

s->next = NULL;

head->next = s;

}

else if (pt1->index > pt2->index)

{

value = 0 - pt2->coef;

s = (POLY *)malloc(sizeof(POLY));

s->coef = value;

s->index = pt2->index;

s->next = NULL;

head = s;

s = (POLY *)malloc(sizeof(POLY));

s->coef = pt1->coef;

s->index = pt1->index;

s->next = NULL;

head->next = s;

}

else

{

value = pt1->coef - pt2->coef;  //合并

if (value != 0)

{

s = (POLY *)malloc(sizeof(POLY));

s->coef = value;

s->index = pt1->index;

s->next = NULL;

head = s;

}

}

}

       //不是开始都为空,状态为运算到结尾同时为空,运算结束

}

return head;

}

//相乘

POLY *Mul_poly(POLY *op1, POLY *op2)

{

POLY *head;

POLY *t, *q, *s, *r;

head = (POLY *)malloc(sizeof(POLY));

head->next = NULL;

r = (POLY *)malloc(sizeof(POLY));

r->next = NULL;

for (t = op1->next; t; t = t->next)  //双重循环,即第一项多项式每一项乘上第二项的每一项

{

for (q = op2->next; q; q = q->next)

{

s = (POLY *)malloc(sizeof(POLY));

r->next = s;

s->coef = q->coef * t->coef;

s->index = q->index + t->index;

s->next = NULL;

head = Add_poly(r, head);

}

}

return head;

}

//输出

void Print_poly(POLY *head)

{

int flag = 1;

POLY *p = NULL;

p = head->next;

if (p == NULL)

printf("多项式为空!\n");

else

{

do

{

if (p->coef >= 0)

{

if (flag == 1)

{

printf("%dx^%d", p->coef, p->index);

flag = 0;

}

else

{

printf("+%dx^%d", p->coef, p->index);

}

}

else

printf("%dx^%d", p->coef, p->index);

p = p->next;

} while (p != NULL);

printf("\n");

}

}

 

 

 

你可能感兴趣的:(C/C++编程技巧)