单链表实现稀疏多项式运算
#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';
}
}
}
}