создание полинома с использованием связанного списка и добавление их - PullRequest
0 голосов
/ 22 сентября 2018

Я сталкивался с таким количеством кодов в полиноме, который создает полином с использованием двойных указателей в качестве аргументов, и в следующем коде у меня возник вопрос, почему для следующего указателя типа 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 голосов
/ 22 сентября 2018

Нет необходимости в особых случаях;вместо этого просто используйте указатель на указатель:


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, и это-> Далее также будет установлено значение NULL.(что мы и хотим)

0 голосов
/ 22 сентября 2018

, почему создается новый узел для следующего указателя типа Node.

Это просто потому, что автору хотелось сделать это таким образом.Код также может быть написан так.Но показанный код имеет неопределенное поведение, поскольку r разыменовывается в else -части без предварительной инициализации и, скорее всего, является недопустимым значением указателя.

Приходится переходить от *temp (z - пожалуйста, выберите лучшие имена) через все существующие узлы, а затем добавьте новый узел:

void create_node(int x, int y, struct Node **temp)
{
    struct Node *r, *z;
    z = *temp;
    if (!z)
    {
        r = malloc(sizeof(struct Node)); // do not cast the result of malloc()!
        r->coeff = x;
        r->pow = y;
        r->next = 0;
        *temp = r;
    }
    else
    {
        r = z;
        while (r->next)
            r = r->next;

        r->next = malloc(sizeof(struct Node));
        r = r->next;
        r->coeff = x;
        r->pow = y;
        r->next = 0;
    }
}
...