一元多项式相加(链式实现)

被刻印的时光 ゝ 提交于 2020-02-11 22:41:33
  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有多少个数据!\n并输入数据的指数和系数\n");
 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有多少个数据!\n并输入数据的指数和系数\n");
 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\n",p->index,p->coe);
134         p = p->next;
135     }
136 
137 }

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!