一元多项式计算器

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;

typedef struct{//定义一元多项式变量
int Expn;
float Coef;
}ElemType;

typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode, *LinkList;
Status CreatList(LinkList &L,int n)
{//操作结果:逆位输入n个元素的值,建立带表头节点的单链线性表L。
LinkList p;
int i,expn;
float coef;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
for(i=n;i>0;--i)
{
p=(LinkList)malloc(sizeof(LNode));
cout<<"请输入第"
<<n-i
<<"组数据,形式为<系数,指数>"
<<endl;
cin>>coef
>>expn;
p->data.Coef=coef;
p->data.Expn=expn;
p->next=L->next;
L->next=p;
}//for
return OK;
}//CreatList

为什么无法实现链表的创建?

拷过去后自己整一下编程风格
//一元稀疏多项式计算器
#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;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-05-14
这一个程序可以用
#include <stafx.h>
#include <stdlib.h>
#define LEN sizeof(struct entry)
struct entry{
int mod;
int exp;
struct entry *next; };
void init(struct entry *strPer){
struct entry *p,*p1,*p2;
int m;
int n;
int k;
k=0;
p=strPer;
(*p).mod=0;
(*p).exp=-1;
p1=p2=(struct entry *) malloc (LEN);
printf("请输入多项式:\n");
scanf("%d%d",&p1->mod,&p1->exp);
p->next=NULL;
while (p1->mod!=0){
k=k+1;
if (k==1) p->next=p1;
else p2->next=p1;
p2=p1;
p1=(struct entry *) malloc (LEN);
scanf("%d%d",&p1->mod,&p1->exp); }
p2->next=NULL;
printf("您输入的多项式是:\n");
p=strPer->next;
do {
if(p->mod==1){
printf("x^%d",p->exp); }
else if (p->mod==-1){
printf("-x^%d",p->exp); }
else{
if(p->mod>0) printf("+%dx^%d",p->mod,p->exp);
else printf("%dx^%d",p->mod,p->exp); }
p=p->next;
}while(p!=NULL);
printf(" \n"); }

int cmp(int a,int b){
if (a<b) return -1;
if (a=b) return 0;
if (a>b) return 1; }

struct entry * delFirst(struct entry *h,struct entry *q){
q=h->next;
h->next=(h->next)->next;
return (q); }

void insFirst(struct entry *h,struct entry *q){
q->next=h->next;
h->next=q; }

void append(struct entry *h,struct entry *q){
while (h->next!=NULL){
h=h->next; }
h->next=q->next; }
void iput(struct entry *strPer){
struct entry *p;
p=strPer->next;
printf("相加得到的多项式是:\n");
do{
if(p->mod==1){
printf("x^%d",p->exp);
}
else if (p->mod==-1){
printf("-x^%d",p->exp);
}
else{
if(p==strPer+1){
if(p->mod>0) printf("%dx^%d",p->mod,p->exp);
else printf("%dx^%d",p->mod,p->exp); }
else{
if(p->mod>0) printf("+%dx^%d",p->mod,p->exp);
else printf("%dx^%d",p->mod,p->exp); }
}
p=p->next;
}while(p!=NULL); }

void main(){
struct entry *strPerA;
struct entry *strPerB;
struct entry *ha;
struct entry *hb;
struct entry *qa;
struct entry *qb;
int a;
int b;
int sum;
int k;
int h;
h=0;
strPerA=(struct entry *) malloc (LEN);
strPerB=(struct entry *) malloc (LEN);
if (strPerA!=NULL && strPerB!=NULL){
init(strPerA);
init(strPerB);
}
ha=strPerA;
hb=strPerB;
qa=ha->next;
qb=hb->next;
while(qa && qb){
a=qa->exp;
b=qb->exp;
k=cmp(a,b);
h=h+1;
switch (k){
case -1:
ha=qa;
qa=qa->next;
break;
case 0 :
sum=qa->mod+qb->mod;
if (sum!=0){
(*qa).mod=sum;
ha=qa; }
else {
delFirst(ha,qa); }
qb=delFirst(hb,qb);
//free(qb);
qb=qb->next;
qa=ha->next;
break;
case 1:
qb=delFirst(hb,qb);
insFirst(ha,qb);
qb=hb->next;
ha=ha->next;
break; }
}
if (strPerB->next!=NULL) append(strPerA,strPerB);
iput(strPerA);
free(strPerB);
}
参考一下吧,我们刚刚做完上机实习本回答被提问者采纳
相似回答