一元n次多项式的加法(单链表实现)
下面展示一些 代码
。
首先是单链表结构体的定义
typedef struct LNode
{
int Base_number;
int Index_number;
struct LNode *Next;
}LNode,*LinkList;
typedef 将 struct LNode 的名字重定义成 LNode,将指向LNode的指针重定义成LinkList。
以下是用到的一些函数。
void Creat(LinkList &polynomial); //根据输入的值来创建单链表保存多项式
void Print(LinkList polynomial);//输出加完后的多项式
int Conmpare(int x, int y);//比较两个多项式中某个项的次数大小,后面用switch语句区别三种不同的大小情况
void Attach(int x, int y, LinkList *p);将某一项添加到保存最终结果的单链表中。
LinkList add(LinkList p1, LinkList p2);核心方法,实现加法
下面给出他们各自的定义
void Creat(LinkList &polynomial)
{
int base,index;
LinkList p,q;
polynomial = new LNode;
polynomial -> Next = NULL;
p = polynomial;
cout <<"输入项式,按(0,0)结束";
int x,y;
scanf("%d,%d",&x,&y) ; //这里用scanf函数可以轻松实现 输入0,0类型的数据
while (x!= 0 || y != 0)
{
q = new LNode;
q -> Base_number = x;
q -> Index_number = y;
q -> Next = NULL;
p -> Next = q;
p = q;
scanf("%d,%d",&x,&y) ;
}
}
之前学的只学过cin语句,但在这里用cin的话,没法实现x,y形式的输入。
下面列一下scanf的基础知识:
scanf的基本格式:scanf(格式控制, 地址列表);
int a; scanf(“%d”,&a);
int a,b; scanf(“%d%d”,&a,&b);
输入的数据之间可以是空格、制表符、回车符,也可以三者混合。(这里就是用到了这个特点)
void Print(LinkList polynomial)
{
LinkList r;
r = polynomial -> Next;
while (r)
{
if(r -> Next != NULL) //解决了最后一项后面还加符号的问题
cout<< r -> Base_number <<"x"<<"^"<< r -> Index_number <<"+";
else
cout<<r -> Base_number <<"x"<<"^"<<r -> Index_number;
r = r-> Next;
}
}
void Attach(int x, int y, LinkList *p) //传递的是p的指针,p也是指针,最后传递的是指针的指针,这么做是因为c语言是函数值传递
{
LinkList q;
q = new LNode; //新生成一个节点q,来存一项多项式
q -> Base_number = x;
q -> Index_number =y;
q -> Next =NULL;
(*p) -> Next = q; //新生成的结点q插到p的后面
*p = q;
}
LinkList add(LinkList p1, LinkList p2) //这是最关键的函数
{
LinkList front,rear,temp;
int sum;
int Compare(int x, int y);
rear = new LNode;
front = rear;
while(p1 != NULL && p2 != NULL)
{
switch (Compare(p1 -> Index_number , p2 -> Index_number)) //使用switch分支判断不同的情况
{
case 1 :
Attach (p1 -> Base_number, p1 -> Index_number, &rear); //这里&rear中的&是取地址运算符,将rear的地址传递进去,可以改变rear的值。
p1 = p1 -> Next;
break;
case 0 :
sum =p1 -> Base_number + p2 -> Base_number;
if (sum != 0) Attach(sum, p1 -> Index_number, &rear);
p1 = p1 -> Next;
p2 = p2 -> Next;
break;
case -1 :
Attach (p2 -> Base_number, p2 -> Index_number, &rear);
p2 = p2 -> Next;
break;
}
}
//出while循环后,如果p1或者p2还有项,则应该直接输出
for (; p1; p1 = p1 -> Next) Attach(p1 -> Base_number, p1 -> Index_number, &rear);
for (; p2; p2 = p2 -> Next) Attach(p2 -> Base_number, p2 -> Index_number, &rear);
rear -> Next = NULL;
temp = front;
front = front -> Next;
delete (temp);
return front;
}
下面是完整代码
#include <iostream>
using namespace std;
typedef struct LNode
{
int Base_number;
int Index_number;
struct LNode *Next;
}LNode,*LinkList;
// 创建单链表储存多项式
void Creat(LinkList &polynomial)
{
int base,index;
LinkList p,q;
polynomial = new LNode;
polynomial -> Next = NULL;
p = polynomial;
cout <<"输入项式,按(0,0)结束";
int x,y;
cin >> x >>y;
while (x!= 0 || y != 0)
{
q = new LNode;
q -> Base_number = x;
q -> Index_number = y;
q -> Next = NULL;
p -> Next = q;
p = q;
cin >> x >>y;
}
}
//输出多项式,将最终的多项式进行输出
void Print(LinkList polynomial)
{
LinkList r;
r = polynomial -> Next;
while (r)
{
if(r -> Next != NULL)
cout<< r -> Base_number <<"x"<<"^"<< r -> Index_number <<"+";
else
cout<<r -> Base_number <<"x"<<"^"<<r -> Index_number;
r = r-> Next;
}
}
int Compare(int x, int y) //用来比较指数的大小
{
if (x > y) return 1;
if (x == y) return 0;
if(x < y) return -1;
}
void Attach(int x, int y, LinkList *p)
{
LinkList q;
q = new LNode;
q -> Base_number = x;
q -> Index_number =y;
q -> Next =NULL;
(*p) -> Next = q;
*p = q;
}
LinkList add(LinkList p1, LinkList p2)
{
LinkList front,rear,temp;
int sum;
int Compare(int x, int y);
rear = new LNode;
front = rear;
while(p1 != NULL && p2 != NULL)
{
switch (Compare(p1 -> Index_number , p2 -> Index_number))
{
case 1 :
Attach (p1 -> Base_number, p1 -> Index_number, &rear);
p1 = p1 -> Next;
break;
case 0 :
sum =p1 -> Base_number + p2 -> Base_number;
if (sum != 0) Attach(sum, p1 -> Index_number, &rear);
p1 = p1 -> Next;
p2 = p2 -> Next;
break;
case -1 :
Attach (p2 -> Base_number, p2 -> Index_number, &rear);
p2 = p2 -> Next;
break;
}
}
for (; p1; p1 = p1 -> Next) Attach(p1 -> Base_number, p1 -> Index_number, &rear);
for (; p2; p2 = p2 -> Next) Attach(p2 -> Base_number, p2 -> Index_number, &rear);
rear -> Next = NULL;
temp = front;
front = front -> Next;
delete (temp);
return front;
}
int main()
{
LinkList p,p1,p2; //p用来保存最后输出的多项式,p1p2分别保存输入的两个多项式
void Creat(LinkList &polynomial);
void Print(LinkList polynomial);
int Conmpare(int x, int y);
void Attach(int x, int y, LinkList *p);
LinkList add(LinkList p1, LinkList p2);
Creat(p1);
Creat(p2);
p = add(p1, p2);
Print(p);
return 0;
}