#include
#include
#include
//定义项的结构
struct INode
{
float num; //系数
int power; //指数(简单的定义为int)
struct INode *prior;
struct INode *next;
};
//创建一个降次排序的n项多项式
struct INode *creat()
{
struct INode *head,*p1,*p2;
int i,n;
head=(struct INode*)malloc(sizeof(struct INode));
head->prior=head->next=NULL;
p1=head;
if(!head)
{
printf("内存分配失败");
exit(0);
}
printf("\n输入多项式项数:");
scanf("%d",&n); //没有检测输入的项数合法性
for(i=0;i
p2=(struct INode*)malloc(sizeof(struct INode));
if(!p1)
{
printf("内存分配失败");
exit(1);
}
printf("输入第%d项系数和指数(以空格分开):",i+1);
scanf("%f%d",&p2->num,&p2->power);
p1->next=p2;
p2->prior=p1;
p1=p2;
}
p2->next=NULL;
printf("已创建该多项式\n");
return head;
}
//输出多项式
void output(struct INode *head)
{
struct INode *p;
p=head->next;
printf("\n");
if(p==NULL){
printf("多项式为空\n");
return;
}
while(p!=NULL)
{
if(p->num!=0)//系数不为零则输出
{
if(p->power!=0)
{
if(p->num!=1)
{
if(p->num==-1)
printf("-");
else
printf("%g",p->num); //系数不为1则输出系数
}
if(p->power!=0)//指数不为零则输出变量
{
printf("X");
if(p->power!=1)
printf("^%d",p->power); //指数不为1则输出指数
}
}
else
printf("%g",p->num);
}
p=p->next;
if(p!=NULL && p->num>0) //中间项且系数为正则输出"+"号
printf("+");
}
printf("\n");
}
//查找某一项,按指数查找
void findItem(struct INode *head)
{
int pow;
struct INode *p=head->next;
if(p==NULL){
printf("\n多项式为空\n");
return;
}
printf("\n输出要查找项的指数:");
scanf("%d",&pow);
while(p!=NULL)
{
if(p->power==pow)
{
if(p->power!=0)
{
if(p->num!=1)
{
if(p->num==-1)
printf("-");
else
printf("%g",p->num); //系数不为1则输出系数
}
if(p->power!=0)//指数不为零则输出变量
{
printf("X");
if(p->power!=1)
printf("^%d",p->power); //指数不为1则输出指数
}
}
else
printf("%g",p->num);
printf("\n");
return;
}
p=p->next;
}
printf("\n无该指数的项\n");
}
//删除某一项,按指数删除
void delItem(struct INode *head)
{
int pow;
struct INode *p=head->next;
if(p==NULL){
printf("\n多项式为空\n");
return;
}
printf("\n输出要删除项的指数:");
scanf("%d",&pow);
while(p!=NULL)
{
if(p->power==pow)
{
p->prior->next=p->next;
if(p->next!=NULL) //不是最后一项则将其后继结点的前驱指其前驱
p->next->prior=p->prior;
printf("删除成功\n");
return;
}
p=p->next;
}
printf("\n无该指数的项\n");
}
//插入某一项
void insertItem(struct INode *head)
{
char ch=getch();
struct INode *newItem,*temp,*p;
temp=head;
p=head->next;
newItem=(struct INode*)malloc(sizeof(struct INode));
if(!newItem)
{
printf("内存分配失败");
exit(2);
}
printf("\n请输入插入项系数和指数(以空格分开):");
scanf("%f%d",&newItem->num,&newItem->power);
while(p!=NULL && p->power>newItem->power)//找到插入位置
{
temp=p;
p=p->next;
}
if(p==NULL)//插入到末尾
{
temp->next=newItem;
newItem->prior=temp;
newItem->next=NULL;
printf("插入成功\n");
}
else
{
if(p->power==newItem->power)
{
printf("已存在该指数的项,是否替换?(Y/N):");
fflush(stdin); //清除缓冲区
if(ch=='Y'||ch=='y')
{
p->num=newItem->num;
printf("替换成功\n");
}
else
printf("取消插入\n");
}
else
{
temp->next=newItem;
newItem->prior=temp;
newItem->next=p;
p->prior=newItem;
printf("插入成功\n");
}
}
}
//多项式求和
void addPolyItem()
{
struct INode *head1,*head2,*headSum,*p1,*p2,*p;
float addResult;
printf("\n输入第一个多项式:\n");
head1=creat();
printf("输入第二个多项式:\n");
head2=creat();
p1=head1->next;
p2=head2->next;
headSum=p=(struct INode*)malloc(sizeof(struct INode));
headSum->next=NULL;
//开始求和
while(p1!=NULL && p2!=NULL)
{
if(p1->power>p2->power)
{
p->next=p1;
p1=p1->next;
}
else if(p1->power
{
p->next=p2;
p2=p2->next;
}
else
{
addResult=p1->num+p2->num;
p->next=p1;
p->next->num=addResult;
p1=p1->next;
p2=p2->next;
}
p=p->next;
}
if(p1==NULL)
p->next=p2;
if(p2==NULL)
p->next=p1;
printf("求和结果:");
output(headSum);
}
void main()
{
char choice;
struct INode *head=(struct INode*)malloc(sizeof(struct INode));
head->next=NULL;//创建一个空链表
printf("\n\n*******************************\n");
printf("1,输入一个多项式\n");
printf("2,插入某一项\n");
printf("3,删除某一项\n");
printf("4,查找某一项\n");
printf("5,输出多项式\n");
printf("6,多项是求和\n");
printf("7,退出\n");
printf("*******************************\n");
while(1)
{
printf("请按键选择操作:");
fflush(stdin); //清除缓冲区
choice=getch();
switch(choice)
{
case '1':
head=creat();
break;
case '2':
insertItem(head);
break;
case '3':
delItem(head);
break;
case '4':
findItem(head);
break;
case '5':
output(head);
break;
case '6':
addPolyItem();
break;
case '7':
exit(4);
default:
printf("输入错误\n");
break;
}
}
}