69,382
社区成员
发帖
与我相关
我的任务
分享
struct PolyNode
{
int coef; // 系数
int expon; // 指数
struct PolyNode *link; // 指向下一节点的指针
};
typedef struct PolyNode *Polynomial;
Polynomial P1, P2;
Polynomial PolyAdd(Polynomial P1, Polynomial P2)
{
Polynomial front, rear, temp;
int sum;
rear = (Polynomial)malloc(sizeof(struct PolyNode));
front = rear;
while (P1 && P2)
{
switch (Compare(P1->expon, P2->expon))
{
case 1:
Attach(P1->coef, P1->expon, &rear);
// Attach()将系数、指数形成新的项,拷贝到rear的后面
P1 = P1->link;
break;
case -1:
Attach(P2->coef, P2->expon, &rear);
P2 = P2->link;
case 0:
sum = P1->coef + P2->coef;
if (sum)
Attach(sum, P1->expon, &rear);
P1 = P1->link;
P2 = P2->link;
break;
}
}
}
pRear->link = P;
// 这句话本身是没有问题的,可以对 link 进行赋值
pRear=P;
// 但是这句话就不能起到赋值的效果,因为:
// 0. 调用 Attach(P1->coef, P1->expon, rear) 时,将rear的值(因为`rear`是一个指针,所以其值是一个地址变量)赋值一份,给局部变量pRear赋上
// 1. 此时 pRear 中保存地址变量,但其本身并不是指向 *rear 的指针;
// 2. 换句话说,如果 pRear 的值改变,那么不对 rear 造成影响。
// 3. 因此,想要改变 rear 的值,应该将 rear 的地址传入,而非将其本身。
总结起来就是:
A 是 B 的指针,B 是 C 的指针,在函数调用中,想改变C的值,需要将&C(即B)传入,想改变B的值,需要将&B(即A)传入。
函数调用中,改变变量的值,对其指针进行操作;改变指针的值,对指针的指针进行操作。
void Attach(int c, int e, Polynomial *pRear){
Polynomial P;
P = (Polynomial)malloc(sizeof(struct PolyNode));
P->coef=c;
P->expon=e;
P->link = NULL;
(*pRear)->link = P;
*pRear=P;
}