使用链表创建多项式并将其添加

时间:2018-09-22 08:41:25

标签: c data-structures linked-list polynomials

我在多项式中遇到了很多代码,这些代码使用双指针作为参数来创建多项式,在下面的代码中,我有一个问题,为什么要为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); 

2 个答案:

答案 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。 (这就是我们想要的)