#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
typedef struct Lnode {
int co;//系数
int exp;//指数
struct Lnode *next;
}Lnode;//结构体
Lnode Create() {//创建链表
Lnode *head, *p;
int c, e;
head = (Lnode*)malloc(sizeof(Lnode));
p = head;
head->next = NULL;//创建空链表
printf("请分别输入新的一项的系数和指数 (以系数0作为结束)\n");
scanf("%d%d", &c, &e);//输入系数和指数
//while((c!=-1) || (e!=-1)) { //当指数不等于-1或系数不等于-1时进入循环尾插法建立链表
while(c != 0 ) {
Lnode *s;
s=(Lnode*)malloc(sizeof(Lnode));
s->co=c;
s->exp=e;
scanf("%d%d", &c, &e);
p->next=s;
p=s;
}
p->next = NULL;
return *head;
}
Lnode Add(Lnode *a, Lnode *b) {//多项式相加的函数
Lnode *c;
c = (Lnode*)malloc(sizeof(Lnode));
c->next = NULL;//生成一个新的头结点
Lnode *p1, *p2;
p1 = a->next;//p1指向链表a的第一个节点
p2 = b->next;//p2指向链表b的第一个节点
Lnode *rear = c;
while(p1 != NULL && p2 != NULL) {//当指针p1和p2都不为空时
if(p1->exp > p2->exp) {//当链表a节点的指数数大于链表b节点的指数时
Lnode *p3;
p3 = (Lnode*)malloc(sizeof(Lnode));//生成一个新节点p3;
p3->co = p1->co;//把p1的系数赋值给p3的系数
p3->exp = p1->exp;//把p1的指数赋值给p3的指数
p3->next = NULL;//把p3的next赋值为空
rear->next = p3;//把rear的next指向新节点p3
rear = p3;//rear 指向p3
p1 = p1->next;//p1移动到下一个指针位置
}//总体实现的功能利用尾插法形成一个新的链表
else if(p1->exp < p2->exp) {//当链表a节点的指数数小于链表b节点的指数时
Lnode *p3;
p3 = (Lnode*)malloc(sizeof(Lnode));
p3->co = p2->co;//把p2的系数赋值给p3的系数
p3->exp = p2->exp;//把p2的指数赋值给p3的指数
p3->next = NULL;//p3 的next置为空
rear->next = p3;//把rear的next指向新节点p3
rear = p3;//rear 指向p3
p2 = p2->next;//p2移动到下一个指针位置
}
else {//当p1->exp==p2->exp
if((p1->co != 0) && (p2->co != 0)) {//如果p1的系数和p2的系数不同时为0
Lnode *p3;
p3=(Lnode*)malloc(sizeof(Lnode));
p3->co = p1->co + p2->co;//把p1和p2系数的和赋值给p3的系数
p3->exp = p1->exp;//把p1的指数赋值给p3的指数
p3->next = NULL;
rear->next = p3;//把rear的next指向新节点p3
rear = p3;//rear 指向p3
}
p2 = p2->next;//p2移动到下一个指针位置
p1 = p1->next;//p1移动到下一个指针位置
}
}
if(p1==NULL) {
while(p2 != NULL) {//当指针p1为空p2不为空时
Lnode *p3;
p3=(Lnode*)malloc(sizeof(Lnode));//生成一个新节点
p3->co = p2->co;
p3->exp = p2->exp;
p3->next = NULL;
rear->next = p3;
rear = p3;
p2 = p2->next;
}
}
else {
while(p1 != NULL) {//当指针p1不为空p2为空时
Lnode *p3;
p3=(Lnode*)malloc(sizeof(Lnode));
p3->co = p1->co;
p3->exp = p1->exp;
p3->next = NULL;
rear->next = p3;
rear = p3;
p1 = p1->next;
}
}
return *c;//返回指针c
}
Lnode Del(Lnode *a,Lnode *b) {//多项式相减
Lnode *c;
c=(Lnode*)malloc(sizeof(Lnode));
c->next=NULL;
Lnode *p1,*p2;
p1=a->next;
p2=b->next;
Lnode *rear=c;
while(p1!=NULL&&p2!=NULL) {//当p1不为空p2不为空时
if(p1->exp>p2->exp) {//如果p1的指数小于p2的指数
Lnode *p3;
p3=(Lnode*)malloc(sizeof(Lnode));
p3->co=p1->co;
p3->exp=p1->exp;
p3->next=NULL;
rear->next=p3;
rear=p3;
p1=p1->next;
}
else if(p1->exp <p2->exp) {
Lnode *p3;
p3=(Lnode*)malloc(sizeof(Lnode));
p3->co=-(p2->co);
p3->exp=p2->exp;
rear->next=p3;
rear=p3;
p2=p2->next;
}
else {//p1->exp==p2->exp p1的指数和p2的指数相等时
if((p1->co!=0)&&(p2->co!=0)) {//p1的系数不等于p2的系数不等于0
Lnode *p3;
p3=(Lnode*)malloc(sizeof(Lnode));
p3->co=p1->co-p2->co;//把p1的系数减去p2的系数之差赋值给p3
p3->exp=p1->exp;//把p1的指数赋值给p3的指数
p3->next=NULL;
rear->next=p3;
rear=p3;
}
p2=p2->next;
p1=p1->next;
}
}
if(p1==NULL) {
while(p2!=NULL) {
Lnode *p3;
p3=(Lnode*)malloc(sizeof(Lnode));
p3->co=-(p2->co);
p3->exp=p2->exp;
p3->next=NULL;
rear->next=p3;
rear=p3;
p2=p2->next;
}
}
else if(p2==NULL) {
while(p1!=NULL) {
Lnode *p3;
p3=(Lnode*)malloc(sizeof(Lnode));
p3->co=p1->co;
p3->exp=p1->exp;
p3->next=NULL;
rear->next=p3;
rear=p3;
p1=p1->next;
}
}
return *c;
}
void print(Lnode *head) {//打印节点的函数
if(head==NULL) {//如果链表不存在
printf("多项式不存在");
return ;
}
Lnode *p;
p = head->next;
if(p != NULL && p->co!=0)//如果p指针不为空p的系数不为0
printf("%d*x^%d",p->co,p->exp);
p=p->next;
while(p!=NULL) {
if(p->co > 0) {//当p的系数大于0时
printf("+%d*x^%d",p->co,p->exp);//把连字符“+”打印出来
p=p->next;
}
else if(p->co < 0) {//当p的系数小于0时
printf("%d*x^%d",p->co,p->exp);//此时不用打印"+"连字符
p=p->next;
}
else break;
}
printf("\n");
}
int main() {
printf("请输入多项式A:");
Lnode p;
p=Create();//创建链表a
printf("多项式A为:\n");
print(&p);
printf("请输入多项式B:\n");
Lnode p1;
p1=Create();//创建链表b
printf("多项式B为:\n");
print(&p1);
Lnode p2, p3;
p2 = Add(&p, &p1);//调用链表相加函数
printf("多项式A加B后的结果为:");
print(&p2);
p3 = Del(&p, &p1);//调用链表相减函数
printf("多项式A减B后的结果为:");
print(&p3);
return 0;
}
一元多项式计算——数据结构实习
猜你喜欢
转载自blog.csdn.net/qq_40830622/article/details/80844795
今日推荐
周排行