戳这里还有其他数据结构的题目噢
https://blog.csdn.net/qq_45724947/article/details/115625130?spm=1001.2014.3001.5501
设计并验证以下算法:一元稀疏多项式计算器。
(1) 设Pn(x)和Qm(x)分别为两个-元稀疏多项式,利用单链表存储Pn(x)和Qm(x)。
(2) 从键盘输入一元多项式的信息,建立一元稀疏多项式Pn(x)和Qm(x),并输出。
(3) 实现Pn(x)和Qm(x)相加,并输出两者的和Pn(x)+Qm(x)。
(4) 实现Pn(x)和Qm(x)相减,并输出两者的差Pn(x)-Qm(x)。
(5) 就地逆置两者的差Pn(x)-Qm(x)。
直接上代码:
#include <stdio.h>
#include<stdlib.h>
#include <malloc.h>
typedef int ElemType;
typedef int Status;
typedef struct NList{//定义多项式的存储结构
int coef; // 系数
int index; //指数
struct NList *next;
}PolyNode,*PolyList;
PolyList p,q,r;
void initList(PolyList *L){//创建多项式
(*L) = (PolyList)malloc(sizeof(PolyNode));
(*L)->next = NULL;
r=(*L);
int coef,index;
printf("请输入多项式的系数coef和指数index:(系数coef为0结束!)\n");
scanf("%d %d",&coef,&index);
while(coef != 0){
//生成新节点;
p = (PolyList)malloc(sizeof(PolyNode));
p->next = NULL;
p->coef = coef;
p->index = index;
//把 新节点 以 尾接法方式插入链表;
r->next=p; r=p;
scanf("%d %d",&coef,&index);
}
}
void add(PolyList a,PolyList b,PolyList *c){//多项式加法
PolyList pa,pb,pc;
(*c) = (PolyList)malloc(sizeof(PolyNode));
(*c)->next = NULL; r=(*c);
pa=a->next; pb=b->next;
while((pa!=NULL)&&(pb!=NULL)){
if(pa->index < pb->index){
//复制a的当前元素节点
pc=(PolyList)malloc(sizeof(PolyNode));
pc->next=NULL;
pc->index=pa->index;
pc->coef=pa->coef;
//把新节点加入c
r->next=pc; r=pc;
pa=pa->next;
}else if(pa->index == pb->index){
//将两个系数相加和赋值给变量sum
int sum;
sum=pa->coef+pb->coef;
if(sum!=0){
//生成新节点并适当赋值;
pc=(PolyList)malloc(sizeof(PolyNode));
pc->next=NULL;
pc->coef=sum; pc->index=pa->index;
//把新节点加入c
r->next=pc; r=pc;
}
pa=pa->next;pb=pb->next;
}else if(pa->index > pb->index){
//复制b的当前元素节点
pc=(PolyList)malloc(sizeof(PolyNode));
pc->next=NULL;
pc->index=pb->index;
pc->coef=pb->coef;
//把新节点加入c
r->next=pc; r=pc;
pb=pb->next;
}
}
if(pa){
pc->next=pa;
}else if(pb){
pc->next=pb;
}
}
void printList(PolyList l){//打印多项式
p=l->next;
int i = 0;//为了打印项之间的符号
while(p){
if(i != 0)
printf("+");
if(p->coef < 0)
printf("(%d)X^%d",p->coef,p->index);
if(p->coef > 0)
printf("%dX^%d",p->coef,p->index);
p=p->next;
i++;
}
printf("\n");
}
void oppositeList(PolyList *l){//多项式的系数取相反数
PolyList p=(*l)->next;
while(p){
p->coef=-p->coef;
p=p->next;
}
}
void subtractionList(PolyList a,PolyList b,PolyList *c){//多项式减法
oppositeList(&b);
add(a,b,c);
oppositeList(&b);
}
void reverse (PolyList *l){//多项式逆置
PolyList p,q,r;
p=*l;
q=p->next;
p->next=NULL;
while(q){
r=q->next;
q->next=p->next;
p->next=q;
q=r;
if(r)
r=r->next;
}
}
int main(){
PolyList a,b,c;
initList(&a);//创建一元多项式 a
initList(&b);//创建第二个多项式 b
printf("\na多项式: ");
printList(a);
printf("\nb多项式: ");
printList(b);
add(a,b,&c); //把a,b扔进去 得到c
printf("\na+b得到新多项式: ");
printList(c);
subtractionList(a,b,&c); //同上
printf("\na-b得到新多项式: ");
printList(c);
printf("\n逆置后的多项式c: ");
reverse(&c);
printList(c);
return 0;
}
/*
样例输入
7 0
3 1
9 8
5 17
0 0
8 1
22 7
-9 8
0 0
*/
(请不要直接复制使用。代码仅供参考,希望读者借此代码自身可以理解学习)
如果代码对您有帮助,不要忘记评论收藏噢~