C语言实现 一元多项式相加及多个多项式相加

  • 格式:doc
  • 大小:40.50 KB
  • 文档页数:6

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define NULL 0
typedef struct NODE {
float coef; //系数
int expn; //指数
struct NODE *next;
}NODE;
NODE *Creat(int n);
void print(NODE *head);
NODE *AddPolyn(NODE *head1, NODE *head2);
NODE *Delfirst(NODE *head, NODE *q);
void InsertBefore(NODE *p1, NODE *p2);
int compare(int a, int b);
NODE *CreatLinkList(int n);
int inputnum(int n);
void main(int n)
{
char y;
NODE *headsum;
printf("****************************欢迎使用一元多项式相加程序******************\n");
printf("请输入多项式的数目(大于0的整数): ");
scanf("%d", &n);
n = inputnum(n);
headsum = CreatLinkList(n);
printf("\n合并后的多项式的显示: \n");
print(headsum);
printf("****************************谢谢使用************************************\n");
printf("继续?请输入(y/n): ");
scanf("%s", &y);
if (y=='y')
{
main(1);
}
}
int inputnum(int n)
{
while (n<=0)
{
printf("输入的数值有误,请确认输入的数值为大于0的整数!: ");
scanf("%d", &n);
}
return n;
}
/*创建链表*/
NODE *Creat(int n)
{
NODE *current, *previous, *head;
int i;
head = (NODE *)malloc(sizeof(NODE)); /*创建头结点*/
previous = head;
for(i = 0; i < n; i++)
{
current = (NODE *)malloc(sizeof(NODE));
printf("请输入系数和指数: ");
scanf("%f%d", &current->coef, &current->expn);
previous->next = current;
previous = current;
}
previous->next = NULL;
return head;
}
/*一元多项式的想加,总体考虑,可分qa的指数比qb小,或等于pb(如果系数相加等于0和不等于0),或大于pb
里面由InsertBefore和Delfirst两个小模块组成一部分*/
NODE *AddPolyn(NODE *head1, NODE *head2)
{
NODE *ha, *hb, *qa, *qb;
int a, b;
float sum;
ha = head1; /*ha和hb指向头结点*/
hb = head2;
if (ha != NULL) //head1判断是否为空
{
if (hb==NULL)
{
return head1;
}
else
{
qa = ha->next; /*qa和qb指向头结点的下一个结点*/
qb = hb->next;
while(qa && qb) /*qa和qb均非空*/
{
a = qa->expn;
b = qb->expn;
switch(compare(a, b)) {
case -1 : /*qa->expn < qb->expn*/
ha = qa;
qa = qa->next;
break;
case 0 :
sum = qa->coef + qb->coef; /*系数的和*/
if(sum != 0.0) { /*如果不是0.0*/
qa->coef = sum; /*改变系数*/
ha = qa;
}
else {
free(Delfirst(ha, qa));
}
free(Delfirst(hb, qb));
qa = ha->next;
qb = hb->next; /*qb释放后要重新赋值*/
break;
case 1 : /*如果qa-> expn > qb -> expn*/ Delfirst(hb, qb);
InsertBefore(ha, qb); /*把qb插入到ha下一个结点之前*/
qb = hb->next;
ha = ha->next;
break;
}
}
}
if(qb)
ha->next = qb; /*插入剩余的pb*/ free(head2);
return head1;
}
else
{
return head2;
}
}
/*比较*/
int compare(int a, int b)
{
if(a < b)
return -1;
else if(a > b)
return 1;
else
return 0;
}
/*删除结点q*/
NODE *Delfirst(NODE *p1, NODE *q)
{
p1 -> next = q -> next;
return (q);
}
/*插入结点,引入结点p,可以让p插入到p2和p1之间*/
void InsertBefore(NODE *p1, NODE *p2)
{
NODE *p;
p = p1->next;
p1->next = p2;
p2->next = p;
}
/*打印,为了美观程序分开打印*/
void print(NODE *head)
{
NODE *current;
current = head->next;
while(current->next != NULL)
{
printf("%0.f * x^%d + ", current->coef, current->expn);
current = current -> next;
}
printf("%0.f * x^%d\n", current->coef, current->expn);
}
/*实现相加及创建多个一元多项式*/
NODE *CreatLinkList(int n)
{
int i,a;
char x;
NODE *head[88],*headsum; //长度为88的数组,足够长了吧应该
headsum = NULL;
for (i=1;i<=n;i++)
{
printf("\n请输入第%d个多项式的数目: ",i);
scanf("%d", &a);
a=inputnum(a);
printf("(请按指数大小依次输入系数和指数)\n ");
head[i]= Creat(a);//创建以head[i]为头结点的链表
printf("下式是你所输入的第%d个多项式: \n",i);
print(head[i]);
printf("请确认输入是否正确,若有误请输入n重新输入上式,正确请输入y确认(小写):"); //确认输入
scanf("%s", &x);
if (x== 'n') //如果有误则更正
{
if (i==1) //如果第一项有误i不减,将第一个一元多项式清空
{
head[i] = NULL;
}
else{ //如果不是第一项,将已输入的多项式清空,并i减1
head[i] = NULL;
// i--;
}
}
headsum= AddPolyn(headsum,head[i]);//将各链表相加
if (x== 'n') //如果第一项有误i--
{
i--;
}
}
return headsum;
}。