**易错点:**cur = head->next并不意味着这两个指针进行了绑定,即改变cur就会改变head->next,二者只是指向了同一个空间;
如果两个都是二级指针,则对cur操作等价于对head->next操作;
故cur=head后,对cur->next操作等价于对head->next操作
#include <stdio.h>
#include <stdlib.h>
struct node_st
{
int cef;
int exp;
struct node_st *next;
};
struct node_st* poly_create(int (*arr)[2], int n)
{
struct node_st *head, *cur;
struct node_st *newnode;
head = (struct node_st*)malloc(sizeof(struct node_st));
if(NULL == head)
return NULL;
head->next = NULL;
//cur = head->next; 方法不可行,因为cur和me->next的指向并没有绑定,两个只是指向了同一个空间
cur = head;
int i;
for(i = 0; i < n; i++)
{
newnode = (struct node_st*)malloc(sizeof(struct node_st));
if(NULL == newnode)
return NULL; // 不合理,未考虑前面分配成功节点的释放
newnode->cef = arr[i][0];
newnode->exp = arr[i][1];
newnode->next = NULL;
//cur = newnode;
cur->next = newnode;
cur = cur->next;
}
return head;
}
void poly_show(struct node_st *head)
{
struct node_st *cur;
cur = head->next;
while(cur != NULL)
{
printf("(%d %d) ", cur->cef, cur->exp);
cur = cur->next;
}
printf("\n");
}
int poly_union(struct node_st *poly1, struct node_st *poly2)
{
struct node_st *p, *q, *cur;
p = poly1->next;
q = poly2->next;
cur = poly1;
/*
if(NULL == p && NULL == q)
return -1;
if(NULL == p)
{
p = q;
}
if(NULL == q)
return 0;
*/
while(p != NULL && q != NULL)
{
if(p->exp < q->exp)
{
cur->next = p;
cur = p;
p = p->next;
}
else if(p->exp > q->exp)
{
cur->next = q;
cur = q;
q = q->next;
}
else
{
if(p->cef += q->cef)
{
cur->next = p;
cur = p;
p = p->next;
q = q->next;
}
else
{
p = p->next;
q = q->next;
}
}
}
if(p == NULL)
cur->next = q;
else
cur->next = p;
}
int main()
{
int arr1[][2] = {{5, 0}, {2, 1}, {-8, 8}, {3, 16}};
int arr2[][2] = {{6, 1}, {16, 6}, {8, 8}};
struct node_st *poly1, *poly2;
poly1 = poly_create(arr1, 4);
if(NULL == poly1)
printf("error\n");
poly2 = poly_create(arr2, 3);
if(NULL == poly1)
printf("error\n");
poly_show(poly1);
poly_show(poly2);
poly_union(poly1, poly2);
poly_show(poly1);
return 0;
}