⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 一元稀疏加减.c

📁 数据结构的全部课程实验
💻 C
字号:
//一元稀疏多项式计算器 
#include <stdio.h> 
#include <stdlib.h> 

#define OK 1; 
#define READ(I) while (((I)=getchar())=='\n'); //读入合法字符 
typedef int status; 
typedef struct PolyNode 
{ 
float coef; 
int expn; 
struct PolyNode *next; 
}Poly,*P_Poly; 


status CreatPoly(P_Poly*,int); //创建多项式链表 
void OutP_Poly(P_Poly); //输出多项式 
void AddPoly(P_Poly*,P_Poly,P_Poly); //求和 
void DecPoly(P_Poly*,P_Poly,P_Poly); //求差 
void DelPoly(P_Poly*); //删除并释放多项式 

status main() 
{ 
P_Poly PolyHead[26]={0}; 
char menu,name; 
for (;;) 
{ 

printf ("1.建立多项式\n"); 
printf ("2.输出多项式\n"); 
printf ("3.求两个多项式之和(必须先创建),建立和式并输出\n"); 
printf ("4.求两个多项式之差(必须先创建),建立差式并输出\n"); 
printf ("5.删除多项式\n"); 
printf ("6.退出\n"); 
printf ("请选择指令:"); 
READ(menu) 
switch (menu) 
{ 
case '1': 
{ 
int n; 
printf ("请输入要创建的多项式的名称(单个小写字母表示):"); 
READ(name) 
if (NULL!=PolyHead[name-'a']) 
{ 
printf ("此多项式已经存在!\n"); 
break; 
} 
printf ("请输入项数:"); 
scanf ("%d",&n); 
if(CreatPoly(&PolyHead[name-'a'],n)) printf ("多项式%c创建完毕!\n",name); 
break; 
} 
case '2': 
printf ("请输入要输出的多项式的名称:"); 
READ(name) 
if (NULL==PolyHead[name-'a']) 
{ 
printf ("此多项式不存在!\n"); 
break; 
} 
OutP_Poly(PolyHead[name-'a']); 
break; 
case '3': 
{ 
char name1,name2; 
printf ("请输入加式一的名称:"); 
READ(name1) 
if (NULL==PolyHead[name1-'a']) 
{ 
printf ("此多项式不存在!请先创建\n"); 
break; 
} 
printf ("请输入加式二的名称:"); 
READ(name2) 
if (NULL==PolyHead[name2-'a']) 
{ 
printf ("此多项式不存在!请先创建\n"); 
break; 
} 
printf ("请输入要创建的和式的名称:"); 
READ(name) 
if (NULL!=PolyHead[name-'a']) 
{ 
printf ("此多项式已经存在!\n"); 
break; 
} 
AddPoly(&PolyHead[name-'a'],PolyHead[name1-'a'],PolyHead[name2-'a']); 
OutP_Poly(PolyHead[name-'a']); 
break; 
} 
case '4': 
{ 
char name1,name2; 
printf ("请输入被减式的名称:"); 
READ(name1) 
if (NULL==PolyHead[name1-'a']) 
{ 
printf ("此多项式不存在!请先创建\n"); 
break; 
} 
printf ("请输入减式的名称:"); 
READ(name2) 
if (NULL==PolyHead[name2-'a']) 
{ 
printf ("此多项式不存在!请先创建\n"); 
break; 
} 
printf ("请输入要创建的差式的名称:"); 
READ(name) 
if (NULL!=PolyHead[name-'a']) 
{ 
printf ("此多项式已经存在!\n"); 
break; 
} 
DecPoly(&PolyHead[name-'a'],PolyHead[name1-'a'],PolyHead[name2-'a']); 
OutP_Poly(PolyHead[name-'a']); 
break; 
} 
case '5': 
printf ("请输入要删除的多项式名称:"); 
READ(name) 
if (NULL==PolyHead[name-'a']) 
{ 
printf ("此多项式不存在!\n"); 
break; 
} 
DelPoly(&PolyHead[name-'a']); 
printf ("多项式%c已删除!\n",name); 
break; 
case '6': 
return OK; 
} 
} 
} 

status CreatPoly(P_Poly* P_PolyHead,int n) 
{ //为确保其他子函数正常运行,入口参数要求不含同类项、指数递减 
int i=0; 
P_Poly p,tail; 
*P_PolyHead=(Poly*)malloc(sizeof(Poly)); 
(*P_PolyHead)->expn=n; 
tail=*P_PolyHead; 
printf ("请按照指数递减序输入最简形式的多项式\n"); 
for (;i<n;i++) 
{ 
p=(Poly*)malloc(sizeof(Poly)); 
printf ("请输入第%d项的系数和指数(系数,指数):",i+1); 
scanf ("%f,%d",&(p->coef),&(p->expn)); 
tail->next=p; 
tail=p; 
} 
tail->next=NULL; 
return OK; 
} 


void OutP_Poly(P_Poly PolyHead) 
{ 
int i=0; 
P_Poly p; 
printf ("%d ",PolyHead->expn); 
p=PolyHead->next; 
for (;i<PolyHead->expn;i++) 
{ 
printf ("%f,%d ",p->coef,p->expn); 
p=p->next; 
} 
printf ("\n"); 
} 


void AddPoly(P_Poly* P_PolyHead,P_Poly PolyHead1,P_Poly PolyHead2) 
{ 
int i=0; 
P_Poly p1,p2,p,tail; 
p1=PolyHead1->next; 
p2=PolyHead2->next; 
*P_PolyHead=(P_Poly)malloc(sizeof(Poly)); 
p=tail=*P_PolyHead; 
while(p1&&p2) 
{ 
int e1,e2; 
e1=p1->expn; 
e2=p2->expn; 
if (e1>e2) 
{ 
p=(P_Poly)malloc(sizeof(Poly)); 
tail->next=p; 
tail=p; 
*p=*p1; 
p1=p1->next; 
i++; 
} 
else if(e1==e2) 
{ 
float sum_c=p1->coef+p2->coef; 
if (sum_c!=0.0) 
{ 
p=(P_Poly)malloc(sizeof(Poly)); 
tail->next=p; 
tail=p; 
p->coef=sum_c; 
p->expn=e1; 
i++; 
} 
p1=p1->next; 
p2=p2->next; 
} 
else if (e1<e2) 
{ 
p=(P_Poly)malloc(sizeof(Poly)); 
tail->next=p; 
tail=p; 
*p=*p2; 
p2=p2->next; 
i++; 
} 
} 
while (p1) 
{ 
p=(Poly*)malloc(sizeof(Poly)); 
*p=*p1; 
tail->next=p; 
tail=p; 
p1=p1->next; 
i++; 
} 
while (p2) 
{ 
p=(Poly*)malloc(sizeof(Poly)); 
*p=*p2; 
tail->next=p; 
tail=p; 
p2=p2->next; 
i++; 
} 
(*P_PolyHead)->expn=i; 
tail->next=NULL; 
} 

void DecPoly(P_Poly* P_PolyHead,P_Poly PolyHead1,P_Poly PolyHead2) 
{ 
int i=0; 
P_Poly p1,p2,p,tail; 
p1=PolyHead1->next; 
p2=PolyHead2->next; 
*P_PolyHead=(P_Poly)malloc(sizeof(Poly)); 
p=tail=*P_PolyHead; 
while(p1&&p2) 
{ 
int e1,e2; 
e1=p1->expn; 
e2=p2->expn; 
if (e1>e2) 
{ 
p=(P_Poly)malloc(sizeof(Poly)); 
tail->next=p; 
tail=p; 
*p=*p1; 
p1=p1->next; 
i++; 
} 
else if(e1==e2) 
{ 
float dif_c=p1->coef-p2->coef; 
if (dif_c!=0.0) 
{ 
p=(P_Poly)malloc(sizeof(Poly)); 
tail->next=p; 
tail=p; 
p->coef=dif_c; 
p->expn=e1; 
i++; 
} 
p1=p1->next; 
p2=p2->next; 
} 
else if (e1<e2) 
{ 
p=(P_Poly)malloc(sizeof(Poly)); 
tail->next=p; 
tail=p; 
p->coef=-p2->coef; 
p->expn=p2->expn; 
p2=p2->next; 
i++; 
} 
} 
while (p1) 
{ 
p=(Poly*)malloc(sizeof(Poly)); 
*p=*p1; 
tail->next=p; 
tail=p; 
p1=p1->next; 
i++; 
} 
while (p2) 
{ 
p=(Poly*)malloc(sizeof(Poly)); 
*p=*p2; 
tail->next=p; 
tail=p; 
p2=p2->next; 
i++; 
} 
(*P_PolyHead)->expn=i; 
tail->next=NULL; 
} 

void DelPoly(P_Poly* P_PolyHead) 
{ 
P_Poly p,prior; 
p=prior=*P_PolyHead; 
while (p->next) 
{ 
p=p->next; 
free(prior); 
prior=p; 
} 
*P_PolyHead=NULL; 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -