C语言怎么写多项式求和中的插入部分,求计算机大神教我,谢谢!

2024-11-08 18:40:13
推荐回答(1个)
回答1:

#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->powerpower)
 {
  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;
 }
}

}