一元稀疏多项式简单的计算器
一元稀疏多项式简单的计算器
一元稀疏多项式计算器设计程序代码
#include
#include
#include
#include
#define maxlen 10
#define large 999
typedef struct Linklistomial{
float coef;
int expn;
struct Linklistomial *next;
}Linklistomial,*Linklist;
void Insert(Linklist p,Linklist h){
if(p->coef==0) free(p);//系数为0的话释放结点
else
{
Linklist q1,q2;
q1=h;
q2=h->next;
while(q2&&p->expnexpn) { //查找插入位置
q1=q2;
q2=q2->next;
}
if(q2&&p->expn==q2->expn) { //将指数相同相合并
q2->coef+=p->coef;
free(p);
if(!q2->coef) {//系数为0的话释放结点
q1->next=q2->next;
free(q2);
}
}
else { //指数为新时将结点插入
p->next=q2;
q1->next=p; }
}
}
Linklist CreateLinklist(Linklist head,int m){
//建立一个头指针为head、项数为m的一元多项式
int i;
Linklist p;
p=head=(Linklist)malloc(sizeof(struct Linklistomial));
head->next=NULL;
for(i=0;icoef,&p->expn);
Insert(p,head); //调用Insert函数插入结点
}
return head;
}
void DestroyLinklist(Linklist p){ //销毁多项式p
Linklist q1,q2;
q1=p->next; q2=q1->next;
while(q1->next) {
free(q1);
q1=q2;
q2=q2->next; }
}
void PrintLinklist(Linklist P){
Linklist q=P->next;
int flag=1; //项数计数器
if(!q) { //若多项式为空,输出0
putchar('0');
printf("\n");
return;
}
while(q)
{
if(q->coef>0&&flag!=1) putchar('+'); //系数大于0且不是第一项
if(q->coef!=1&&q->coef!=-1) { //系数非1或-1的普通情况
printf("%g",q->coef);
if(q->expn==1) putchar('X');
else if(q->expn) printf("X^%d",q->expn);
}
else {
if(q->coef==1)
{
if(!q->expn) putchar('1');
else if(q->expn==1) putchar('X');
else printf("X^%d",q->expn);
}
if(q->coef==-1)
{
if(!q->expn) printf("-1");
else if(q->expn==1) printf("-X");
else printf("-X^%d",q->expn);
}
}
q=q->next;
flag++;
}
printf("\n");
}
int compare(Linklist a,Linklist b){
if(a&&b)
{ if(!b||a->expn>b->expn) return 1;
else if(!a||a->expnexpn) return -1;
else return 0;
}
else if(!a&&b) return -1;//a多项式已空,但b多项式非空
else return 1;//b多项式已空,但a多项式非空
}
Linklist AddLinklist(Linklist pa,Linklist pb){//求解并建立多项式a+b,返回其头指针
Linklist qa=pa->next;
Linklist qb=pb->next;
Linklist headc,hc,qc;
hc=(Linklist)malloc(sizeof(struct Linklistomial));//建立头结点
hc->next=NULL;
headc=hc;
while(qa||qb)
{
qc=(Linklist)malloc(sizeof(struct Linklistomial));
switch(compare(qa,qb)){
case 1: {
qc->coef=qa->coef;
qc->expn=qa->expn;
qa=qa->next;
break; }
case 0: {
qc->coef=qa->coef+qb->coef;
qc->expn=qa->expn;
qa=qa->next;
qb=qb->next;
break;
}
case -1: {
qc->coef=qb->coef;
qc->expn=qb->expn;
qb=qb->next;
break; }
}
if(qc->coef!=0)
{
qc->next=hc->next;
hc->next=qc;
hc=qc;
}
else free(qc);//当相加系数为0时,释放该结点
}
return headc;
}
int ValueLinklist(Linklist head,int x){
//输入x值,计算并返回多项式的值
Linklist p;
int i;
int sum=0,t;
for(p=head->next;p;p=p->next)
{
t=1;
for(i=p->expn;i!=0;)
{
if(icoef*t;
}
return sum;
}
void xiang()
{ int m,n,a,x;
char flag;
Linklist pa=0,pb=0,pc;
printf(" 欢迎使用多项式操作程序\n\n");
printf("请输入a的项数:");
scanf("%d",&m);
pa=CreateLinklist(pa,m);//建立多项式a
printf("请输入b的项数:");
scanf("%d",&n);
pb=CreateLinklist(pb,n);//建立多项式
//输出菜单
printf(" \n");
}
int main(){
int choice;
menu();
printf(" please make your choice:");
scanf("%d",&choice);
while(choice!=3)
{
switch(choice){
case 1:system("cls");xiang();getch();break;
case 2:system("cls");shu();getch();getch();break;
default:printf(" please chooose the right choice!");getch();getch();break;
}
system("cls");
menu();
printf(" please make your choice:");
scanf("%d",&choice);
}
printf(" 谢谢使用该程序!\n");
}