有头单向链表实现多项式合并

来源:互联网 发布:js事件追踪代码布局 编辑:程序博客网 时间:2024/06/07 19:00
#include <stdio.h>
#include <stdlib.h>





struct node_st
{
int coef;
int exp;
structnode_st *next;
};


struct node_st *poly_create(int a[][2], int n)
{
int i;
struct node_st *node;
struct node_st *newnode, *cur;

node = malloc(sizeof(*node));
if(node == NULL)
return NULL;

node->next = NULL;

cur = node;
for(i = 0; i < n; i++)
{
newnode = malloc(sizeof(*newnode));
if(newnode == NULL)
return NULL;
newnode->coef = a[i][0];
newnode->exp = a[i][1];
newnode->next = NULL;

cur->next = newnode;
cur = newnode;
}
return node;
}


void poly_show(struct node_st *node)
{
struct node_st *cur;

for(cur = node->next; cur != NULL; cur = cur->next)
{
printf("(%d %d) ", cur->coef, cur->exp);
}
printf("\n");
}


void poly_union(struct node_st *p1, struct node_st *p2)
{
struct node_st *p, *q, *r;

p = p1->next;
q = p2->next;
r = p1;

while(p && q)
{
if(p->exp < q->exp)
{
r->next = p;
r = p;
p = p->next;
}
else if(p->exp > q->exp)
{
r->next = q;
r = q;
q = q->next;
}
else
{
p->coef += q->coef;
if(p->coef)
{
r->next = p;
r = p;
}
p = p->next;
q = q->next;
}
}

if(p == NULL)
r->next = q;
else
r->next = p;

}


int main(int argc, char *argv[]) {


int a[][2]={{5,0},{2,1},{8,8},{3,16}};
int b[][2] ={{6,1},{16,6},{-8,8}};
struct node_st *p1, *p2;

p1 = poly_create(a,4);
if(p1 == NULL)
return -1;
p2 = poly_create(b,3);
if(p2 == NULL)
return -2;

poly_show(p1);
poly_show(p2);

poly_union(p1, p2);
poly_show(p1);

return 0;
}
原创粉丝点击