要求:以文件形式输入需要进行运算的两个一元多项式,并将结果以文件的形式进行输出。
#include<stdio.h>
#include<stdlib.h>
#include<math.h>//链表的构成
typedef struct Node{float ratio;int index;struct Node* next;
}*PNode,*LinkList;//函数声明
void FILE_W();
LinkList Create_Link();
void Sort_Link(LinkList head);
void SUB_List(LinkList llist1,LinkList llist2);
void Add_List(LinkList llist1,LinkList llist2);
void print_2(LinkList head);
1.文件的写入
void FILE_W()
{ float ratio;int index;char M[10];printf("请输入文件名:");scanf("%s",&M); FILE* fp; //文件的写入fp=fopen(M,"w");printf("请输入一元多项式:");scanf("%f%d",&ratio,&index);while(ratio!=0||index!=0){fprintf(fp,"%.2f %d ",ratio,index);scanf("%f%d",&ratio,&index);}fprintf(fp,"%.2f %d ",ratio,index);fclose(fp);
}
2.链表结点的创立
LinkList Create_Link()
{LinkList head;PNode p,q;float ratio;int index;head=(struct Node*)malloc(sizeof(struct Node));head->next=NULL;q=head; FILE*fp;char M[10];printf("请输入要相 加/减 的一元多项式的文件名:");scanf("%s",&M);fp=fopen(M,"r");fscanf(fp,"%f%d",&ratio,&index);while(ratio!=0||index!=0){p = (struct Node*)malloc(sizeof(struct Node));p->next=NULL;q->next=p;q=p;p->index=index;p->ratio=ratio;fscanf(fp,"%f%d",&ratio,&index); }fclose(fp);return head;
}
3.将一元多项式进行降幂或升幂的排序
void Sort_Link(LinkList head) //降幂或升幂排序
{PNode p,q;float temp1;int temp2;for(p=head->next;p!=NULL;p=p->next){for(q=p->next;q!=NULL;q=q->next){if(q->index>p->index){ //p->index<q->index为升幂排序 temp1=q->ratio;q->ratio=p->ratio;p->ratio=temp1;temp2=q->index;q->index=p->index;p->index=temp2;}}}
}
4.加法运算
void Add_List(LinkList llist1,LinkList llist2)
{PNode p,q,pre,temp;p=llist1->next;q=llist2->next;pre=llist1; //保留移动的前一个节点 while(p&&q){if(q->index>p->index){ //进行节点的插入 temp=q->next;q->next=p;pre->next=q;pre=q;q=temp;}else if(q->index<p->index){ //节点的移动 pre=p;p=p->next;}else {if(q->ratio+p->ratio==0){pre->next=p->next; //删除节点 free(p);}else{p->ratio=p->ratio+q->ratio; pre=p;}p=pre->next;temp=q;q=q->next;free(temp);}}if(q){ //第一个链表结束但第二个链表还未结束 pre->next=q;}free(llist2);
}
5.减法运算
void SUB_List(LinkList llist1,LinkList llist2)
{PNode p,q,pre,temp;p=llist1->next;q=llist2->next;pre=llist1; //保留移动的前一个节点 while(p&&q){if(q->index>p->index){ //进行节点的插入 if(q->ratio<0){q->ratio=fabs(q->ratio);}else{q->ratio=-q->ratio;} temp=q->next; //第二个多项式的值第一个的下一个 q->next=p; //将第一个多项式的第一个值的地址赋给q->next pre->next=q; //插入的操作 pre=q; //覆盖操作 q=temp;}else if(q->index<p->index){ //节点的移动 pre=p;p=p->next;}else {if(q->ratio-p->ratio==0){pre->next=p->next; //删除节点 free(p);}else{p->ratio=p->ratio-q->ratio; pre=p;}p=pre->next;temp=q;q=q->next;free(temp);}} if(q){do{ //第一个链表结束但第二个链表还未结束 if(q->ratio<0){q->ratio=fabs(q->ratio);pre->next=q;}else{q->ratio=-q->ratio;pre->next=q;}q=q->next;pre=pre->next; //注意要记得移动pre->next }while(q);} if(p){ //第二个链表结束但第一个链表还未结束 do{pre=p;p=p->next; }while(p); } free(llist2);
}
6.输出函数
void print_2(LinkList head)
{PNode p;FILE* fp;fp=fopen("4.txt","w");printf("\nc=");fprintf(fp,"c=");for(p=head->next;p!=NULL;p=p->next){if(p->next==NULL){if(p->ratio<0){if(p->index==0){printf("%.2f",p->ratio);fprintf(fp,"%.2fx^%d ",p->ratio,p->index);}else{if(p->index==1){printf("%.2fx",p->ratio);fprintf(fp,"%.2fx^%d ",p->ratio,p->index);}else{printf("%.2fx^%d",p->ratio,p->index);fprintf(fp,"%.2fx^%d ",p->ratio,p->index);}}}else{if(p->index==0){printf("+%.2f",p->ratio);fprintf(fp,"+%.2fx^%d ",p->ratio,p->index);}else{ if(p->index==1){printf("+%.2fx",p->ratio);fprintf(fp,"+%.2fx^%d ",p->ratio,p->index);}else{printf("+%.2fx^%d",p->ratio,p->index); fprintf(fp,"+%.2fx^%d ",p->ratio,p->index);}}}}else{if(p->ratio<0){if(p->index==0){printf("%.2f",p->ratio);fprintf(fp,"%.2fx^%d ",p->ratio,p->index);}else{if(p->index==1){printf("%.2fx",p->ratio);fprintf(fp,"%.2fx^%d ",p->ratio,p->index);}else{printf("%.2fx^%d",p->ratio,p->index);fprintf(fp,"%.2fx^%d ",p->ratio,p->index);}}}else{if(p==head->next){if(p->index==0){printf("%.2f",p->ratio);fprintf(fp,"%.2fx^%d ",p->ratio,p->index);}else{if(p->index==1){printf("%.2fx",p->ratio);fprintf(fp,"%.2fx^%d ",p->ratio,p->index);}else{printf("%.2fx^%d",p->ratio,p->index);fprintf(fp,"%.2fx^%d ",p->ratio,p->index);}}}else{if(p->index==0){printf("+%.2f",p->ratio);fprintf(fp,"+%.2fx^%d ",p->ratio,p->index);}else{if(p->index==1){printf("+%.2fx",p->ratio);fprintf(fp,"+%.2fx^%d ",p->ratio,p->index);}else{printf("+%.2fx^%d",p->ratio,p->index);fprintf(fp,"+%.2fx^%d ",p->ratio,p->index);}}}}}}
}
7.主函数
int main()
{int m;printf("请选择你要进行的操作:1.输入一元多项式;2.进行加法运算;3.进行减法运算\n");scanf("%d",&m);switch(m){case 1: FILE_W();break; //写入数据 case 2:{LinkList llist1=Create_Link(); //将第一个文件的数据存入第一个链表 LinkList llist2=Create_Link(); //将第二个文件的数据存入第二个链表 Sort_Link(llist1); //将第一个链表进行降幂/升幂排序 Sort_Link(llist2); //将第二个链表进行降幂/升幂排序 Add_List(llist1,llist2); //将两个节点进行相加 print_2(llist1); //输入结果 }; break;case 3: {LinkList llist1=Create_Link();LinkList llist2=Create_Link();Sort_Link(llist1); Sort_Link(llist2); SUB_List(llist1,llist2); print_2(llist1); }; break;default:printf("输入错误!");break; }return 0;
}
运行结果如下: