链表应用:多项式的加减法

输入两个多项式输出这两个多项式的和或者差

#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);
	}
} 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值