📄 text2 polyn.cpp
字号:
# include<malloc.h>
# include<stdio.h>
# define NULL 0
# define LEN sizeof(struct polyn)
struct polyn{ //创建(带头结点,头结点只有next的信息)
float coef;//系数
int expn;//指数
struct polyn *next;
};
int n;//计数器
struct polyn *creatpolyn (void){
struct polyn *head;//头结点
struct polyn *p1,*p2,*r;//r是辅助指针
n=0;
head=(struct polyn*)malloc(LEN);//为头结点开辟空间(不储存数据信息,只保留next的信息)
p1=p2=(struct polyn*)malloc(LEN);
scanf("%f%d",&p1->coef,&p1->expn);
while(p1->coef!=0)//当指数不为零
{
n=n+1;
if(n==1) r=p1;//r存放第一个数据的指针
else p2->next=p1;
p2=p1; p1=(struct polyn*)malloc(LEN);
scanf("%f%d",&p1->coef,&p1->expn);
}
p2->next=NULL; head->next=r;//此时head作为头指针
return(head);//返回头指针
}//creatpolyn
struct polyn *copy(struct polyn *head){ //复制,以下运算都不直接使用原来的链表,避免破坏原来的结构
struct polyn *p1,*p2,*c_head,*r,*q; int flat=0;//计数器
r=head->next;//指示指针
c_head=(struct polyn*)malloc(LEN);//复制后链表的头指针
p1=p2=(struct polyn*)malloc(LEN);
p1->coef=r->coef; p1->expn=r->expn;
r=r->next;
while(r){
flat=flat+1;
if(flat==1) q=p1;//保存第一个结点的位置信息
else p2->next=p1;
p2=p1; p1=(struct polyn*)malloc(LEN);
p1->coef=r->coef; p1->expn=r->expn; r=r->next;
}
p2->next=p1; p1->next=NULL; c_head->next=q;
return(c_head);//返回头指针
}//copy
void print(struct polyn *head){ //打印
struct polyn *p;
printf("\nthe result is:\n");
p=head->next;
if(head!=NULL) do{
printf("(%.2fX^%d)+",p->coef,p->expn);
p=p->next;
}while(p!=NULL);
else printf("input false\n");
}//print(打印)
int compare(int a,int b){//比较两结点的指数
if(a>b) return(1);
if(a<b) return(-1);
if(a==b) return(0);
}//compare
struct polyn *add(struct polyn *headA,struct polyn *headB){ //相加 与相减同理
struct polyn *pa,*pb,*pc,*r,*q,*heada,*headb;
heada=copy(headA); headb=copy(headB);
pc=heada; pa=heada->next; pb=headb->next;
while(pa&&pb){
switch(compare(pa->expn,pb->expn)){
case 1: pc->next=pa;pc=pa;pa=pa->next; break;
case -1: pc->next=pb;pc=pb;pb=pb->next; break;
case 0: if(pa->coef+pb->coef<0.001){//两系数相反,则删除两个结点
r=pa;pa=pa->next;free(r);
q=pb;pb=pb->next;free(q);
}//if
else{
pa->coef=pa->coef+pb->coef;
pc->next=pa; pc=pa; pa=pa->next; pb=pb->next;
}//else
break;
}//switch
}//while
if(pa==NULL) pc->next=pb;
else pc->next=pa;
return(heada);
}//add(相加)
main(){
struct polyn *headA,*headB,*head;
int a; char c;
printf("请按降幂输入两个多项式A和B,以两个零作为结束标志\n");
headA=creatpolyn();
print(headA);
printf("\n");
headB=creatpolyn();
print(headB);
printf("\n");
signal: printf("请选择你想要的操作:1相加\n");//操作菜单,signal为语句标号
scanf("%d",&a);
switch(a){
case 1: head=add(headA,headB);
printf("加法"); print(head);
fflush(stdin);
printf("\n继续操作请按y,退出请按n\n");
scanf("%c", &c);
if(c=='y') goto signal;
break;
}//switch
}//main
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -