拿这个来练手对链表的操作,感觉还不错。 

看代码吧:

/*******************************************
多项式的运算程序
作者:Anka9080
功能:完成多项式的相加,相乘运算
E-mail:Anka9080@163.com
完成日期:2013/4/8
*******************************************/
#include "stdio.h"
#include "stdlib.h"
#include "malloc.h"
/* 结构体PNODE用来存放每一项的系数与指数 */
typedef struct PNODE{
int coef;
int exp;
struct PNODE *next;
}PNODE, *PLIST;
/* 多项式的初始化 */
PLIST poly_init(int no)
{
int len;
PNODE *head, *rear,*t;
rear=head=(PLIST)malloc(sizeof(PNODE));
head->next=NULL;
printf("请输入第(%d)个多项式的项数:",no);
scanf("%d",&len);                                  /* 用于记录多项式的项数 */
for(int i=1;i<=len;i++)
{
t=(PLIST)malloc(sizeof(PNODE));
printf("请输入第%d项的系数:",i);
scanf("%d",&t->coef);
printf("请输入第%d项的指数:",i);
scanf("%d",&t->exp);
t->next=NULL;
rear->next=t;
rear=t;
}
return head;
}
/*  两个多项式相加 */
PLIST poly_add(PLIST A,PLIST B)
{
int x;
PLIST C,T;                                  /* 结构体指针T作为缓冲变量
相加后的值存到结构体指针C指向的地址中*/
PLIST PA,PB,PC;
PA=A->next;
PB=B->next;
C=(PLIST)malloc(sizeof(PNODE));
PC=C;
PC->next=NULL;
while(PA&&PB)
{
if(PA->exp==PB->exp)
{
x=PA->coef+PB->coef;
if(x!=0)
{
T=(PLIST)malloc(sizeof(PNODE));
T->coef=x;
T->exp=PA->exp;
T->next=NULL;PC->next=T;
PC=T;
}
PA=PA->next;
PB=PB->next;
}
else
if(PA->exp<PB->exp)
{
T=(PLIST)malloc(sizeof(PNODE));
T->coef=PA->coef;
T->exp=PA->exp;
T->next=NULL;PC->next=T;
PC=T;
PA=PA->next;
}
else
{
T=(PLIST)malloc(sizeof(PNODE));
T->coef=PB->coef;
T->exp=PB->exp;
T->next=NULL;PC->next=T;
PC=T;
PB=PB->next;
}
}
while(PA)
{
T=(PLIST)malloc(sizeof(PNODE));
T->coef=PA->coef;
T->exp=PA->exp;
T->next=NULL;
PC->next=T;
PC=T;
PA=PA->next;
}
while(PB)
{
T=(PLIST)malloc(sizeof(PNODE));
T->coef=PB->coef;
T->exp=PB->exp;
T->next=NULL;PC->next=T;
PC=T;
PB=PB->next;
}
return C;
}
/* 两个多项式相乘 */
PLIST poly_multi(PLIST A,PLIST B)
{
PLIST C,T,S;                             /* C,T均作为缓冲指针变量 S指向相乘后得到的多项式*/
PLIST PA,PB,PC;
PA=A->next;
PB=B->next;
C=(PLIST)malloc(sizeof(PNODE));
PC=C;
PC->next=NULL;
S=(PLIST)malloc(sizeof(PNODE));
S->next=NULL;
while(PB)
{
while(PA)
{
T=(PLIST)malloc(sizeof(PNODE));
T->coef=PA->coef*PB->coef;
T->exp=PA->exp+PB->exp;
T->next=NULL;
PC->next=T;
PC=T;
PA=PA->next;
}
S=poly_add(S,C);
PC=C;                               /* 使PC重新指向C 为下一轮相乘做准备 */
PC->next=NULL;
PA=A->next;                         /* PA重新指向A的首元节点 */
PB=PB->next;                        /* PB指向写一个节点 */
}
return S;
}
/* 打印多项式 */
void poly_print(PLIST C)
{
C=C->next;
while(C)
{
printf("%dx^%d+",C->coef,C->exp);
C=C->next;
}
printf("0");                            /* 这里用0对多项式收尾处理 */
}
int main()
{
PLIST A1,B1,C1,D1;
A1=poly_init(1);
B1=poly_init(2);
C1=poly_add(A1,B1);
printf("\n");
printf("多项式相加结果:");
poly_print(C1);
printf("\n");
printf("多项式相加结果:");
D1=poly_multi(A1,B1);
poly_print(D1);
}

 

下面测试了一组结果:

wKioL1NEB2ODZhiNAAEysipARwI633.jpg

 

说明:

1 、多项式的输入 系数要按从小到大进行

2、 程序中的头指针指向的地址一直没有改变 通过缓冲指针PA,PB(可看作尾指针)和缓冲指针T来对链表进行操作