输入两个多项式输出这两个多项式的和或者差
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
struct DuoXiangShi{
int XiShu;
int Mi;
int length;
struct DuoXiangShi * next;
};
struct DuoXiangShi * create(){ //创建多项式对应的链表
char a[1000];
int b[100],c[100],s=0;
printf("请输入一个一元多项式\n");
struct DuoXiangShi *head , *p1 , *p2;
scanf("%s",a); //输入多项式
getchar(); //取消回车键的影响
int i=0;
head = p1 = p2 = (struct DuoXiangShi *)malloc(sizeof(struct DuoXiangShi));
for(int i=0;a[i]!='\0';i++){ //解析多项式的系数和幂
if(a[i]>='0'&&a[i]<='9'){ //对第一项的系数为正的结果进行处理
int inde = 0;
while(a[i]>='0'&&a[i]<='9'){
inde = inde*10 + (a[i]-'0');
i++;
}
b[s] = inde;
}
if(a[i]=='+'){ //对从第二项开始系数为正的项进行处理
i++;
if(a[i]>='0'&&a[i]<='9'){
int inde = 0;
while(a[i]>='0'&&a[i]<='9'){
inde = inde*10 + (a[i]-'0');
i++;
}
b[s] = inde;
}
}
if(a[i]=='-'){ //对所有系数为负的项进行处理
i++;
if(a[i]>='0'&&a[i]<='9'){
int inde = 0;
while(a[i]>='0'&&a[i]<='9'){
inde = inde*10 + (a[i]-'0');
i++;
}
b[s] =0-inde;
}
}
if(a[i]=='x'){ //对x为的系数为一和x的幂为一的情况进行处理
if(i==0||!(a[i-1]>='0'&&a[i-1]<='9')){
if(a[i-1]=='-'){
b[s] = -1;
}else{
b[s] = 1;
}
}
if(a[i+1]!='^'){ //对x为的幂为一的情况进行处理
c[s]=1;
s++;
}
}
if(a[i]=='^'){ //对幂进行处理
i++;
int inde = 0;
while(a[i]>='0'&&a[i]<='9'){
inde = inde*10 + (a[i]-'0');
i++;
}
c[s]=inde;
s++;
i--;
}
}
for(int i=0;i<s;i++){ //复制到链表中
p2 = p1;
p1->XiShu = b[i];
p1->Mi = c[i];
p1->length = s;
printf("@@@@@@@@@@@@@@@%d %d\n",p1->XiShu,p1->Mi);
p1 = (struct DuoXiangShi *)malloc(sizeof(struct DuoXiangShi));
p2->next = p1;
}
p2->next = NULL;
return head;
}
void print(struct DuoXiangShi * head){ //打印多项式
if(head->XiShu == 0){
head = head->next;
}
printf("%dx^%d",head->XiShu,head->Mi);
head = head->next;
while(head){
if(head->XiShu == 0){
head = head->next;
}
printf("+(%dx^%d)",head->XiShu,head->Mi);
head = head->next;
}
printf("\n");
}
struct DuoXiangShi * DataSort(struct DuoXiangShi * head){ //多项式的各项按幂排序
struct DuoXiangShi *p1,*p2,*p3;
p3=p2=p1=head;
p1=p1->next;
for(int i=0;i<head->length;i++)
{
while(p2->next!=NULL)
{
if((p2->Mi)>(p1->Mi)){
if(p2==head){
head=p1;
p2->next=p1->next;
p1->next=p2;
}else if(p1->next==NULL){
p3->next=p1;
p1->next=p2;
p2->next=NULL;
}else{
p2->next=p1->next;
p1->next=p3->next;
p3->next=p1;
}
}
p3=p2;
p2=p1;
p1=p1->next;
}
p3=p2=p1=head;
p1=p1->next;
}
return (head);
}
struct DuoXiangShi * combineListAdd(struct DuoXiangShi *head1,struct DuoXiangShi *head2){ //链表合并的应用
struct DuoXiangShi * head3,* head4;
head4=head3=head1->Mi<=head2->Mi?head1:head2;
if(head1->Mi<head2->Mi){
head1=head1->next;
}else if(head1->Mi>head2->Mi){
head2=head2->next;
}else{
head1->XiShu = head1->XiShu+head2->XiShu;
head1 = head1->next;
head2 = head2->next;
}
while(head1&&head2){
if(head1->Mi<head2->Mi){
head3->next = head1;
head3 = head3->next;
head1 = head1->next;
}else if(head1->Mi>head2->Mi){
head3->next = head2;
head3 = head3->next;
head2 = head2->next;
}else if(head1->Mi==head2->Mi){
if(head3->next==head1){
head1->XiShu = head1->XiShu+head2->XiShu;
head3 = head3->next;
head1 = head1->next;
head2 = head2->next;
}else{
head2->XiShu = head1->XiShu+head2->XiShu;
head3 = head3->next;
head1 = head1->next;
head2 = head2->next;
}
}
printf("%d\t",head3->Mi);
}
head3->next = head3->next==head1?head2:head1;
printf("%d\n",head3->Mi);
return head4;
}
struct DuoXiangShi * combineListMinus(struct DuoXiangShi *head1,struct DuoXiangShi *head2){//链表合并的应用
struct DuoXiangShi * head3,* head4;
head4=head3=head1->Mi<=head2->Mi?head1:head2;
if(head1->Mi<head2->Mi){
head1=head1->next;
}else if(head1->Mi>head2->Mi){
head2=head2->next;
}else{
head1->XiShu = head1->XiShu-head2->XiShu;
head1 = head1->next;
head2 = head2->next;
}
while(head1&&head2){
if(head1->Mi<head2->Mi){
head3->next = head1;
head3 = head3->next;
head1 = head1->next;
}else if(head1->Mi>head2->Mi){
head3->next = head2;
head3 = head3->next;
head2 = head2->next;
}else if(head1->Mi==head2->Mi){
if(head3->next==head1){
head1->XiShu = head1->XiShu-head2->XiShu;
head3 = head3->next;
head1 = head1->next;
head2 = head2->next;
}else{
head2->XiShu = head1->XiShu-head2->XiShu;
head3 = head3->next;
head1 = head1->next;
head2 = head2->next;
}
}
printf("%d\t",head3->Mi);
}
head3->next = head3->next==head1?head2:head1;
printf("%d\n",head3->Mi);
return head4;
}
struct DuoXiangShi * Add(struct DuoXiangShi *a1,struct DuoXiangShi *a2){
a1 = DataSort(a1);
a2 = DataSort(a2);
return combineListAdd(a1,a2);
}
struct DuoXiangShi * Minus(struct DuoXiangShi *a1,struct DuoXiangShi *a2){
a1 = DataSort(a1);
a2 = DataSort(a2);
return combineListMinus(a1,a2);
}
int main(){
int a = 0;
printf("============================================\n\n\n");
printf("\t\t一元多项式\n");
printf(" 0、退出\n");
printf(" 1、输出并建立多项式\n");
printf(" 2、输出多项式\n");
printf(" 3、两个多项式相加运算并输出\n");
printf(" 4、两个多项式相减运算并输出\n");
printf("============================================\n");
scanf("%d",&a);
struct DuoXiangShi * list1 , * list2,*list;
while(a){
switch(a){
case 1:{
list1 = create();
print(list1);
list2 = create();
print(list2);
break;
}
case 2:{
print(list1);
print(list2);
break;
}
case 3:{
list = Add(list1,list2);
print(list);
break;
}
case 4:{
list = Minus(list1,list2);
print(list);
break;
}
}
printf("============================================\n\n\n");
printf("\t\t一元多项式\n");
printf(" 0、退出\n");
printf(" 1、输出并建立多项式\n");
printf(" 2、输出多项式\n");
printf(" 3、两个多项式相加运算并输出\n");
printf(" 4、两个多项式相减运算并输出\n");
printf("============================================\n");
scanf("%d",&a);
}
}