目录:
一.老师的代码
二.图形注解
三.自己的代码
四.总结
一.老师代码
#include <stdio.h>
#include <stdlib.h>
typedef struct LinkNode{
int coefficient;//系数
int exponent;//指数
}*LinkList,*NodePtr;
Linklist initLinklist{
LinkList tempHeader=(LinkList)malloc(sizeof(struct LinkNode));
tempHeader->coefficient=0;
tempHeader->exponent=0;
tempHeader->next=NULL;
return tempHeader;
}
void printList(LinkList paraHeader)
{
NodePtr p=paraHeader->next;
while(p)
{
printf("%d * 10^%d +",p->coefficient,p->exponent);
p=p->next;
}
printf("\r\n");
}
void printNode(NodePtr paraPtr,char paraChar)
{
if(paraPtr==NULL)
{
printf("NULL\r\n");
}else
{
printf("The element of %c is (%d*10^%d)\r\n",paraChar,paraPtr->cofficient,paraPtr->exponent);
}
}
void appendElement(LinkList paraHeader,int paraCoefficient,int paraExponent)//插入多项式各项的值
{
NodePtr p,q;
q=(NodePtr)malloc(sizeof(struct LinkNode));
q->coefficient=paraCoefficient;
q->exponent=paraExponent;
q->next=NULL;
p=paraHeader;
while(p->next!=NULL)
{
p=p->next;
}
p->next=q
}
void add(NodePtr paraList1,NodePte paraList2)
{
NodePtr p,q,r;
p=paraList1->next;
printNode(p,'p');
q=paraList2->next;
printNode(q,'q');
r=paraList1;
printNode(r,'r');
free(paraList2);//释放第二个表的空间
while(p!=NULL&q!=NULL)
{
if(p->exponent<q->exponent)
{
printf("case 1\r\n");
r=p;
printNode(r,'r');
p=p->next;
printfNode(p,'p');
}
else if(p->exponent>p->exponent)
{
printf("case 2\r\n");
r->next=q;
r=q;
printNode(r,'r');
q=q->next;
printNode(q,'q');
}
else
{
printf("case 3\r\n");
p->coefficient=p->coefficient+q->coefficient;
printf("The coefficient is: %d.\r\n".p->coeficient);
if(p->coefficient==0)
{
printf("case 3.1\r\n");
s=p;
p=p->next;
printNode(p,'p');
free(s);
}else{
printf("case 3.2\r\n");
r=p;
printNode(r,'r');
p=p->next;
printNode(p,'p');
}
s=q;
q=q->next;
printf("q is pointing to (%d,%d)\r\n",q->coefficient,q->exponent);
free(s);
}
printf("p=%ld,q=%ld \r\n");
}
if(p==NULL)
{
r->next=q;
}
else{
r->next=p;
}
printf("Addition ends.\r\n");
}
二..图形注解
三.自己的代码
#include <stdio.h>
#include <stdlib.h>
typedef struct Linklist{
int coefficient;//系数
int exponent;//指数
struct Linklist *next;
}*Linklist,Lnode;
Linklist Initialist()
{
Linklist tempHeader=(Linklist)malloc(sizeof(Lnode));
tempHeader->coefficient=0;
tempHeader->exponent=0;
tempHeader->next=NULL;
return tempHeader;
}
Linklist createlist_tail(Linklist tempHeader,int n)
{
Lnode *q,*r;
tempHeader->next=NULL;
r=tempHeader;
int i;
for(i=0;i<n;i++)
{
q=(Lnode*)malloc(sizeof(Lnode));
scanf("%d%d",&q->coefficient,&q->exponent );
q->next=NULL;
r->next=q;
r=q;
}
return tempHeader;
}
void printlist(Linklist tempHeader)
{
Lnode *p;
p=tempHeader->next;
printf("The polynomial is:\n");
while(p)
{
if(p->next!=NULL)
printf("%d * 10^%d +",p->coefficient,p->exponent );
else
printf("%d * 10^%d\n",p->coefficient,p->exponent);
p=p->next;
}
}
void addpolynomia(Linklist tempHeader1,Linklist tempHeader2)
{
Lnode *r,*q,*s,*p;
p=tempHeader1->next;
q=tempHeader2->next;
r=tempHeader1;
while(p!=NULL&&q!=NULL)
{
if((p->exponent)<(q->exponent ))
{
r=p;
p=p->next;//当在第一条链上操作时就不用写 r=p->next,这条链本来就是存在的不用刻意再去链接
}
else if((p->exponent)>(q->exponent ))
{
r->next=q;
r=q;
q=q->next;
}
else
{
p->coefficient=p->coefficient +q->coefficient ;
if(p->coefficient!=0)
{
r=p;
p=p->next;
}
else
{
s=p;//不用考虑r因为相当于P在的那个结点直接从内存中抹去就可以了,然后继续移动p再进行判断
p=p->next;
free(s);
}
s=q;
q=q->next;
free(s);
}
}
while(p){
r->next=p;
r=p;
p=p->next;
}
while(q)
{
r->next=q;
r=q;
q=q->next;
}
//return tempHeader1;
}
int main()
{
int n,m;
printf("The first polynomia length is :");
scanf("%d",&n);
printf("The second polynomia length is :");
scanf("%d",&m);
Linklist tempHeader1,tempHeader2;
tempHeader1=Initialist();
tempHeader2=Initialist();
tempHeader1=createlist_tail(tempHeader1,n);
printlist(tempHeader1);
tempHeader2=createlist_tail(tempHeader2,m);
printlist(tempHeader2);
//Linklist paraHeader;
addpolynomia(tempHeader1,tempHeader2);
printf("The final result is:\r\n");
printlist(tempHeader1);
return 0;
}
四.总结
要注意分情况并且把每种情况都要考虑清楚,比如说指数相等的情况还要考虑系数的问题
要注意释放内存,把不要的内存空间及时释放掉