1、定义一个结构体,表示系数,次方和指针域。
#include<stdio.h>
#include<malloc.h>
//定义结构体,三个地址,分别表示系数,次方,指针域。
typedef struct Linknode
{
int coefficent;
int exponent;
struct Linknode *next;
}*linklist,*nodePtr;
2、初始化
//初始化结构体,全为空。
linklist initlinklist()
{
//申请内存空间,为linklist申请一个大小为linknode的指针。
linklist tempHeader = (linklist)malloc(sizeof(struct Linknode));
tempHeader->coefficent = 0;
tempHeader->exponent = 0;
tempHeader->next = NULL;
return tempHeader;
}
3、打印链表和结点
//打印链表
void printlist(linklist paraHeader)
{
//将链表依次打印出来。
nodePtr p = paraHeader->next;
while(p != NULL)
{
printf("%d * 10^%d + ", p->coefficent,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->coefficent,paraPtr->exponent);
}
}
4、连接函数的设计
//连接函数的设计
void appendelement(linklist paraHeader, int paraCoefficient, int paraExponent)
{
nodePtr p,q;//局部定义两个指针。
//第一步,申请一个新的空间
q = (nodePtr)malloc(sizeof(struct Linknode));
q->coefficent = paraCoefficient;
q->exponent = paraExponent;
q->next = NULL;
//第二步,寻找尾部。
p = paraHeader;
while(p->next != NULL)
{
p = p->next;
}
//第三步,连接链表。
p->next = q;
}
5、设计一个加法运算的函数
//设计一个加法运算函数
void add(nodePtr paralist1,nodePtr paralist2)
{
nodePtr p,q,r,s;
//第一步,寻找位置。
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("case1\r\n");
r = p;
printnode(r,'r');
p = p->next;
printnode(p,'p');
}
else if((p->exponent > q->exponent))
{
//连接当前链表。
printf("case2\r\n");
r->next = q;
r = q;
printnode(r,'r');
q = q->next;
printnode(q,'q');
}
else
{
printf("case3\r\n");
//交换当前链表。
p->coefficent = p->coefficent + q->coefficent;
printf("系数是:%d.\r\n",p->coefficent);
if(p->coefficent ==0)
{
printf("case 3.1\r\n");
s = p;
p = p->next;
printnode(p,'p');
free(s);//释放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->coefficent,q->exponent);
free(s);
}
printf("p = %ld,q = %ld\r\n",p,q);
}
printf("end of while.\r\n");
if(p== NULL)
{
r->next = q;
}
else
{
r->next = p;
}
printf("Addition ends.\r\n");
}
6、测试函数
//测试函数
void addtest()
{
//第一步,初始化第一个多项式。
linklist templist1 = initlinklist();
appendelement(templist1,7,0);
appendelement(templist1,3,1);
appendelement(templist1,9,8);
appendelement(templist1,5,17);
printlist(templist1);
//第二步,初始化第二个多项式。
linklist templist2 = initlinklist();
appendelement(templist2,8,1);
appendelement(templist2,22,7);
appendelement(templist2,-9,8);
printlist(templist2);
//第三步,把他们添加到第一个进去。
add(templist1,templist2);
printlist(templist1);
}
int main()
{
addtest();
printf("完成!\r\n");
}
总代码如下:
#include<stdio.h>
#include<malloc.h>
//定义结构体,三个地址,分别表示系数,次方,指针域。
typedef struct Linknode
{
int coefficent;
int exponent;
struct Linknode *next;
}*linklist,*nodePtr;
//初始化结构体,全为空。
linklist initlinklist()
{
//申请内存空间,为linklist申请一个大小为linknode的指针。
linklist tempHeader = (linklist)malloc(sizeof(struct Linknode));
tempHeader->coefficent = 0;
tempHeader->exponent = 0;
tempHeader->next = NULL;
return tempHeader;
}
//打印链表
void printlist(linklist paraHeader)
{
//将链表依次打印出来。
nodePtr p = paraHeader->next;
while(p != NULL)
{
printf("%d * 10^%d + ", p->coefficent,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->coefficent,paraPtr->exponent);
}
}
//连接函数的设计
void appendelement(linklist paraHeader, int paraCoefficient, int paraExponent)
{
nodePtr p,q;//局部定义两个指针。
//第一步,申请一个新的空间
q = (nodePtr)malloc(sizeof(struct Linknode));
q->coefficent = paraCoefficient;
q->exponent = paraExponent;
q->next = NULL;
//第二步,寻找尾部。
p = paraHeader;
while(p->next != NULL)
{
p = p->next;
}
//第三步,连接链表。
p->next = q;
}
//设计一个加法运算函数
void add(nodePtr paralist1,nodePtr paralist2)
{
nodePtr p,q,r,s;
//第一步,寻找位置。
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("case1\r\n");
r = p;
printnode(r,'r');
p = p->next;
printnode(p,'p');
}
else if((p->exponent > q->exponent))
{
//连接当前链表。
printf("case2\r\n");
r->next = q;
r = q;
printnode(r,'r');
q = q->next;
printnode(q,'q');
}
else
{
printf("case3\r\n");
//交换当前链表。
p->coefficent = p->coefficent + q->coefficent;
printf("系数是:%d.\r\n",p->coefficent);
if(p->coefficent ==0)
{
printf("case 3.1\r\n");
s = p;
p = p->next;
printnode(p,'p');
free(s);//释放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->coefficent,q->exponent);
free(s);
}
printf("p = %ld,q = %ld\r\n",p,q);
}
printf("end of while.\r\n");
if(p== NULL)
{
r->next = q;
}
else
{
r->next = p;
}
printf("Addition ends.\r\n");
}
//测试函数
void addtest()
{
//第一步,初始化第一个多项式。
linklist templist1 = initlinklist();
appendelement(templist1,7,0);
appendelement(templist1,3,1);
appendelement(templist1,9,8);
appendelement(templist1,5,17);
printlist(templist1);
//第二步,初始化第二个多项式。
linklist templist2 = initlinklist();
appendelement(templist2,8,1);
appendelement(templist2,22,7);
appendelement(templist2,-9,8);
printlist(templist2);
//第三步,把他们添加到第一个进去。
add(templist1,templist2);
printlist(templist1);
}
int main()
{
addtest();
printf("完成!\r\n");
}
运行结果如下: