数据结构(C语言)-案例分析2(单链表实现稀疏多项式运算)

这篇博客介绍了如何使用链表数据结构来实现稀疏多项式的加法、减法、乘法运算。首先定义了链表节点结构,然后通过`InitList`、`CreateList`函数创建稀疏多项式,接着实现`Addition`、`Subtraction`、`Division`(实际是乘法)函数进行运算,并打印结果。整个程序提供了用户交互界面,允许用户选择不同的运算操作。
摘要由CSDN通过智能技术生成

单链表实现稀疏多项式运算

//稀疏多项式基本运算 
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct PN{
	float coef;
	int expn;
	struct PN *next;
}LinkList; 
LinkList *InitList(){
	LinkList *Head;
	LinkList *head;
	head=(LinkList*)malloc(sizeof(LinkList));
	head->next=NULL;
	Head=(LinkList*)malloc(sizeof(LinkList));
	Head->next=NULL;
	return head,Head;
}

void CreateList(LinkList *head,int n,LinkList*Head,int x){
	LinkList *s,*last;
	int i;
	last=head;
	printf("输入稀疏多项式A的系数与指数:"); 
	for(i=0;i<n;i++){
		s=(LinkList*)malloc(sizeof(LinkList));
		scanf("%f%d",&s->coef,&s->expn);
		s->next=NULL;
		last->next=s;
		last=s;
	}
	s=head->next;
	if(s!=NULL){
		printf("稀疏多项式A创建成功!!\n");
		printf("稀疏多项式A的系数与指数如下:"); 
		while(s!=NULL){
			printf("%5f,%5d \t",s->coef,s->expn);
			s=s->next;
		}
	}else{
		printf("创建失败!!");
	}
	last=Head;
	printf("\n输入稀疏多项式B的系数与指数:"); 
	for(i=0;i<x;i++){
		s=(LinkList*)malloc(sizeof(LinkList));
		scanf("%f%d",&s->coef,&s->expn);
		s->next=NULL;
	    last->next=s;
		last=s;
	}
	s=Head->next;
	if(s!=NULL){
		printf("稀疏多项式B创建成功!!");
		printf("\n稀疏多项式B的系数与指数如下:"); 
		while(s!=NULL){
			printf("%5f,%5d \t",s->coef,s->expn);
			s=s->next;
		}
	}else{
		printf("创建失败!!");
	}
}
void Addition(LinkList *head,LinkList *Head){
	LinkList *s,*y,*p;
	int j,i;
	s=head->next;
	y=Head->next;
	j=i=0;
	while(s!=NULL){
		s=s->next;
		j++;
	}
	while(y!=NULL){
		y=y->next;
		i++;
	}
	s=head->next;
	y=Head->next;
	if(j>i){
		p=head;
		while(s!=NULL&&y!=NULL){
			if(s->expn>y->expn){
				p->next=y;p=y;
				p->coef=s->coef+y->coef;
				y=y->next;
				s=s->next;
			}
			else{
				p->next=s;p=s;
				p->coef=s->coef+y->coef;
				s=s->next;
				y=y->next;
			}
		}
		p->next=s;
		delete y;
		p=head->next;
		printf("A+B:");
	    while(p!=NULL){
			printf("%5f,%5d \t",p->coef,p->expn);
			p=p->next;
	    }
	}else if(j<i){
		p=Head;
		while(s!=NULL&&y!=NULL){
			if(s->expn>y->expn){
				p->next=y;p=y;
				p->coef=s->coef+y->coef;
				y=y->next;
				s=s->next;
			}
			 else{
				p->next=s;p=s;
				p->coef=s->coef+y->coef;
				s=s->next;
				y=y->next;
			}
	    }
	    p->next=y;
		p=Head->next;
		printf("A+B:");
	    while(p!=NULL){
			printf("%5f,%5d \t",p->coef,p->expn);
	 		p=p->next;
	      }
	    delete s;
	  }else{
		 p=head;
		  while(s!=NULL&&y!=NULL){
			if(s->expn>y->expn){
				p->next=y;p=y;
				p->coef=s->coef+y->coef;
				y=y->next;
				s=s->next;
			}
			 else{
				p->next=s;p=s;
				p->coef=s->coef+y->coef;
				s=s->next;
				y=y->next;
			}
	   }
	 p=head->next;
	 printf("A+B:");
	  while(p!=NULL){
			printf("%5f,%5d \t",p->coef,p->expn);
			p=p->next;
	  }
	}
}
void Division(LinkList *head,LinkList *Head){
	LinkList *s,*y,*p;
	int j,i;
	s=head->next;
	y=Head->next;
	j=i=0;
	while(s!=NULL){
		s=s->next;
		j++;
	}
	while(y!=NULL){
		y=y->next;
		i++;
	}
	s=head->next;
	y=Head->next;
	if(j>i){
		p=head;
		while(s!=NULL&&y!=NULL){
			if(s->expn>y->expn){
				p->next=y;p=y;
				p->coef=s->coef*y->coef;
				y=y->next;
				s=s->next;
			}
			else{
				p->next=s;p=s;
				p->coef=s->coef*y->coef;
				s=s->next;
				y=y->next;
			}
		}
		p->next=s;
		delete y;
		p=head->next;
		printf("A*B:");
	    while(p!=NULL){
			printf("%5f,%5d \t",p->coef,p->expn);
			p=p->next;
	    }
	}else if(j<i){
		p=Head;
		while(s!=NULL&&y!=NULL){
			if(s->expn>y->expn){
				p->next=y;p=y;
				p->coef=s->coef*y->coef;
				y=y->next;
				s=s->next;
			}
			 else{
				p->next=s;p=s;
				p->coef=s->coef*y->coef;
				s=s->next;
				y=y->next;
			}
	    }
	    p->next=y;
		p=Head->next;
		printf("A*B:");
	    while(p!=NULL){
			printf("%5f,%5d \t",p->coef,p->expn);
	 		p=p->next;
	      }
	    delete s;
	  }else{
		 p=head;
		  while(s!=NULL&&y!=NULL){
			if(s->expn>y->expn){
				p->next=y;p=y;
				p->coef=s->coef*y->coef;
				y=y->next;
				s=s->next;
			}
			 else{
				p->next=s;p=s;
				p->coef=s->coef*y->coef;
				s=s->next;
				y=y->next;
			}
	   }
	 p=head->next;
	 printf("A*B:");
	  while(p!=NULL){
			printf("%5f,%5d \t",p->coef,p->expn);
			p=p->next;
	  }
	}
}
void Subtraction(LinkList *head,LinkList *Head){
	LinkList *s,*y,*p;
	int j,i;
	s=head->next;
	y=Head->next;
	j=i=0;
	while(s!=NULL){
		s=s->next;
		j++;
	}
	while(y!=NULL){
		y=y->next;
		i++;
	}
	s=head->next;
	y=Head->next;
	if(j>i){
		p=head;
		while(s!=NULL&&y!=NULL){
			if(s->expn>y->expn){
				p->next=y;p=y;
				p->coef=s->coef-y->coef;
				y=y->next;
				s=s->next;
			}
			else{
				p->next=s;p=s;
				p->coef=s->coef-y->coef;
				s=s->next;
				y=y->next;
			}
		}
		p->next=s;
		delete y;
		p=head->next;
		printf("A-B:");
	    while(p!=NULL){
			printf("%5f,%5d \t",p->coef,p->expn);
			p=p->next;
	    }
	}else if(j<i){
		p=Head;
		while(s!=NULL&&y!=NULL){
			if(s->expn>y->expn){
				p->next=y;p=y;
				p->coef=s->coef-y->coef;
				y=y->next;
				s=s->next;
			}
			 else{
				p->next=s;p=s;
				p->coef=s->coef-y->coef;
				s=s->next;
				y=y->next;
			}
	    }
	    p->next=y;
		p=Head->next;
		printf("A-B:");
	    while(p!=NULL){
			printf("%5f,%5d \t",p->coef,p->expn);
	 		p=p->next;
	      }
	    delete s;
	  }else{
		 p=head;
		  while(s!=NULL&&y!=NULL){
			if(s->expn>y->expn){
				p->next=y;p=y;
				p->coef=s->coef-y->coef;
				y=y->next;
				s=s->next;
			}
			 else{
				p->next=s;p=s;
				p->coef=s->coef-y->coef;
				s=s->next;
				y=y->next;
			}
	   }
	 p=head->next;
	 printf("A-B:");
	  while(p!=NULL){
			printf("%5f,%5d \t",p->coef,p->expn);
			p=p->next;
	  }
	}
}
void Menu(){
	printf("\n          稀疏多项式计算");
	printf("\n--------------------------------------");
	printf("\n              1--创建稀疏多项式       ");
	printf("\n              2--加法计算             ");
	printf("\n              3--乘法计算             ");
	printf("\n              4--减法计算             ");
	printf("\n              0--退出                 ");
	printf("\n--------------------------------------");
	printf("\n请输入菜单号(0-4):"); 
}
int main(){
	LinkList *head;
	LinkList *Head;
	int n,x;
	char ch1,ch2,a;
	ch1='y';
		while(ch1=='y'||ch1=='Y'){
		Menu();
		scanf("%c",&ch2);
		getchar();
		switch(ch2){
			case '1':
				head=InitList();
				Head=InitList();
				printf("请输入稀疏多项式A的项的个数:");
				scanf("%d",&n);
			    printf("请输入稀疏多项式B的项的个数:");
			    scanf("%d",&x);
				CreateList(head,n,Head,x);
				break;
			case '2':
				 Addition(head,Head);
				 break;
			case '3':
				Division(head,Head);
				break;
			case '4':
				Subtraction(head,Head);
				break;
			case '0':
			    ch1='n';
				break;
			default:
			    printf("输入有误!!!!");  
			}
			if(ch2!='0'){
			printf("\n按回车键继续,按任意键返回主菜单!\n");
			a=getchar();
			if(a!='\xA'){
				getchar();
				ch1='n';
			}
		}	
			
	}
}

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值