一元多项式相加(链式实现)
Posted 1999-yuanyuan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一元多项式相加(链式实现)相关的知识,希望对你有一定的参考价值。
1 #include<stdio.h> 2 #include<stdlib.h> 3 4 typedef struct LNode //结点类型 5 { 6 int index; //指数 7 int coe; //系数 8 struct LNode *next; 9 }LNode,*Link; 10 typedef struct //列表类型 11 { 12 Link head,tail; //头指针和尾指针 13 int len; 14 }LinkList; 15 16 int InitList(LinkList *L); //构建空表 成功返回1,失败返回0 17 int MakeNode(LinkList *L,int index, int coe); //创建结点并存入指数和系数 成功返回1,失败返回0 18 void Add(LinkList *LA,LinkList *LB,LinkList *LC); //”和多项式"没有重新生成,而是从A,B中摘取到C上 19 void print(LinkList *L); //用于打印链表 20 21 int main() 22 { 23 LinkList LA,LB,LC; 24 int m,index; //输入m个一元多项式 25 int coe; 26 InitList(&LA); 27 InitList(&LB); 28 InitList(&LC); 29 printf("输入表A有多少个数据! 并输入数据的指数和系数 "); 30 scanf("%d",&m); 31 for (int i=0;i<m;++i) 32 { 33 printf("第%d个多多项式",i+1); 34 scanf("%d%d",&index,&coe); 35 MakeNode(&LA,index,coe); 36 } 37 printf("输入表B有多少个数据! 并输入数据的指数和系数 "); 38 scanf("%d",&m); 39 for (int i=0;i<m;++i) 40 { 41 printf("第%d个多多项式",i+1); 42 scanf("%d%d",&index,&coe); 43 MakeNode(&LB,index,coe); 44 } 45 Add(&LA,&LB,&LC); 46 print(&LC); 47 48 return 0; 49 } 50 int InitList(LinkList *L) 51 { 52 int label; //用于标记 53 LNode *p=(LNode*)malloc(sizeof(LNode)); 54 if (!L->head) label=0; 55 else 56 { 57 L->head=L->tail=p; 58 L->len=0; 59 label=1; 60 } 61 return label; 62 } 63 int MakeNode(LinkList *L,int index, int coe) 64 { 65 int label; //用于标记 66 LNode *p=(LNode*)malloc(sizeof(LNode)); 67 if (!L->head) label=0; 68 else 69 { 70 L->tail->next = p; //把p插入未更新的尾结点后面 71 L->tail = p; //更新尾指针 72 p->index = index; //初始化数据 73 p->coe = coe; 74 L->len++; //更新计数器 75 label=1; 76 } 77 L->tail->next= NULL; 78 79 return label; 80 } 81 void Add(LinkList *LA,LinkList *LB,LinkList *LC) 82 { 83 Link pa,pb,pc; 84 Link qa,qb; //用于删去结点 85 pa = LA->head->next; 86 pb = LB->head->next; 87 pc = LC->head; 88 while (pa!=NULL && pb!=NULL) //进行比较,比较有三种情况,大于 小于 等于 89 { 90 if (pa->index < pb->index) //小于 91 { 92 pc->next = pa; //接在C表上 93 pc = pa; //更新pc 94 pa = pa->next; //pa后移 95 96 } 97 else if (pa->index > pb->index) //大于 98 { 99 pc->next = pb; //接在C表上 100 pc = pb; //更新pc 101 pb = pb->next; //pb后移 102 103 } 104 else //等于 分为两种情况 系数相加是否为零 105 { 106 if (pa->coe+pb->coe == 0) 107 { 108 pa = pa->next; //二者均后移 109 pb = pb->next; 110 } 111 else 112 { 113 pa->coe = pa->coe+pb->coe;//加给A表,释放B表 114 pc->next = pa; 115 pb = pb->next; 116 } 117 } 118 } 119 if ( pa!=NULL ) //为真则B表已经到尾了 120 { 121 pc->next = pa; 122 } 123 else //A表到尾 124 { 125 pc->next = pb; 126 } 127 } 128 void print(LinkList *L) 129 { 130 Link p=L->head->next; 131 while (p) 132 { 133 printf("%d,%d ",p->index,p->coe); 134 p = p->next; 135 } 136 137 }