第二次数据结构试验
老师给出的程序比较齐全,直接进行稍微修改就可以实现相乘了,仅仅是个双循环而已,其他地方基本没有难点了,主要是链表的操作,自己做的比较粗糙,不过暂时功能考虑的还算可以.....
今天早上一点多完善的,但是想提交的时候,电脑没电自动关机了......然后到现在提交了.......
/* 根据给出的一元多项式的加法写出一元多项式的乘法运算,要求用链表实现, 如果某一项的系数为零,提示重新输入,最终结果以横式输出.... */ #include "stdio.h" #include "stdlib.h" #include "math.h" #define null 0//表示为空 typedef struct//定义结构体表达每一项的数据 { float coef;//系数 int expn;//指数 }term; typedef struct Lnode//定义链表 { term data; Lnode *next; }*Link,*Linklist; int cmp(term a,term b)//自定义比较函数 { if (a.expn==b.expn)//指数相同的才算相同 { return 0; } else { return (a.expn-b.expn)/abs(a.expn-b.expn); //返回大小顺序,因为可能有负值,所以这样操作 } } void Orderinsert(Linklist &L,term e,int (*comp)(term,term))//顺序插入 { Link o,p,q; q=L; p=q->next; while (p&&comp(p->data,e)<0)//循环查找位置 { q=p;p=p->next; } o=(Link)malloc(sizeof(Lnode)); o->data=e;//赋值 q->next=o;o->next=p;//生成连接链表 } int LocateElem(Linklist L,term e,Link &s,Link &q,int (*comp)(term,term)) //查找链表中是否有某一项 { Link p;s=L; p=s->next; while (p&&comp(p->data,e)!=0)//循环查找 { s=p;p=p->next; } if(!p)//未查找到,证明这一项不存在 { s=q=null; return 0; } else //查找到 { q=p; return 1; } } void Delnext(Linklist &L,Link s)//删除 { Link q=s->next; s->next=q->next; free(q);//释放空间 } void Orderinsertmerge(Linklist &L,term e,int (*compara)(term,term)) //顺序插入合并函数 { Link q,s; if(LocateElem(L,e,s,q,compara))//当前指数的项已经在链表中存在 { q->data.coef+=e.coef;//计算徐虎 if (!q->data.coef)//系数为零 { Delnext(L,s);//删除这一项 } } else//否则 { Orderinsert(L,e,compara);//顺序插入到相应的位置 } } void Creatpolyn (Linklist &p,int m)//创建链表 { term e;int i; p=(Link)malloc(sizeof(Lnode));//创建头结点 p->next=null;//只有一个头结点 //printf("\n请输入%d个系数和指数用空格符间隔:\n",m); for(int i=0;i<m;) { printf("\n请输入第%d项的系数和指数,以换行为结束:\n",i+1); scanf("%f%d",&e.coef,&e.expn); if(e.coef==0) { printf("输入错误,请重新输入该项数据!\n"); } else { Orderinsertmerge(p,e,cmp);//顺序插入合并 ++i; } } } void add(Linklist La,Linklist Lb,Linklist &Lc) //链表相加 { Lc=(Link)malloc(sizeof(Lnode));//给链表Lc 一个头结点 Lc->next=null;//只有一个头结点 term tp; for(Link q=La->next;q;q=q->next)//顺序插入 a 表的每一个元素 { tp=q->data; Orderinsertmerge(Lc,tp,cmp); } for(Link q=Lb->next;q;q=q->next)//顺序插入 b 表的每一个元素 { tp=q->data; Orderinsertmerge(Lc,tp,cmp); } } void mul(Linklist La,Linklist Lb,Linklist &Lc) //链表相乘 { Link qa,qb,qc; Lc=(Link)malloc(sizeof(Lnode));//给链表Lc 一个头结点 Lc->next=null;//只有一个头结点 qa=La->next;qb=Lb->next; for(qa=La->next;qa;qa=qa->next)//双循环遍历二项式相乘的所有的情况 { term a=qa->data; for(qb=Lb->next;qb;qb=qb->next) { term b=qb->data;//分别取出两项 term tp={a.coef*b.coef,a.expn+b.expn};//求出当前项的资料 Orderinsertmerge(Lc,tp,cmp);//顺序插入合并 } } } void printpolyn(Linklist p)//横式输出,需要考虑的多了点 { int kase=0;//标记链表是否为空 //printf("\t系数\t指数\n"); for(Link q=p->next;q;q=q->next) { term tp=q->data; if(kase&&tp.coef>0)//不是第一项,而且系数为正,输出 + { printf("+"); } //控制输出系数 if(tp.coef==-1)//系数为-1 { printf("-");//肯定输出一个负号 if(tp.expn==0)//指数为零的话 { printf("1"); } } else if(tp.coef==1&&tp.expn==0)//系数为1 指数为0 { printf("1"); } else if(tp.coef!=1)//其他系数只要不等于1,就正常输出系数 { printf("%g",tp.coef); } if(tp.expn!=0)//指数为零的不输出 X { printf("X"); if(tp.expn!=1)//指数不等于1 正常输出 { printf("^%d",tp.expn); } } kase=1; } printf("\n\n"); if(!kase) { printf("0(该多项式为零)\n"); } } void slove(Linklist L1,Linklist L2,Linklist L3,Linklist L4)//实现功能 { printf("请选择需要实现的功能:\n\t1:多项式相加\n\t2:多项式相乘\n\t3:退出功能选择\n"); int chose; scanf("%d",&chose); if(chose==1) { add(L1,L2,L3); printf("\n相加以后的一元多项式为(变量用X代替):\n"); printpolyn(L3); slove(L1,L2,L3,L4); } else if(chose==2) { mul(L1,L2,L4); printf("\n相乘以后的一元多项式为(变量用X代替):\n"); printpolyn(L4); slove(L1,L2,L3,L4); } else if(chose==3) { return; } else { printf("输入错误,请重新操作!\n"); slove(L1,L2,L3,L4); } } int main() { int x,kase=1; //freopen("shuju.txt","r",stdin); while(kase==1) { Linklist L1,L2,L3,L4; printf("\n\t\t\t欢迎使用本程序进行一元多项式的运算\t\t\t\n"); //printf("请选择:\n \t1:进行一元多项式的运算\n\tq"); printf("\t请输入第一个一元多项式的项数:\n"); scanf("%d",&x); Creatpolyn(L1,x); printf("\t第一个一元多项式为:\n"); printpolyn(L1); printf("\t请输入第二个一元多项式的项数:\n"); scanf("%d",&x); Creatpolyn(L2,x); printf("\t第二个一元多项式为:\n"); printpolyn(L2); slove(L1,L2,L3,L4); printf("请选择操作:\n\t1:多项式运算\n\t其他:退出程序!\n"); scanf("%d",&kase); if(kase==1) { system("cls"); } } printf("\t谢谢使用!\n"); return 0; }