/***************************************************************Author :bryant~xwCreated Time :2017-11-20File Name :单链表应用———一元多项式的相加**************************************************************/#include#include #include #define OK 1#define ERROR 0;using namespace std;typedef int Status;typedef struct LNode{ int xi;///系数 int zhi;///指数 struct LNode *next; int len;}*Node , *LinkList;/**************************************************************///建表Status InitList(LinkList &L){ Node p; p=(Node)malloc(sizeof(LNode)); if(p) { L=p; p->next=NULL; L->len=0; return OK; } else return ERROR;}/**************************************************************/// 插入第i个位置前,利用插入将系数和指数存到链表中,Status ListInsert(LinkList &L , int i, double e1 , int e2){ Node p,s; p=L; int j=0; while(j next; j++; } s=(Node)malloc(sizeof(LNode)); s->xi=e1; s->zhi=e2; s->next=p->next; p->next=s; L->len++; return OK;}/**************************************************************/// 输出一元多项式的形式void visit(int a,int b){ printf("%d %d",a,b);}Status ListTraverse(LinkList L ,void(*visit)(int,int)){ Node p; p=L->next; while(p) { visit(p->xi,p->zhi); if(p->next!=NULL) printf(" "); p = p->next; } return OK;}/**************************************************************///返回多项式的项数int ListLength(LinkList L){ Node p; int j=0; p=L->next; while(p) { p=p->next; j++; } return j;}/**************************************************************/// 一元多项式的相加Status Add(LinkList &La , LinkList &Lb){ Node pa,pb,pc; pa=La->next; pb=Lb->next; pc=La; while(pa&&pb) { int sum; ///开始比较指数 if(pa->zhi > pb->zhi) { pc->next=pa; pc=pa; pa=pa->next; } else if(pa->zhi < pb->zhi) { pc->next=pb; pc=pb; pb=pb->next; } else///pa的指数和pb的指数相同 { sum=pa->xi+pb->xi; if(sum!=0) { pa->xi=sum; pc->next=pa; pc=pa; pa=pa->next; Node temp; temp=pb; pb=pb->next; free(temp); } if(sum==0) { Node temp1,temp2; temp1=pa; pa=pa->next; free(temp1); La->len--; ///释放结点后长度要减 temp2=pb; pb=pb->next; free(temp2); } } } pc->next=pa ? pa : pb; free(Lb); return OK;}/**************************************************************/int main(){ LinkList L1,L2; InitList(L1); InitList(L2); int t; printf("请输入测试的组数:"); scanf("%d",&t); puts(""); int n,m; int x,z; while(t--) { printf("请输入多项式L1的项数:"); scanf("%d",&n); printf("请按照指数递减的形式输入L1的系数:xi、指数:zhi\n"); for(int i = 1; i <= n; i++) { scanf("%d%d",&x,&z); ListInsert(L1,i,x,z); } printf("请输入多项式L2的项数:"); scanf("%d",&m); printf("请按照指数递减的形式输入L2的系数:xi、指数:zhi\n"); for(int i = 1; i <= m; i++) { scanf("%d%d",&x,&z); ListInsert(L2,i,x,z); } printf("多项式L1的项数:%d\n",ListLength(L1)); ListTraverse(L1,visit); puts(""); printf("多项式L2的项数:%d\n",ListLength(L2)); ListTraverse(L2,visit); puts(""); printf("L1和L2相加后得L3,"); Add(L1,L2); printf("多项式L3的项数:%d\n",ListLength(L1)); ListTraverse(L1,visit); puts(""); } return 0;}/**************************************************************//*2 //t组*********************5 //多项式项数3 6 //系数 指数2 5-3 42 35 04 //多项式项数4 7-2 52 41 1*********************33 81 33 232 43 24 1/**************************************************************/