我在多项式中遇到了很多代码,这些代码使用双指针作为参数来创建多项式,在下面的代码中,我有一个问题,为什么要为Node类型的下一个指针创建一个新节点。可能的话,请给我解释一下这段代码的工作。
struct Node
{
int coeff;
int pow;
struct Node *next;
};
// Function to create new node
void create_node(int x, int y, struct Node **temp)
{
struct Node *r, *z;
z = *temp;
if(z == NULL)
{
r =(struct Node*)malloc(sizeof(struct Node));
r->coeff = x;
r->pow = y;
*temp = r;
r->next = (struct Node*)malloc(sizeof(struct Node));
r = r->next;
r->next = NULL;
}
else
{
r->coeff = x;
r->pow = y;
r->next = (struct Node*)malloc(sizeof(struct Node));
r = r->next;
r->next = NULL;
}
}
以这种方式从main调用函数:
struct Node *poly1 = NULL, *poly2 = NULL, *poly = NULL;
// Create first list of 5x^2 + 4x^1 + 2x^0
create_node(5,2,&poly1);
create_node(4,1,&poly1);
create_node(2,0,&poly1);
// Create second list of 5x^1 + 5x^0
create_node(5,1,&poly2);
create_node(5,0,&poly2);
答案 0 :(得分:2)
为什么要为Node类型的下一个指针创建一个新节点。
这仅仅是因为作者感觉像那样做。该代码也可以这样写。但是显示的代码具有不确定的行为,因为127.0.0.1:8000
部分中的r
被取消引用而没有首先初始化,并且很可能是无效的指针值。
一个人将不得不从else
(*temp
-请输入更好的名称)遍历所有现有节点,然后附加一个新节点:
z
答案 1 :(得分:0)
不需要特殊情况;相反,只需使用指针到指针:
void create_node(int x, int y, struct Node **temp)
{
struct Node *this;
this = malloc(sizeof *this);
this->next = *temp; // steal the parent's pointer.
this->coeff = x;
this->pow = y;
*temp = this; // and put ourself in front of it
}
请注意,如果原始列表为空,则* temp将为NULL,并且this-> next也将被设置为NULL。 (这就是我们想要的)