刚开始上数据结构的课,第一次做的实验 多项式的存储 及加法和乘法 还是第一次写的这么长的代码,汗....以后要多动手。 /* 数据结构试验 用链表表示多项式的加法和乘法 by徐 */ #include <iostream> using namespace std; #define LEN sizeof(struct link) struct link { float coeff;//coefficient 系数 int index;//index指数 link *next; }; int getlength(link head) { int i=0; link *p=&head; while(p->next) { i++; p=p->next; } return i; } int cmp(int a,int b) { if(a>b) return 1; else if(a==b)return 0; else if(a<b)return -1; return 2;//计算机认为不是所有路径都有返回值所以加上了,实际上不可能发生 } void linkrank(link &head) { link x; for(int i=0;i<getlength(head);i++) { link *p=(&head)->next; link *q=p->next; while(q) { if(p->index>q->index) { x.index=p->index; x.coeff=p->coeff; p->index=q->index; p->coeff=q->coeff; q->index=x.index; q->coeff=x.coeff; }//if p=p->next; q=q->next; }//while }//for } int getelemtNO(link *head,int index) { int i=0; link *p=head; while(p) { if(index==p->index) return i; else p=p->next; i++; }//while return -1; }//getelemtNO void printlink(link *head) { printf("/n执行打印多项式:"); link *p=head->next; while(p) { printf("%8.2f%s%d",p->coeff,"Xe",p->index); p=p->next; if(p)printf(" +"); }//while printf("/n"); } struct link *create(void) { link *head=(link*)malloc(LEN); struct link *pf,*pb; int i=0; while(1) { i++; pb=(link*) malloc(LEN); pb->next=NULL; printf("%s%d%s","请输入第",i,"项系数和指数 /n"); scanf("%f%d",&pb->coeff,&pb->index); if(pb->coeff==0||pb->index==0) { linkrank(*head); printlink(head); return(head); } if(i==1) { head->next=pb;pf=pb; printf("%s%d%s%8.2f%s%d","第",i,"个节点已建立,存储项为",pb->coeff,"X e",pb->index);printf("/n----------------------/n"); } else { pf->next=pb; pf=pb; printf("%s%d%s%8.2f%s%d","第",i,"个节点已建立,存储项为",pb->coeff,"X e",pb->index);printf("/n----------------------/n"); } } //while } void insert(struct link &head,struct link x,int i) { int j=0; link *pf; pf=&head; while(pf&&j<i-1) { j++; pf=pf->next; } if(!pf||j>i-1) printf("插入节点错误ERROR"); else { printf("进行了了插入节点操作"); link *s=(link*)malloc(LEN); s->coeff=x.coeff; s->index=x.index; s->next=pf->next; pf->next=s; } } void linkadd(link &pa,link pb) { printf("/n-----------进入linkadd执行加法运算----------/n"); link *ha=&pa;link *hb=&pb, *la;//la用来存储pa的最后一个节点 ha=ha->next; hb=hb->next; int a=ha->index; int b=hb->index; while(ha&&hb) { switch(cmp(a,b)) { case -1: printf("进入case-1 a<b/n"); la=ha; ha=ha->next; if(ha)a=ha->index; break; case 0: printf("进入case 0 a=b/n"); ha->coeff=ha->coeff+hb->coeff; hb=hb->next; if(hb)b=hb->index; break; case 1: printf("进入case 1 a>b/n"); link x; x.coeff=hb->coeff; x.index=hb->index; int i=getelemtNO(&pa,a); printf("%d%s%d",a,"获取位置为",i); insert(pa,x,i); hb=hb->next; if(hb)b=hb->index; break; }//switch }//while if(hb) { /* 如何把hb代表的值赋给ha代表的next域?直接用ha时因为ha已经变为ha->next, 此时ha指针为空,无法将hb赋给pa结尾的节点的next域;故引进la存储最后一个节点。 开始使用的代码为: if(hb) { ha=hb; } */ printf("/n第二个多项式有余项:"); link *printhb=(link*)malloc(LEN); printhb->next=hb; printlink(printhb); la->next=hb; printf("/n把Pb末尾接在Pa末尾"); }//if printf("/n-----------离开linkadd加法运算完成----------/n"); printf("/n--------输出加法运算结果--------/n"); printlink(&pa); printf("/n--------输出加法运算完成--------/n"); }//linkadd link *createcopy(link *pa) { int n=getlength(*pa); pa=pa->next; link *head=(link*)malloc(LEN); struct link *pf,*pb; for(int i=1;i<=n;i++) { pb=(link*) malloc(LEN); pb->next=NULL; pb->coeff=pa->coeff; pb->index=pa->index; pa=pa->next; if(i==1) { head->next=pb;pf=pb; printf("%s%d%s%8.2f%s%d","第",i,"个节点已建立,存储项为",pb->coeff,"X e",pb->index);printf("/n----------------------/n"); } else { pf->next=pb; pf=pb; printf("%s%d%s%8.2f%s%d","第",i,"个节点已建立,存储项为",pb->coeff,"X e",pb->index);printf("/n----------------------/n"); } } //for printf("/n--------建立多项式副本完成--------/n"); printlink(head); printf("/n--------多项式副本输出完成--------/n"); return(head); } void muiltply(link &pa,link data) { link x=data; link *p=pa.next; while(p) { p->coeff=p->coeff*x.coeff; p->index=p->index+x.index; p=p->next; }//while } void muiltplys(link &pa,link *pb) { printf("/n--------进入乘法函数--------/n"); link* pf=pa.next; link* ph=pb->next; link* data=createcopy(&pa);// int i=0; while(ph) { i++; printf("%s%d%s","/n----------第",i,"项相乘-------------/n"); link s; s.coeff=ph->coeff; s.index=ph->index; link* x=createcopy(data); if(i==1) { muiltply(pa,s); printf("/n--------pa与第一项相乘后的结果--------/n"); printlink(&pa); } else if(i>1) { muiltply(*x,s); printf("/n--------pa与第2项相乘后的结果--------/n"); printlink(x); linkadd(pa,*x); printf("/n--------pa相乘后的结果--------/n"); printlink(&pa); }//else if ph=ph->next; }//while printf("/n--------完成乘法运算--------/n"); printf("/n--------输出乘法运算结果--------/n"); printlink(&pa); printf("/n--------输出乘法运算完成--------/n"); }//muiltply void main() { loop: printf("/n--------数据结构实验--------/n计算机科学与技术0909班/n徐***/n学号01209****/n"); printf("/n--------建立第一个多项式--------/n"); int changesect=0; link *head1=create(); printf("/n--------建立第二个多项式--------/n"); link *head2=create(); link *head11=createcopy(head1); link *head22=createcopy(head2); muiltplys(*head1,head2); printlink(head11); printlink(head22); printlink(head1); //linkadd(*head1,*head2); goto loop; system("pause"); };