Description du problème:
L'achèvement de l'opération d'addition de deux polynômes: Il y a deux opération polynomiale P connue (x), Q (X), l'algorithme de conception P (x) + Q (x), mais pas d'ajouter à l'espace de re-ouverte. exigences de la structure de stockage mis en œuvre. Par exemple:
Conception algorithme
Le programmé quatre fonctions:
➢ fonction Init () pour initialiser le onze liste vide;
➢ fonction CreateTail () est utilisée pour créer une liste liée, ceci est la fin de la méthode d'interpolation pour créer une liste liée;
➢ fonction add () ajouter algorithme utilisé pour mettre en œuvre les deux polynômes;
➢ fonction print () pour produire un polynôme.
La somme de deux polynômes algorithme, les deux premiers polynômes sont stockés sous la forme d' une liste liée. Deux pointeurs peuvent être fournis LA1 et LB1 , respectivement, le premier noeud mobile polynômes Pm (x) et Qm (x) à partir de la comparaison de l' indice LA1 et LB1 noeud indiqué, on peut traiter les trois cas suivants:
(1 ) Si LA1-> exp <LB1-> exp, LA1 est désigné comme un noeud d'un polynôme, pointeur LA1 est déplacé vers l' arrière une position sur la base de l'original _.
(2) Si LA1-> exp = LB1-> exp, en ajoutant le coefficient article correspondant, puis deux cas: si le coefficient
terme est égal à zéro, le noeud est libéré LA1 et LB1 est dirigé, si le coefficient le terme est non nul et, LA1 modifier le
noeud de domaine de coefficient pointé par la libération noeud LB1.
(3) Si LA1-> exp> LB1-> exp, le noeud LB1 appelé un pointeur polynomiales, LB1 initial
se déplace sur la base d' une position vers l' arrière.
Comme le montre la figure expérimentale.:
réalisation du programme
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
typedef struct poly
{
int exp;//指数幂
int coef;//指数
struct poly* next;//指针域
}PNode,*Plinklist;
int Init(Plinklist* head)//链表的初始化
{
*head=(Plinklist)malloc(sizeof(PNode));
if(*head)
{
(*head)->next=NULL;
return 1;
}
else
return 0;
}
int CreateTail(Plinklist *head)//尾插法创建链表
{
Plinklist pTemp,pHead;
int c;//存放系数
int exp;//存放指数
int i=1;//计数用户计算到第几项
pHead=*head;
scanf("%d,%d",&c,&exp);
while(c!=0)
{
pTemp=(Plinklist)malloc(sizeof(PNode));
if(pTemp)
{
pTemp->exp=exp;
pTemp->coef=c;
pTemp->next=NULL;
pHead->next=pTemp;
pHead=pTemp;
scanf("%d,%d",&c,&exp);
}
else
return 0;
}
return 1;
}
void add(Plinklist LA,Plinklist LB)//两个多项式相加,两个表都是按指数顺序增长
{
PNode *LA1=LA->next;//LA的移动
PNode *LB1=LB->next;//LB的移动
PNode *temp;//保存要删除的节点
int sum=0;//存放系数的和
while(LA1&&LB1)
{
if(LA1->exp<LB1->exp)
{
LA->next=LA1;
printf("%d %d\n",LA->coef,LA->exp);
LA=LA->next;
LA1=LA1->next;
}
else if(LA1->exp==LB1->exp)
{
sum=LA1->coef+LB1->coef;
if(sum)
{
LA1->coef=sum;
LA->next=LA1;
LA=LA->next;
LA1=LA1->next;
temp=LB1;
LB1=LB1->next;
free(temp);
}
else
{
temp=LA1;
LA1=LA1->next;
free(temp);
temp=LB1;
LB1=LB1->next;
free(temp);
}
}
else
{
LA->next=LB1;
LA=LA->next;
LB1=LB1->next;
}
}
if(LA1)//剩余节点插入链表
LA->next=LA1;
else
LA->next=LB1;
}
void print(Plinklist head)//输出多项式
{
head=head->next;
while(head)
{
if(head->exp)
printf("%dx^%d",head->coef,head->exp);
else
printf("%d",head->coef);
if(head->next)
printf("+");
else
break;
head=head->next;
}
}
int main()
{
Plinklist LA,LB;
Init(&LA);
Init(&LB);
printf("请输入第一个多项式的系数,指数(如2,3)输入0,0结束输入\n");
CreateTail(&LA);
printf("请输入第二个多项式的系数,指数(如2,3)输入0,0结束输入\n");
CreateTail(&LB);
print(LA);
printf("\n");
print(LB);
printf("\n");
add(LA,LB);
printf("两个多项式相加的结果为:\n");
print(LA);
printf("\n");
return 0;
}
Le résultat:
le code terminé, le dessin sur un livre rempli. Mais dans les deux fonction polynomiale de la somme des derniers à avoir une peine de juge:
cela ne comprend toujours pas pourquoi devrions - nous augmenter ces mots, comme s'il n'y a pas d' effet enlevé. Il n'y a pas grand frère pour dire look blanc, je considère moins le genre de situation?