链表之一元多项式加法
2016-07-28 19:11
274 查看
A=7+3x+9x^8+5x^17
b=8x+22x^7-9x^8
c=A+b=7+11x+22x^7+5x^17
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define LEN sizeof(LNode)
typedef struct LNode
{
int coef;
int exp;
struct LNode *next;
}* Link;
typedef struct
{
Link head,tail;
int len;
} LinkList;
Link InitList(LinkList &L)
{
int c,e;
Link r;//r相当于*tail
L.head=(LNode *)malloc(LEN);
r=L.head;
//printf("输入系数:");
scanf("%d",&c);
//printf("输入指数:");
scanf("%d",&e);
while(c!=0)
{
L.tail=(LNode *)malloc(LEN);//新节点
L.tail->coef=c;
L.tail->exp=e;
r->next=L.tail;
r=L.tail;
//printf("输入系数:");
scanf("%d",&c);
//printf("输入指数:");
scanf("%d",&e);
}
r->next=NULL;
return (L.head);
}
void free(Link t)
{
t->next=NULL;
}
void Add(Link pa,Link pb)
{
Link p,q,tail,temp;
int sum;
p=pa->next;
q=pb->next;
tail=pa;
while(p!=NULL&&q!=NULL)//有序链表的归并
{
if(p->exp<q->exp)
{
tail->next=p;
tail=p;
p=p->next;
}
else if(p->exp==q->exp)
{
sum=p->coef+q->coef;
if(sum!=0)
{
p->coef=sum;
tail->next=p;
tail=p;
p=p->next;
q=q->next;
}
else
{
temp=p->next;
free(p);
p=temp;
temp=q->next;
free(q);
q=temp;
}
}
else
{
tail->next=q;
tail=q;
q=q->next;
}
}
if(p!=NULL)
tail->next=p;
else
tail->next=q;
}
void print(Link p)
{
while(p->next!=NULL)
{
p=p->next;
if(p->next!=NULL)
printf(" %d*x^%d+",p->coef,p->exp);
else
printf(" %d*x^%d",p->coef,p->exp);
}
}
void main()
{
Link pa,pb;
LinkList ppa,ppb;
printf("\t一元多项式的相加算法!\n");
printf("请分别有序地输入第一个一元多项式的系数和指数,输入为0时为结束!\n");
pa=InitList(ppa);
printf("你输入的多项式为:\n");
print(pa);
printf("\n");
printf("请分别有序地输入第二个一元多项式的系数和指数,输入为0时为结束!\n");
pb=InitList(ppb);
printf("你输入的多项式为:\n");
print(pb);
printf("\n");
printf("两个一元多项式的和为:\n");
Add(pa,pb);
print(pa);
printf("\n");
}
b=8x+22x^7-9x^8
c=A+b=7+11x+22x^7+5x^17
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define LEN sizeof(LNode)
typedef struct LNode
{
int coef;
int exp;
struct LNode *next;
}* Link;
typedef struct
{
Link head,tail;
int len;
} LinkList;
Link InitList(LinkList &L)
{
int c,e;
Link r;//r相当于*tail
L.head=(LNode *)malloc(LEN);
r=L.head;
//printf("输入系数:");
scanf("%d",&c);
//printf("输入指数:");
scanf("%d",&e);
while(c!=0)
{
L.tail=(LNode *)malloc(LEN);//新节点
L.tail->coef=c;
L.tail->exp=e;
r->next=L.tail;
r=L.tail;
//printf("输入系数:");
scanf("%d",&c);
//printf("输入指数:");
scanf("%d",&e);
}
r->next=NULL;
return (L.head);
}
void free(Link t)
{
t->next=NULL;
}
void Add(Link pa,Link pb)
{
Link p,q,tail,temp;
int sum;
p=pa->next;
q=pb->next;
tail=pa;
while(p!=NULL&&q!=NULL)//有序链表的归并
{
if(p->exp<q->exp)
{
tail->next=p;
tail=p;
p=p->next;
}
else if(p->exp==q->exp)
{
sum=p->coef+q->coef;
if(sum!=0)
{
p->coef=sum;
tail->next=p;
tail=p;
p=p->next;
q=q->next;
}
else
{
temp=p->next;
free(p);
p=temp;
temp=q->next;
free(q);
q=temp;
}
}
else
{
tail->next=q;
tail=q;
q=q->next;
}
}
if(p!=NULL)
tail->next=p;
else
tail->next=q;
}
void print(Link p)
{
while(p->next!=NULL)
{
p=p->next;
if(p->next!=NULL)
printf(" %d*x^%d+",p->coef,p->exp);
else
printf(" %d*x^%d",p->coef,p->exp);
}
}
void main()
{
Link pa,pb;
LinkList ppa,ppb;
printf("\t一元多项式的相加算法!\n");
printf("请分别有序地输入第一个一元多项式的系数和指数,输入为0时为结束!\n");
pa=InitList(ppa);
printf("你输入的多项式为:\n");
print(pa);
printf("\n");
printf("请分别有序地输入第二个一元多项式的系数和指数,输入为0时为结束!\n");
pb=InitList(ppb);
printf("你输入的多项式为:\n");
print(pb);
printf("\n");
printf("两个一元多项式的和为:\n");
Add(pa,pb);
print(pa);
printf("\n");
}
相关文章推荐
- model设置属性的封装(存取文件数据,为cell传数据)
- 从OpenCV源码学习cpp_const
- Android的实现文字渐变效果和歌词进度的效果
- 5-14 电话聊天狂人
- 我的第一家实习公司“嘉兴聚变科技有限公司”
- linux top命令中CPU 占用说明
- 安卓圆形TextView实现方法
- sphinx多条件查询
- android高仿京东快报(垂直循环滚动新闻栏)
- Polly
- MATLAB中的S-Function的用法(C语言)
- Java后台如何弹出window的下载对话框
- input file 美化
- [置顶] ActivityManagerService与应用程序通信分析
- Java类的继承----构造器,方法的重载
- Android Studio的Configuring高级配置
- Class.getResourceAsStream(path)与Thread.currentThread().getContextClassLoader().getResourceAsStream
- 遍历删除List中的元素
- POJ 3321 Apple Tree
- react.js 表单验证-登录框