要求:以文件形式输入需要进行运算的两个一元多项式,并将结果以文件的形式进行输出。
#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;
}
运行结果如下: