标签:struct 第一个 sizeof ror type nod define size turn
多项式相加有很多种实现方法。
不怕浪费空间的可以用数组,数组下标当作指数;
结构可以同时存储指数和系数,但要开辟新的空间存放比较后相加的结果;
链表可以和结构一样使用,开辟新链表,不断释放旧的链表;
这里介绍一种直接利用两个链表的结点,以一个链表为基准,将另外一个链表的结点选择性加入,同时释放系数为0没用的结点。
#define ERROR 0
#define OK 1
typedef struct Node
{
int coef;//系数
int exp;//指数
struct Node* PNext;
}Node;
typedef Node* PNode;
int InsertLine(PNode TrvP, int n, int coef,int exp)//在第n位置插入一个结点
{
int i = 0;
while (TrvP && i < n - 1)
{
TrvP = TrvP->PNext;
i++;
}
if (!TrvP || i > n - 1) return ERROR;
Node* InsertNode = (Node*)malloc(sizeof(Node));
InsertNode->coef = coef;
InsertNode->exp = exp;
InsertNode->PNext = TrvP->PNext;
TrvP->PNext = InsertNode;
}
//以第一个链表为基准,将第二个链表选择性插入,这样不用开辟新的空间,
void add_poly(PNode HNode1, PNode HNode2)
{
PNode q1=HNode1->PNext, q2=HNode2->PNext;
PNode Ans = HNode1;//指向q1前一个元素,用于随时转移到来自q2的结点
PNode temp;//过渡性,用于释放空间
while (q1 && q2)
{
if (q1->exp == q2->exp)
{
int x = q1->coef + q2->coef;
if (x)
{
q1->coef = x;
Ans = q1;
q1 = q1->PNext;
temp = q2; q2 = q2->PNext; free(temp);
}
else//系数和为0,释放掉两个空间
{
Ans->PNext = q1->PNext;
temp = q1; q1 = q1->PNext; free(temp);
temp = q2; q2 = q2->PNext; free(temp);
}
}
else if(q1->exp<q2->exp)
{
Ans = q1; q1 = q1->PNext;
}
else//q2结点并入q1
{
Ans->PNext = q2; Ans = q2;
q2 = q2->PNext;
Ans->PNext = q1;
}
}
if (q2)//若q2有余,直接挂到Ans末尾
{
Ans->PNext = q2;
}
}
int main()
{
PNode HNode1, HNode2;
HNode1 = (PNode)malloc(sizeof(Node));
HNode2 = (PNode)malloc(sizeof(Node));
HNode1->PNext = NULL;
HNode2->PNext = NULL;
InsertLine(HNode1, 1, 7, 0);
InsertLine(HNode1, 2, 3, 1);
InsertLine(HNode1, 3, 9, 8);
InsertLine(HNode1, 4, 5, 17);
InsertLine(HNode2, 1, -3, 1);
InsertLine(HNode2, 2, 22, 7);
InsertLine(HNode2, 3, -9, 8);
add_poly(HNode1, HNode2);
for (PNode p = HNode1->PNext; p; p = p->PNext) printf("%d %d\n", p->coef, p->exp);
}
标签:struct 第一个 sizeof ror type nod define size turn
原文地址:https://www.cnblogs.com/tzp-empty-hya/p/14534885.html