单链表实现一元多项式相加
2017-11-25 09:37
471 查看
# include <stdio.h>
# include <malloc.h>
# include <stdlib.h>
typedef struct LNode
{
int coef;
int exp;
struct LNode *next;
}node;
node *Createlist()//创建一元多项式链表
{
node *head,*middle,*s;//新定义三个链表head作为返回,middle作为中间变量,s为新插入项;
int coef, exp;
head = (node *)malloc(sizeof(node));
if (!head)
{
exit(-1);
}
head->next = NULL;
middle = head;
printf("请输入每一项的系数和指数:");
scanf("%d%d",&coef,&exp);
while (!((coef==0)&&(exp==0)))//当系数和指数都为0时,多项式结束
{
s = (node *)malloc (sizeof(node));
if (!s)
{
exit(-1);
}
s->coef = coef;
s->exp = exp;
s->next = middle->next;
middle->next = s;
middle = s;
printf("请继续输入:");
scanf("%d%d",&coef,&exp);
}
return head;
}
void Listadd(node *listya, node *listyb)//ya=a1*x^t1+a2*x^t2;yb=b1*x^n1+b2*x^n2
{
node *p, *q, *pre, *temp;
int sum = 0;;
p = listya->next;
q = listyb->next;
pre = listya;
while (p && q)
{
if (p->exp < q->exp)
{
pre->next = p;
pre = p;
p = p->next;
}
else if (p->exp > q->exp)
{
pre->next = q;
pre = q;
q = q->next;
}
else
{
sum = p->coef + q->coef;
if (sum)
{
p->coef = sum;
pre->next = p;
pre = p;
p = p->next;
temp = q->next;
free(q); //将yb链中相应项释放掉,和放到ya链中
q = temp;
}
else
{
temp = p->next;
free(p);
p = temp;
temp = q->next;
free(q);
q = temp;
}
}
}
pre->next = p?p:q;
}
int Print(node *h)
{
node *p = h->next;
if(p)
{
printf("%d*x^%d",p->coef, p->exp);
p=p->next;
}
while (p)
{
printf("+%d*x^%d",p->coef, p->exp);
p = p->next;
}
printf("\n");
return 1;
}
int main()
{
node *listya, *listyb;
printf("输入结束标志位系数和指数同为0 \n");
printf("请输入第一个一元多项式的系数和指数\n");
listya = Createlist();
printf("你输入的第一个一元多项式为:");
Print(listya);
printf("请输入第二个一元多项式的系数和指数\n");
listyb = Createlist();
printf("你输入的第二个一元多项式为:");
Print(listyb);
printf("两个一元多项式相加后的结果为:");
Listadd(listya, listyb);
Print(listya);
return 1;
}
# include <malloc.h>
# include <stdlib.h>
typedef struct LNode
{
int coef;
int exp;
struct LNode *next;
}node;
node *Createlist()//创建一元多项式链表
{
node *head,*middle,*s;//新定义三个链表head作为返回,middle作为中间变量,s为新插入项;
int coef, exp;
head = (node *)malloc(sizeof(node));
if (!head)
{
exit(-1);
}
head->next = NULL;
middle = head;
printf("请输入每一项的系数和指数:");
scanf("%d%d",&coef,&exp);
while (!((coef==0)&&(exp==0)))//当系数和指数都为0时,多项式结束
{
s = (node *)malloc (sizeof(node));
if (!s)
{
exit(-1);
}
s->coef = coef;
s->exp = exp;
s->next = middle->next;
middle->next = s;
middle = s;
printf("请继续输入:");
scanf("%d%d",&coef,&exp);
}
return head;
}
void Listadd(node *listya, node *listyb)//ya=a1*x^t1+a2*x^t2;yb=b1*x^n1+b2*x^n2
{
node *p, *q, *pre, *temp;
int sum = 0;;
p = listya->next;
q = listyb->next;
pre = listya;
while (p && q)
{
if (p->exp < q->exp)
{
pre->next = p;
pre = p;
p = p->next;
}
else if (p->exp > q->exp)
{
pre->next = q;
pre = q;
q = q->next;
}
else
{
sum = p->coef + q->coef;
if (sum)
{
p->coef = sum;
pre->next = p;
pre = p;
p = p->next;
temp = q->next;
free(q); //将yb链中相应项释放掉,和放到ya链中
q = temp;
}
else
{
temp = p->next;
free(p);
p = temp;
temp = q->next;
free(q);
q = temp;
}
}
}
pre->next = p?p:q;
}
int Print(node *h)
{
node *p = h->next;
if(p)
{
printf("%d*x^%d",p->coef, p->exp);
p=p->next;
}
while (p)
{
printf("+%d*x^%d",p->coef, p->exp);
p = p->next;
}
printf("\n");
return 1;
}
int main()
{
node *listya, *listyb;
printf("输入结束标志位系数和指数同为0 \n");
printf("请输入第一个一元多项式的系数和指数\n");
listya = Createlist();
printf("你输入的第一个一元多项式为:");
Print(listya);
printf("请输入第二个一元多项式的系数和指数\n");
listyb = Createlist();
printf("你输入的第二个一元多项式为:");
Print(listyb);
printf("两个一元多项式相加后的结果为:");
Listadd(listya, listyb);
Print(listya);
return 1;
}
相关文章推荐
- 线性表之单链表实现一元多项式相加,求值,求导
- 利用单链表实现一元多项式的表示及相加
- (链表实现)写出两个一元多项式相加的算法
- (链表实现)写出两个一元多项式相加的算法
- 一道 google曾出过的笔试题:编程实现对数学一元多项式的相加和相乘操作(1)
- 利用栈实现两个一元多项式相加
- (链表实现)写出两个一元多项式相加的算法
- 数据结构(12)线性表之C++实现一元多项式相加
- 算法:一元多项式的表示及相加(链表实现)-数据结构(4)
- 两个一元多项式相加(链表 || 顺序表实现)
- 用单链表实现一元多项式相加 C++代码
- 单链表实现多项式相加
- 一元多项式的相加 数据结构链表实现
- 一元多项式加法——单链表实现
- java单链表实现一元多项式加法和乘法运算
- 一元多项式相加,链表存储实现 ,不使用头结点
- 基于单链表实现一元n次多项式的创建、输出和求和操作
- PHP数据结构之四 一元多项式的相加PHP单链实现
- 一元多项式的表示及相加(抽象数据类型Polynomial的实现)
- Java单链表实现多项式相加、多种方式实现约瑟夫环